diff options
author | Nicolin Chen <b42378@freescale.com> | 2013-11-20 05:37:09 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-11-24 08:32:50 -0500 |
commit | d3383420c969c25deffd33270ebe321e8401191a (patch) | |
tree | 39e3ddfbbc675a9ccffb8ded6cbaa6d0014636d2 | |
parent | 3635bf09a89cf92b80ac44198c5c8f0989624ea6 (diff) |
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>
-rw-r--r-- | sound/soc/soc-pcm.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index ed1e077114a2..170ff9695753 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c | |||
@@ -450,19 +450,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream) | |||
450 | codec_dai->active--; | 450 | codec_dai->active--; |
451 | codec->active--; | 451 | codec->active--; |
452 | 452 | ||
453 | /* clear the corresponding DAIs rate when inactive */ | ||
454 | if (!cpu_dai->active) { | ||
455 | cpu_dai->rate = 0; | ||
456 | cpu_dai->channels = 0; | ||
457 | cpu_dai->sample_bits = 0; | ||
458 | } | ||
459 | |||
460 | if (!codec_dai->active) { | ||
461 | codec_dai->rate = 0; | ||
462 | codec_dai->channels = 0; | ||
463 | codec_dai->sample_bits = 0; | ||
464 | } | ||
465 | |||
466 | /* Muting the DAC suppresses artifacts caused during digital | 453 | /* Muting the DAC suppresses artifacts caused during digital |
467 | * shutdown, for example from stopping clocks. | 454 | * shutdown, for example from stopping clocks. |
468 | */ | 455 | */ |
@@ -682,6 +669,19 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) | |||
682 | 669 | ||
683 | mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); | 670 | mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); |
684 | 671 | ||
672 | /* clear the corresponding DAIs parameters when going to be inactive */ | ||
673 | if (cpu_dai->active == 1) { | ||
674 | cpu_dai->rate = 0; | ||
675 | cpu_dai->channels = 0; | ||
676 | cpu_dai->sample_bits = 0; | ||
677 | } | ||
678 | |||
679 | if (codec_dai->active == 1) { | ||
680 | codec_dai->rate = 0; | ||
681 | codec_dai->channels = 0; | ||
682 | codec_dai->sample_bits = 0; | ||
683 | } | ||
684 | |||
685 | /* apply codec digital mute */ | 685 | /* apply codec digital mute */ |
686 | if (!codec->active) | 686 | if (!codec->active) |
687 | snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); | 687 | snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); |