From dba25e13c08a02a3734ce7891dc1652826ce15b1 Mon Sep 17 00:00:00 2001 From: foo86 Date: Mon, 10 Mar 2014 00:32:00 +0400 Subject: ao_alsa: check ALSA PCM state before pause and resume It is possible to have ao->reset() called between ao->pause() and ao->resume() when seeking during the pause. If the underlying PCM supports pausing, resuming an already reset PCM will produce an error. Avoid that by explicitly checking PCM state before calling snd_pcm_pause(). Signed-off-by: wm4 --- audio/out/ao_alsa.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/audio/out/ao_alsa.c b/audio/out/ao_alsa.c index e8b3405bb0..08ddac75ea 100644 --- a/audio/out/ao_alsa.c +++ b/audio/out/ao_alsa.c @@ -561,9 +561,11 @@ static void audio_pause(struct ao *ao) int err; if (p->can_pause) { - p->delay_before_pause = get_delay(ao); - err = snd_pcm_pause(p->alsa, 1); - CHECK_ALSA_ERROR("pcm pause error"); + if (snd_pcm_state(p->alsa) == SND_PCM_STATE_RUNNING) { + p->delay_before_pause = get_delay(ao); + err = snd_pcm_pause(p->alsa, 1); + CHECK_ALSA_ERROR("pcm pause error"); + } } else { MP_VERBOSE(ao, "pause not supported by hardware\n"); if (snd_pcm_delay(p->alsa, &p->prepause_frames) < 0 @@ -591,8 +593,10 @@ static void audio_resume(struct ao *ao) } if (p->can_pause) { - err = snd_pcm_pause(p->alsa, 0); - CHECK_ALSA_ERROR("pcm resume error"); + if (snd_pcm_state(p->alsa) == SND_PCM_STATE_PAUSED) { + err = snd_pcm_pause(p->alsa, 0); + CHECK_ALSA_ERROR("pcm resume error"); + } } else { MP_VERBOSE(ao, "resume not supported by hardware\n"); err = snd_pcm_prepare(p->alsa); -- cgit v1.2.3