# HG changeset patch # User cladisch # Date 1139563488 0 # Node ID 8921544f41145e1dc0970515bb738d62762f66cb # Parent 580dc69d69bfdf5be893009db17d086d9009a1c7 Simplify get_delay(): we don't need to get the complete PCM status but can call snd_pcm_delay() directly. To avoid the audio device appearing to be running too fast after an underrun, ignore any samples that were lost in an underrun. diff -r 580dc69d69bf -r 8921544f4114 libao2/ao_alsa.c --- a/libao2/ao_alsa.c Fri Feb 10 09:21:17 2006 +0000 +++ b/libao2/ao_alsa.c Fri Feb 10 09:24:48 2006 +0000 @@ -1037,35 +1037,20 @@ /* delay in seconds between first and last sample in buffer */ static float get_delay(void) { - if (alsa_handler) { - - snd_pcm_status_t *status; - float ret; + snd_pcm_sframes_t delay; - snd_pcm_status_alloca(&status); - - if ((ret = snd_pcm_status(alsa_handler, status)) < 0) - { - mp_msg(MSGT_AO,MSGL_ERR,"alsa-delay: cannot get pcm status: %s\n", snd_strerror(ret)); - } + if (snd_pcm_delay(alsa_handler, &delay) < 0) + return 0; - switch(snd_pcm_status_get_state(status)) - { - case SND_PCM_STATE_OPEN: - case SND_PCM_STATE_PREPARED: - case SND_PCM_STATE_RUNNING: - ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate; - break; - default: - ret = 0; + if (delay < 0) { + /* underrun - move the application pointer forward to catch up */ +#if SND_LIB_VERSION >= 0x000901 /* snd_pcm_forward() exists since 0.9.0rc8 */ + snd_pcm_forward(alsa_handler, -delay); +#endif + delay = 0; } - - - if (ret < 0) - ret = 0; - return(ret); - + return (float)delay / (float)ao_data.samplerate; } else { return(0); }