[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230920153621.711373-1-chancel.liu@nxp.com>
Date: Wed, 20 Sep 2023 23:36:20 +0800
From: Chancel Liu <chancel.liu@....com>
To: lgirdwood@...il.com, broonie@...nel.org, perex@...ex.cz,
tiwai@...e.com, alsa-devel@...a-project.org,
linux-kernel@...r.kernel.org
Cc: Chancel Liu <chancel.liu@....com>
Subject: [PATCH v2 0/1] ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive
It's reasonable that DAI parameters should be cleared if current DAI becomes
inactive.
Only check DAI active status in soc_pcm_hw_free() is not enough since there's
the risk that DAI parameters never be cleared if there're more than one stream
[see A]. Only check DAI active status in soc_pcm_close() is also not enough
since it will cause the cleanup just happening in soc_pcm_close() [see B].
[A] For example, we have stream1 and stream2 for DAI about to stop. stream2
executes soc_pcm_hw_free() before stream1 executes soc_pcm_close(). At the
moment, stream2 should clear current DAI parameters because stream1 passed the
cleanup stage in soc_pcm_hw_free() and stream2 in fact is the only active
stream which has a chance to do clean up. Since DAI active status is not yet
updated by stream1 in soc_pcm_close(), stream2 doesn't know itself should clear
DAI parameters. In result both stream1 and stream2 don't clear the parameters.
[B] Suppose a case: aplay -Dhw:0 44100.wav 48000.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. The DAI
parameters would be remained in the system even if the playback of 44100.wav is
finished.
In conclusion, it's better to check DAI active status in both soc_pcm_hw_free()
and soc_pcm_close() which makes sure DAI parameters cleared if the DAI becomes
inactive.
changes in v2:
- Patch v1 link: https://lore.kernel.org/all/20230112065834.580192-1-chancel.liu@nxp.com/
Patch v1 tries to introduce a usage count called hw_params_count to fix issue
on DAI parameters cleanup. However it's not a good fix because not
considering hw_params() and hw_free() are not symmetrical and hw_params()
might be called multilpe times by user.
- Both check DAI active status in soc_pcm_hw_free() and soc_pcm_close() which
makes sure DAI parameters cleared if the DAI becomes inactive.
Chancel Liu (1):
ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes
inactive
sound/soc/soc-pcm.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
--
2.25.1
Powered by blists - more mailing lists