On Thu, Jun 20, 2024 at 3:56 PM Takashi Iwai tiwai@suse.de wrote:
On Thu, 20 Jun 2024 04:40:18 +0200, Shengjiu Wang wrote:
When dmaengine supports pause function, in suspend state, dmaengine_pause() is called instead of dmaengine_terminate_async(),
In end of playback stream, the runtime->state will go to SNDRV_PCM_STATE_DRAINING, if system suspend & resume happen at this time, application will not resume playback stream, the stream will be closed directly, the dmaengine_terminate_async() will not be called before the dmaengine_synchronize(), which violates the call sequence for dmaengine_synchronize().
Hmm, I can't follow this state change. Do you mean that:
- snd_pcm_drain() is performed for a playback stream
- while draining operation, the system goes to suspend
- the system resumes (but the application doesn't call resume yet)
- The stream is closed (without calling resume)
??
yes. this is the case.
If so, it's rather an inconsistent PCM state in the core side, and can be fixed by a simple call like below:
-- 8< -- --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -2700,6 +2700,7 @@ void snd_pcm_release_substream(struct snd_pcm_substream *substream) if (substream->ref_count > 0) return;
snd_pcm_resume(substream); snd_pcm_drop(substream); if (substream->hw_opened) { if (substream->runtime->state != SNDRV_PCM_STATE_OPEN)
-- 8< --
This will be no-op for the PCM device without SNDRV_PCM_INFO_RESUME.
But, this may need more rework, too; admittedly it imposes the unnecessary resume of the stream although it shall be stopped and closed immediately after that. We may have some optimization in addition.
The suspended_state is not cleared that the resume may be called again at the end of stream.
Will you push the code?
Best regards Shengjiu Wang
thanks,
Takashi