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