[PATCH] ASoC: soc-dai: pull out be_hw_params_fixup from snd_soc_dai_hw_params

Gyeongtaek Lee gt82.lee at samsung.com
Tue May 12 06:47:11 CEST 2020


On 5/12/20 03:47 AM, Pierre-Louis Bossart wrote:
>On 5/10/20 10:31 PM, Gyeongtaek Lee wrote:
>> When dpcm_be_dai_hw_params() called, be_hw_params_fixup() callback is
>> called with same arguments 3times.
>> It is called in be_hw_params_fixup() itself and in soc_pcm_hw_params()
>> for cpu dai and codec dai.
>> Tested in 5.4.
>> 
>> Signed-off-by: Gyeongtaek Lee <gt82.lee at samsung.com>
>> Cc: stable at vger.kernel.org
>> ---
>>   sound/soc/soc-dai.c  | 12 ------------
>>   sound/soc/soc-dapm.c | 11 +++++++++++
>>   2 files changed, 11 insertions(+), 12 deletions(-)
>> 
>> diff --git a/sound/soc/soc-dai.c b/sound/soc/soc-dai.c
>> index 31c41559034b..4785cb6b336f 100644
>> --- a/sound/soc/soc-dai.c
>> +++ b/sound/soc/soc-dai.c
>> @@ -257,20 +257,8 @@ int snd_soc_dai_hw_params(struct snd_soc_dai *dai,
>>   			  struct snd_pcm_substream *substream,
>>   			  struct snd_pcm_hw_params *params)
>>   {
>> -	struct snd_soc_pcm_runtime *rtd = substream->private_data;
>>   	int ret;
>>   
>> -	/* perform any topology hw_params fixups before DAI  */
>> -	if (rtd->dai_link->be_hw_params_fixup) {
>> -		ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
>> -		if (ret < 0) {
>> -			dev_err(rtd->dev,
>> -				"ASoC: hw_params topology fixup failed %d\n",
>> -				ret);
>> -			return ret;
>> -		}
>> -	}
>> -
>
>Sorry I don't get this change.
>
>If the be_hw_params_fixup() callback is called three times, it's because 
>the soc_soc_dai_hw_params() routine is called three times, so what is 
>the problem here?
>
>Also the comment is explicit about doing fixups before calling the dai 
>hw_params() callback, so that is not longer the case with this change? 
>Even if the change was legit, the comment is no longer relevant and 
>should be updated.
>
Sorry, the comment was too short and inexact to explain the intention of the patch.
When dpcm_be_dai_hw_params() called, be_hw_params_fixup() is called three times
with same substream and params in dpcm_be_dai_hw_params() and
snd_soc_dai_hw_params() in soc_pcm_hw_params() for cpu dai and codec dai.
Calling same code three times may not be a problem in most systems, but in some
system which has limited computing power and changes audio routing frequently,
couple of milliseconds are consumed and make the system a little bit slower to
audio response.
If the be_hw_params_fixup() could be pull out from soc_soc_dai_hw_params(),
and make it call once at pcm start or routing change, response time can be increased.

In my search, the only point that calls snd_soc_dai_hw_params() without 
calling be_hw_params_fixup() callback directly is snd_soc_dai_link_event_pre_pmu().
So, I proposed pulling out be_hw_params_fixup() from snd_soc_dai_hw_params() and then
add direct call to be_hw_params_fixup() callback in snd_soc_dai_link_event_pre_pmu()
not to harm current working process. 
>>   	if (dai->driver->ops->hw_params) {
>>   		ret = dai->driver->ops->hw_params(substream, params, dai);
>>   		if (ret < 0) {
>> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
>> index e2632841b321..d86c1cd4e8fa 100644
>> --- a/sound/soc/soc-dapm.c
>> +++ b/sound/soc/soc-dapm.c
>> @@ -3886,6 +3886,17 @@ snd_soc_dai_link_event_pre_pmu(struct snd_soc_dapm_widget *w,
>>   	hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS)->max
>>   		= config->channels_max;
>>   
>> +	/* perform any topology hw_params fixups before DAI  */
>> +	if (rtd->dai_link->be_hw_params_fixup) {
>> +		ret = rtd->dai_link->be_hw_params_fixup(rtd, params);
>> +		if (ret < 0) {
>> +			dev_err(rtd->dev,
>> +				"ASoC: hw_params topology fixup failed %d\n",
>> +				ret);
>> +			return ret;
>> +		}
>> +	}
>> +
>>   	substream->stream = SNDRV_PCM_STREAM_CAPTURE;
>>   	snd_soc_dapm_widget_for_each_source_path(w, path) {
>>   		source = path->source->priv;
>> 
>> base-commit: f3643491bd079c973ac6c693da7966cd17506ca3
>> 
>



More information about the Alsa-devel mailing list