[alsa-devel] [PATCH 4/6] ALSA: pcm: Preprocess PAUSED or SUSPENDED stream before PREPARE
Takashi Sakamoto
o-takashi at sakamocchi.jp
Wed Jun 14 03:55:38 CEST 2017
On Jun 13 2017 23:18, Takashi Iwai wrote:
> Calling PREPARE ioctl to the stream in either PAUSED or SUSPENDED
> state may confuse some drivers that don't handle the state properly.
> Instead of fixing each driver, PCM core should take care of the proper
> state change before actually trying to (re-)prepare the stream.
> Namely, when the stream is in PAUSED state, it triggers PAUSH_RELEASE,
s/PAUSH_RELEASE/PAUSE_RELEASE/
> and when in SUSPENDED state, it triggers STOP, before calling prepare
> callbacks.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/core/pcm_native.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 69cf9b02ac70..0941b9c92b3f 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -1684,6 +1684,17 @@ static int snd_pcm_prepare(struct snd_pcm_substream *substream,
> else
> f_flags = substream->f_flags;
>
> + snd_pcm_stream_lock_irq(substream);
> + switch (substream->runtime->status->state) {
> + case SNDRV_PCM_STATE_PAUSED:
> + snd_pcm_pause(substream, 0);
> + /* fallthru */
> + case SNDRV_PCM_STATE_SUSPENDED:
> + snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
> + break;
> + }
> + snd_pcm_stream_unlock_irq(substream);
> +
> return snd_pcm_action_nonatomic(&snd_pcm_action_prepare,
> substream, f_flags);
> }
Regards
Takashi Sakamoto
More information about the Alsa-devel
mailing list