[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