Mercurial > mplayer.hg
changeset 17573:8921544f4114
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.
author | cladisch |
---|---|
date | Fri, 10 Feb 2006 09:24:48 +0000 |
parents | 580dc69d69bf |
children | 9c90977d9f50 |
files | libao2/ao_alsa.c |
diffstat | 1 files changed, 10 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- 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); }