[alsa-devel] [PATCH][RFC] ASoC: soc.h: add sound dai_link connection macro

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Mon May 13 15:47:30 CEST 2019


Sorry about the delays in reviewing.

> +/*
> + * Sample 1 : Single CPU/Codec/Platform
> + *
> + * SND_SOC_DAILINK_DEFS(test,
> + *	DAILINK_COMPONENT_ARRAY(COMPONENT_FE("cpu_dai")),
> + *	DAILINK_COMPONENT_ARRAY(COMPONENT_BE("codec", "codec_dai")),
> + *	DAILINK_COMPONENT_ARRAY(COMPONENT_DMA("platform")));

the syntax looks fine, but the _FE/_BE/_DMA suffix is a bit misleading. 
The _FE in the examples is actually a DPCM BE, and the _BE is really a 
codec which isn't related to DPCM at all, and platform has typically 
nothing to do with DMA?

Why not keep the initial conventions and use e.g. COMPONENT_CPU, 
COMPONENT_CODEC, COMPONENT_PLATFORM to avoid introducing new concepts? 
If it's starting to be too many letters, then we can use the COMP 
acronym e.g DAILINK_COMP_ARRAY(COMP_CPU("cpu_dai"))

Thanks
-Pierre




> + *
> + * struct snd_soc_dai_link link = {
> + *	...
> + *	SND_SOC_DAILINK_REG(test),
> + * };
> + *
> + * Sample 2 : Multi CPU/Codec, no Platform
> + *
> + * SND_SOC_DAILINK_DEFS(test,
> + *	DAILINK_COMPONENT_ARRAY(COMPONENT_FE("cpu_dai1"),
> + *				COMPONENT_FE("cpu_dai2")),
> + *	DAILINK_COMPONENT_ARRAY(COMPONENT_BE("codec1", "codec_dai1"),
> + *				COMPONENT_BE("codec2", "codec_dai2")));
> + *
> + * struct snd_soc_dai_link link = {
> + *	...
> + *	SND_SOC_DAILINK_REG(test),
> + * };
> + *
> + * Sample 3 : Define each CPU/Codec/Platform manually
> + *
> + * SND_SOC_DAILINK_DEF(test_cpu,
> + *		DAILINK_COMPONENT_ARRAY(COMPONENT_FE("cpu_dai1"),
> + *					COMPONENT_FE("cpu_dai2")));
> + * SND_SOC_DAILINK_DEF(test_codec,
> + *		DAILINK_COMPONENT_ARRAY(COMPONENT_BE("codec1", "codec_dai1"),
> + *					COMPONENT_BE("codec2", "codec_dai2")));
> + * SND_SOC_DAILINK_DEF(test_platform,
> + *		DAILINK_COMPONENT_ARRAY(COMPONENT_DMA("platform")));
> + *
> + * struct snd_soc_dai_link link = {
> + *	...
> + *	SND_SOC_DAILINK_REG(test_cpu,
> + *			    test_codec,
> + *			    test_platform),
> + * };
> + *
> + * Sample 4 : Sample3 without platform
> + *
> + * struct snd_soc_dai_link link = {
> + *	...
> + *	SND_SOC_DAILINK_REG(test_cpu,
> + *			    test_codec);
> + * };
> + */
> +
> +#define SND_SOC_DAILINK_REG1(name)	 SND_SOC_DAILINK_REG3(name##_cpus, name##_codecs, name##_platforms)
> +#define SND_SOC_DAILINK_REG2(cpu, codec) SND_SOC_DAILINK_REG3(cpu, codec, null_dailink_component)
> +#define SND_SOC_DAILINK_REG3(cpu, codec, platform)	\
> +	.cpus		= cpu,				\
> +	.num_cpus	= ARRAY_SIZE(cpu),		\
> +	.codecs		= codec,			\
> +	.num_codecs	= ARRAY_SIZE(codec),		\
> +	.platforms	= platform,			\
> +	.num_platforms	= ARRAY_SIZE(platform)
> +
> +#define SND_SOC_DAILINK_REGx(_1, _2, _3, func, ...) func
> +#define SND_SOC_DAILINK_REG(...) \
> +	SND_SOC_DAILINK_REGx(__VA_ARGS__,		\
> +			SND_SOC_DAILINK_REG3,	\
> +			SND_SOC_DAILINK_REG2,	\
> +			SND_SOC_DAILINK_REG1)(__VA_ARGS__)
> +
> +#define SND_SOC_DAILINK_DEF(name, def...)		\
> +	static struct snd_soc_dai_link_component name[]	= { def }
> +
> +#define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...)	\
> +	SND_SOC_DAILINK_DEF(name##_cpus, cpu);			\
> +	SND_SOC_DAILINK_DEF(name##_codecs, codec);		\
> +	SND_SOC_DAILINK_DEF(name##_platforms, platform)
> +
> +#define DAILINK_COMPONENT_ARRAY(param...)	param
> +#define COMPONENT_EMPTY()			{ }
> +#define COMPONENT_FE(_dai)			{ .dai_name = _dai, }
> +#define COMPONENT_BE(_name, _dai)		{ .name = _name, .dai_name = _dai, }
> +#define COMPONENT_DMA(_name)			{ .name = _name }
> +#define COMPONENT_DUMMY()			{ .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
> +
> +extern struct snd_soc_dai_link_component null_dailink_component[0];
> +
> +
>   struct snd_soc_codec_conf {
>   	/*
>   	 * specify device either by device name, or by
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index f6765b0..dd0c625 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -58,6 +58,12 @@ static LIST_HEAD(unbind_card_list);
>   	list_for_each_entry(component, &component_list, list)
>   
>   /*
> + * This is used if driver don't need to have CPU/Codec/Platform
> + * dai_link. see soc.h
> + */
> +struct snd_soc_dai_link_component null_dailink_component[0];
> +
> +/*
>    * This is a timeout to do a DAPM powerdown after a stream is closed().
>    * It can be used to eliminate pops between different playback streams, e.g.
>    * between two audio tracks.
> 


More information about the Alsa-devel mailing list