diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2009-08-02 17:52:05 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2009-08-03 22:47:15 +0200 |
commit | 34f31f666e2a2c301e0735e48e48da44ff503acc (patch) | |
tree | 70a131739de4eb99201e44cb9a1e8181512f39a3 | |
parent | 277822053c2f070940e5a996b9a6d95645d74590 (diff) | |
download | pulseaudio-panda-34f31f666e2a2c301e0735e48e48da44ff503acc.tar.gz pulseaudio-panda-34f31f666e2a2c301e0735e48e48da44ff503acc.tar.bz2 pulseaudio-panda-34f31f666e2a2c301e0735e48e48da44ff503acc.zip |
Recover stream when it's suspended upon rewind
Error from snd_pcm_rewind() might mean we just woke up from suspend and
didn't have a chance to try to recover the stream since we didn't write
to it in between. Call try_recover() in such cases.
Note that for this to work kernel must return ESTRPIPE instead of EBADF
for rewind/forward attempts on suspended streams, so that
snd_pcm_recover() can recognize it should snd_pcm_resume() the stream.
This is not the case yet (2.6.31-rc5), patch is available.
Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
-rw-r--r-- | src/modules/alsa/alsa-sink.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index 7fc602be..2a734e35 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -340,6 +340,9 @@ static int try_recover(struct userdata *u, const char *call, int err) { if (err == -EPIPE) pa_log_debug("%s: Buffer underrun!", call); + if (err == -EBADFD) + pa_log_debug("%s: Stream suspended!", call); + if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) { pa_log("%s: %s", call, pa_alsa_strerror(err)); return -1; @@ -1199,8 +1202,11 @@ static int process_rewind(struct userdata *u) { pa_log_debug("before: %lu", (unsigned long) in_frames); if ((out_frames = snd_pcm_rewind(u->pcm_handle, (snd_pcm_uframes_t) in_frames)) < 0) { pa_log("snd_pcm_rewind() failed: %s", pa_alsa_strerror((int) out_frames)); - return -1; + if (try_recover(u, "process_rewind", out_frames) < 0) + return -1; + out_frames = 0; } + pa_log_debug("after: %lu", (unsigned long) out_frames); rewind_nbytes = (size_t) out_frames * u->frame_size; |