mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-09 23:34:42 +08:00
ASoC: soc-pcm: move DAIs parameters cleaning into hw_free()
We're now applying soc_hw_params_symmetry() to reject unmatched parameters while we clear parameters in soc_pcm_close(). So here's a use case might be broken by this mechanism: aplay -Dhw:0 44100.wav 48000.wav 32000.wav In this case, we call soc_pcm_open()->soc_pcm_hw_params()->soc_pcm_hw_free() ->soc_pcm_hw_params()->soc_pcm_hw_free()->soc_pcm_close() in order. As we only clear parameters in soc_pcm_close(). The parameters would be remained in the system even if the playback of 44100.wav is finished. Thus, this patch is trying to move parameters cleaning into hw_free() so that the system can continue to serve this kind of use case. Also, since we set them in hw_params(), it should be better to clear them in hw_free() for symmetry. Signed-off-by: Nicolin Chen <b42378@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
3635bf09a8
commit
d3383420c9
@ -450,19 +450,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
|
|||||||
codec_dai->active--;
|
codec_dai->active--;
|
||||||
codec->active--;
|
codec->active--;
|
||||||
|
|
||||||
/* clear the corresponding DAIs rate when inactive */
|
|
||||||
if (!cpu_dai->active) {
|
|
||||||
cpu_dai->rate = 0;
|
|
||||||
cpu_dai->channels = 0;
|
|
||||||
cpu_dai->sample_bits = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!codec_dai->active) {
|
|
||||||
codec_dai->rate = 0;
|
|
||||||
codec_dai->channels = 0;
|
|
||||||
codec_dai->sample_bits = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Muting the DAC suppresses artifacts caused during digital
|
/* Muting the DAC suppresses artifacts caused during digital
|
||||||
* shutdown, for example from stopping clocks.
|
* shutdown, for example from stopping clocks.
|
||||||
*/
|
*/
|
||||||
@ -682,6 +669,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
|
|||||||
|
|
||||||
mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
|
mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
|
||||||
|
|
||||||
|
/* clear the corresponding DAIs parameters when going to be inactive */
|
||||||
|
if (cpu_dai->active == 1) {
|
||||||
|
cpu_dai->rate = 0;
|
||||||
|
cpu_dai->channels = 0;
|
||||||
|
cpu_dai->sample_bits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (codec_dai->active == 1) {
|
||||||
|
codec_dai->rate = 0;
|
||||||
|
codec_dai->channels = 0;
|
||||||
|
codec_dai->sample_bits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* apply codec digital mute */
|
/* apply codec digital mute */
|
||||||
if (!codec->active)
|
if (!codec->active)
|
||||||
snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
|
snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
|
||||||
|
Loading…
Reference in New Issue
Block a user