From: Frank E. <fra...@an...> - 2010-04-11 20:50:36
|
# HG changeset patch # User Frank Enderle <fra...@an...> # Date 1270997858 -3600 # Node ID cba9b9a6d6b34bb4dacfc7a8d5113be015253105 # Parent 1fd36611ee1ffe4f5d98adb511070202dfdeb448 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). diff --git a/src/audio_out/audio_alsa_out.c b/src/audio_out/audio_alsa_out.c --- a/src/audio_out/audio_alsa_out.c +++ b/src/audio_out/audio_alsa_out.c @@ -668,6 +668,34 @@ 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; |