Blob Blame History Raw
diff -Nur audacious-plugins-fedora-2.1/src/alsa-ng/alsa-core.c audacious-plugins-fedora-2.1-underruns/src/alsa-ng/alsa-core.c
--- audacious-plugins-fedora-2.1/src/alsa-ng/alsa-core.c	2009-09-16 00:57:07.000000000 +0200
+++ audacious-plugins-fedora-2.1-underruns/src/alsa-ng/alsa-core.c	2009-09-19 17:38:22.574485456 +0200
@@ -27,6 +27,10 @@
 static gboolean pcm_going = FALSE;
 static GThread *audio_thread = NULL;
 static gint bps;
+static gint loopbufsize = 384000;
+static gint looppostsize = 2048;
+static gint looppresize;
+static gboolean prefill = TRUE;
 
 static gsize wr_total = 0;
 static gsize wr_hwframes = 0;
@@ -221,6 +225,9 @@
         }
         else
         {
+            if (wr_frames == -EPIPE) {
+                prefill = TRUE;
+            }
             gint err = snd_pcm_recover(pcm_handle, wr_frames, 1);
 
             _DEBUG ("snd_pcm_writei error: %s", snd_strerror (wr_frames));
@@ -237,7 +244,7 @@
 static gpointer
 alsaplug_loop(gpointer unused)
 {
-    guchar buf[2048];
+    guchar buf[loopbufsize];
     int size;
 
     while (pcm_going)
@@ -247,6 +254,7 @@
         if (flush_request != -1)
         {
             alsaplug_ringbuffer_reset (& pcm_ringbuf);
+            prefill = TRUE;
             snd_pcm_drop(pcm_handle);
             snd_pcm_prepare(pcm_handle);
             wr_total = flush_request * (long long) bps / 1000;
@@ -264,12 +272,26 @@
             continue;
         }
 
-        if (size > sizeof buf)
-            size = sizeof buf;
+        if (prefill) {
+            if (size > loopbufsize)
+                size = loopbufsize;
+
+            if (size >= looppresize) {
+                alsaplug_ringbuffer_read (& pcm_ringbuf, buf, size);
+                prefill = FALSE;
+            }
+        }
+        else {
+            if (size > looppostsize)
+                size = looppostsize;
 
         alsaplug_ringbuffer_read (& pcm_ringbuf, buf, size);
+            alsaplug_ringbuffer_read (& pcm_ringbuf, buf, size);
+        }
         g_mutex_unlock (pcm_state_mutex);
-        alsaplug_write_buffer (buf, size);
+        if (!prefill) {
+            alsaplug_write_buffer (buf, size);
+        }
     }
 
     snd_pcm_drain(pcm_handle);
@@ -377,6 +399,13 @@
         _ERROR("alsaplug_ringbuffer_init failed");
         return -1;
     }
+    if (loopbufsize >= ringbuf_size) {
+        looppresize = ringbuf_size/2;
+    }
+    else {
+        looppresize = loopbufsize;
+    }
+    prefill = TRUE;
 
     pcm_going = TRUE;
     flush_request = -1;
@@ -511,6 +540,7 @@
 {
     g_mutex_lock (pcm_state_mutex);
     paused = p;
+    prefill = !paused;
     g_cond_broadcast (pcm_state_cond);
     g_mutex_unlock (pcm_state_mutex);
 }