[alsa-devel] [PATCH] ASoC: dapm: Don't add prefix to widget stream name

Koro Chen koro.chen at mediatek.com
Tue Jul 21 15:54:52 CEST 2015


On Tue, 2015-07-21 at 11:51 +0200, Lars-Peter Clausen wrote:
> Commit fdb6eb0a1287 ("ASoC: dapm: Modify widget stream name according to
> prefix") fixed the case where a DAPM route between a DAI widget and a
> DAC/ADC/AIF widget with a matching stream name was not created when the
> DAPM context was using a prefix.
> 
> Unfortunately the patch introduced a few issues on its own like leaking the
> dynamically allocated stream name memory and also not checking whether the
> allocation succeeded in the first place.
> 
> It is also incomplete in that it still does not handle the case where
> stream name of the widget is a substring of the stream name of the DAI,
> which is explicitly allowed and works fine if no DAPM prefix is used.
> 
I think your solution looks reasonable. 
However, just curious, why didn't we use strstr(dai_w->name, w->sname)
in the first place? This allows stream name can be without prefix, and
also stream name can be a substring of DAI stream name.

> Revert the commit and take a slightly different approach to solving the
> issue. Instead of comparing the widget's stream name to the name of the DAI
> widget compare it to the stream name of the DAI widget. The stream name of
> the DAI widget is identical to the name of the DAI widget except that it
> wont have the DAPM prefix added. So this approach behaves identical
> regardless to whether the DAPM context uses a prefix or not.
> 
> We don't have to worry about potentially matching with a widget with the
> same stream name, but from a different DAPM context with a different
> prefix, since the code already makes sure that both the DAI widget and the
> matched widget are from the same DAPM context.
> 
> Fixes: fdb6eb0a1287 ("ASoC: dapm: Modify widget stream name according to prefix")
> Signed-off-by: Lars-Peter Clausen <lars at metafoo.de>
> ---
>  sound/soc/soc-dapm.c | 12 +++---------
>  1 file changed, 3 insertions(+), 9 deletions(-)
> 
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index 1628f0c..1992568 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -3344,16 +3344,10 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
>  	}
>  
>  	prefix = soc_dapm_prefix(dapm);
> -	if (prefix) {
> +	if (prefix)
>  		w->name = kasprintf(GFP_KERNEL, "%s %s", prefix, widget->name);
> -		if (widget->sname)
> -			w->sname = kasprintf(GFP_KERNEL, "%s %s", prefix,
> -					     widget->sname);
> -	} else {
> +	else
>  		w->name = kasprintf(GFP_KERNEL, "%s", widget->name);
> -		if (widget->sname)
> -			w->sname = kasprintf(GFP_KERNEL, "%s", widget->sname);
> -	}
>  	if (w->name == NULL) {
>  		kfree(w);
>  		return NULL;
> @@ -3802,7 +3796,7 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
>  				break;
>  			}
>  
> -			if (!w->sname || !strstr(w->sname, dai_w->name))
> +			if (!w->sname || !strstr(w->sname, dai_w->sname))
>  				continue;
>  
>  			if (dai_w->id == snd_soc_dapm_dai_in) {




More information about the Alsa-devel mailing list