[alsa-devel] [PATCH 09/10] ASoC: soc-pcm: care Multi Codec at soc_dpcm_fe_runtime_update()

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Thu Feb 13 17:10:16 CET 2020



On 2/12/20 10:26 PM, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> 
> soc_dpcm_fe_runtime_update() doesn't care Multi Codec now.
> We need to care it. This patch fixup it.

Humm, maybe a stupid question but for my education is there an actual 
case where a front-end dailink uses more that one codec_dai? All the 
examples I see for Intel rely on COMP_DUMMY().

> 
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
> ---
>   sound/soc/soc-pcm.c | 24 ++++++++++++++++++------
>   1 file changed, 18 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index 95fe915f26b0..962fe6cb7d3e 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -2614,8 +2614,10 @@ static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
>   
>   static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
>   {
> +	struct snd_soc_dai *codec_dai;
>   	struct snd_soc_dapm_widget_list *list;
>   	int count, paths;
> +	int i;
>   
>   	if (!fe->dai_link->dynamic)
>   		return 0;
> @@ -2629,13 +2631,18 @@ static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
>   		new ? "new" : "old", fe->dai_link->name);
>   
>   	/* skip if FE doesn't have playback capability */
> -	if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_PLAYBACK) ||
> -	    !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_PLAYBACK))
> +	if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_PLAYBACK))
>   		goto capture;
> +	for_each_rtd_codec_dai(fe, i, codec_dai)
> +		if (!snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK))
> +			goto capture;
>   
>   	/* skip if FE isn't currently playing */
> -	if (!fe->cpu_dai->playback_active || !fe->codec_dai->playback_active)
> +	if (!fe->cpu_dai->playback_active)
>   		goto capture;
> +	for_each_rtd_codec_dai(fe, i, codec_dai)
> +		if (!codec_dai->playback_active)
> +			goto capture;
>   
>   	paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list);
>   	if (paths < 0) {
> @@ -2660,13 +2667,18 @@ static int soc_dpcm_fe_runtime_update(struct snd_soc_pcm_runtime *fe, int new)
>   
>   capture:
>   	/* skip if FE doesn't have capture capability */
> -	if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_CAPTURE) ||
> -	    !snd_soc_dai_stream_valid(fe->codec_dai, SNDRV_PCM_STREAM_CAPTURE))
> +	if (!snd_soc_dai_stream_valid(fe->cpu_dai,   SNDRV_PCM_STREAM_CAPTURE))
>   		return 0;
> +	for_each_rtd_codec_dai(fe, i, codec_dai)
> +		if (!snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE))
> +			return 0;
>   
>   	/* skip if FE isn't currently capturing */
> -	if (!fe->cpu_dai->capture_active || !fe->codec_dai->capture_active)
> +	if (!fe->cpu_dai->capture_active)
>   		return 0;
> +	for_each_rtd_codec_dai(fe, i, codec_dai)
> +		if (!codec_dai->capture_active)
> +			return 0;
>   
>   	paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list);
>   	if (paths < 0) {
> 


More information about the Alsa-devel mailing list