[alsa-devel] [PATCH v2 0/2] Only do snd_soc_dai_digital_mute() in hw_free()
This series of patches mainly fixes an issue of snd_soc_dai_digital_mute() operation after playback/capture is done. The current system has two of them in a normal PCM instance while one of them has an invalid condition. Thus we first fix the condition and then drop the redundant one.
Changelog: v2: * Bisected into two patches. * Fixed indentation in PATCH-1.
Nicolin Chen (2): ASoC: soc-pcm: Use valid condition for snd_soc_dai_digital_mute() in hw_free() ASoC: soc-pcm: Drop the redundant snd_soc_dai_digital_mute() in soc_pcm_close()
sound/soc/soc-pcm.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
The snd_soc_dai_digital_mute() here will be never executed because we only decrease codec->active in snd_soc_close(). Thus correct it.
Signed-off-by: Nicolin Chen b42378@freescale.com --- sound/soc/soc-pcm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index eb340a8..3774471 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -689,7 +689,7 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *codec_dai = rtd->codec_dai; - struct snd_soc_codec *codec = rtd->codec; + bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
@@ -707,7 +707,8 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream) }
/* apply codec digital mute */ - if (!codec->active) + if ((playback && codec_dai->playback_active == 1) || + (!playback && codec_dai->capture_active == 1)) snd_soc_dai_digital_mute(codec_dai, 1, substream->stream);
/* free any machine hw params */
On Wed, Dec 04, 2013 at 11:18:36AM +0800, Nicolin Chen wrote:
The snd_soc_dai_digital_mute() here will be never executed because we only decrease codec->active in snd_soc_close(). Thus correct it.
Applied, thanks.
This patch removed the redundant snd_soc_dai_digital_mute() in close() since it's better to mute in hw_free() which's slightly earlier and symmetrical for the case of reconfiguration: 'aplay 44k1.wav 48k.wav', for example, will be open()->hw_params()->prepare(unmute)->playi1ng->hw_free(mute)->hw_params()-> parepare(unmute)->playing->hw_free(mute)->close()
Signed-off-by: Nicolin Chen b42378@freescale.com --- sound/soc/soc-pcm.c | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 3774471..1c3cd5e 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -474,11 +474,6 @@ static int soc_pcm_close(struct snd_pcm_substream *substream) codec_dai->active--; codec->active--;
- /* Muting the DAC suppresses artifacts caused during digital - * shutdown, for example from stopping clocks. - */ - snd_soc_dai_digital_mute(codec_dai, 1, substream->stream); - if (cpu_dai->driver->ops->shutdown) cpu_dai->driver->ops->shutdown(substream, cpu_dai);
On Wed, Dec 04, 2013 at 11:18:37AM +0800, Nicolin Chen wrote:
This patch removed the redundant snd_soc_dai_digital_mute() in close() since it's better to mute in hw_free() which's slightly earlier and symmetrical for the case of reconfiguration: 'aplay 44k1.wav 48k.wav', for example, will be open()->hw_params()->prepare(unmute)->playi1ng->hw_free(mute)->hw_params()-> parepare(unmute)->playing->hw_free(mute)->close()
Applied, thanks.
participants (2)
-
Mark Brown
-
Nicolin Chen