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);
   }