ALSA: pcm: Preprocess PAUSED or SUSPENDED stream before PREPARE
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 PAUSE_RELEASE, and when in SUSPENDED state, it triggers STOP, before calling prepare callbacks. Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
4b95ff781e
commit
1b745cd974
1 changed files with 11 additions and 0 deletions
|
@ -1684,6 +1684,17 @@ static int snd_pcm_prepare(struct snd_pcm_substream *substream,
|
||||||
else
|
else
|
||||||
f_flags = substream->f_flags;
|
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,
|
return snd_pcm_action_nonatomic(&snd_pcm_action_prepare,
|
||||||
substream, f_flags);
|
substream, f_flags);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue