diff options
author | Frank Enderle <frank.enderle@anamica.de> | 2010-04-11 15:57:38 +0100 |
---|---|---|
committer | Frank Enderle <frank.enderle@anamica.de> | 2010-04-11 15:57:38 +0100 |
commit | 0db9edf88fd4ebce5581c7bb22402dc312bffc69 (patch) | |
tree | 6c989cbdc422e8c4c16c76d7d24d8a0c92e8cede | |
parent | d5199bac5da727023cab4bbcd7e850643b8d0c83 (diff) | |
download | xine-lib-0db9edf88fd4ebce5581c7bb22402dc312bffc69.tar.gz xine-lib-0db9edf88fd4ebce5581c7bb22402dc312bffc69.tar.bz2 |
Fix a flaw on recovering from ALSA-reported errors in ao_alsa_delay()
I noticed some alsa dropouts (losing audio) while hunting a bug which has
been related to a broken streaming server. This resulted in buffers running
empty and therefore showed some issues in the ALSA driver not correctly
applying some recovery procedures provided by ALSA itself (snd_pcm_recover()
and friends).
-rw-r--r-- | src/audio_out/audio_alsa_out.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/audio_out/audio_alsa_out.c b/src/audio_out/audio_alsa_out.c index b18637a7b..3d5393f63 100644 --- a/src/audio_out/audio_alsa_out.c +++ b/src/audio_out/audio_alsa_out.c @@ -668,6 +668,34 @@ static int ao_alsa_delay (ao_driver_t *this_gen) { printf("audio_alsa_out:delay:FINISHED\n"); #endif + /* + * try to recover from errors and recalculate delay + */ + if(err) { +#ifdef LOG_DEBUG + printf("gap audio_alsa_out:delay: recovery\n"); +#endif + err = snd_pcm_recover( this->audio_fd, err, 1 ); + err = snd_pcm_delay( this->audio_fd, &delay ); + } + + /* + * if we have a negative delay try to forward within the buffer + */ + if(!err && (delay < 0)) { +#ifdef LOG_DEBUG + printf("gap audio_alsa_out:delay: forwarding frames: %d\n", (int)-delay); +#endif + err = snd_pcm_forward( this->audio_fd, -delay ); + if(err >= 0) { + err = snd_pcm_delay( this->audio_fd, &delay ); + } + } + + /* + * on error or (still) negative delays ensure delay + * is not negative + */ if (err || (delay < 0)) delay = 0; |