diff mbox

[4/6] ALSA: pcm: Preprocess PAUSED or SUSPENDED stream before PREPARE

Message ID 20170613141812.21220-5-tiwai@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Takashi Iwai June 13, 2017, 2:18 p.m. UTC
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,
and when in SUSPENDED state, it triggers STOP, before calling prepare
callbacks.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/core/pcm_native.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Takashi Sakamoto June 14, 2017, 1:55 a.m. UTC | #1
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@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
diff mbox

Patch

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);
 }