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