--- /usr/tmp/clean/gst-plugins-base-0.10.10/gst-libs/gst/audio/gstringbuffer.h	2006-09-05 16:01:21.000000000 +0100
+++ gst-plugins-base-0.10.10/gst-libs/gst/audio/gstringbuffer.h	2006-11-14 09:42:38.847480000 +0000
@@ -250,6 +250,8 @@
     /* adding + 0 to mark ABI change to be undone later */
     gpointer _gst_reserved[GST_PADDING + 0];
   } abidata;
+  gint                   first_silent_seg;
+  gint                   last_silent_seg;
 };
 
 /**
--- /usr/tmp/clean/gst-plugins-base-0.10.10/gst-libs/gst/audio/gstringbuffer.c	2006-09-05 16:01:21.000000000 +0100
+++ gst-plugins-base-0.10.10/gst-libs/gst/audio/gstringbuffer.c	2006-11-14 11:14:13.861123000 +0000
@@ -109,6 +109,8 @@
   ringbuffer->waiting = 0;
   ringbuffer->empty_seg = NULL;
   ringbuffer->abidata.ABI.flushing = TRUE;
+  ringbuffer->first_silent_seg = -1;
+  ringbuffer->last_silent_seg = -1;
 }
 
 static void
@@ -1266,6 +1268,27 @@
 
     memcpy (dest + (writeseg * segsize) + (sampleoff * bps), data,
         (sampleslen * bps));
+    if (sampleoff + sampleslen == sps) {
+      /* We have filled up a segment */
+      GST_OBJECT_LOCK (buf);
+      if (buf->first_silent_seg == writeseg) {
+        if (buf->first_silent_seg == buf->last_silent_seg) {
+          buf->first_silent_seg = -1;
+          buf->last_silent_seg = -1;
+        } else {
+          buf->first_silent_seg++;
+          if (buf->first_silent_seg >= segtotal)
+            buf->first_silent_seg = 0;
+        }
+      }
+      if (buf->first_silent_seg > 0) {
+        GstRingBufferClass *rclass;
+
+        rclass = GST_RING_BUFFER_GET_CLASS (buf);
+        rclass->resume (buf);
+      }
+      GST_OBJECT_UNLOCK (buf);
+    }
 
   next:
     to_write -= sampleslen;
@@ -1433,6 +1456,12 @@
   segdone = g_atomic_int_get (&buf->segdone);
 
   *segment = segdone % buf->spec.segtotal;
+  GST_OBJECT_LOCK (buf);
+  if (*segment == buf->first_silent_seg) {
+    GST_OBJECT_UNLOCK (buf);
+    return FALSE;
+  }
+  GST_OBJECT_UNLOCK (buf);
   *len = buf->spec.segsize;
   *readptr = data + *segment * *len;
 
@@ -1509,6 +1538,11 @@
   GST_LOG ("clear segment %d @%p", segment, data);
 
   memcpy (data, buf->empty_seg, buf->spec.segsize);
+  GST_OBJECT_LOCK (buf);
+  if (buf->first_silent_seg == -1)
+    buf->first_silent_seg = segment;
+  buf->last_silent_seg = segment;
+  GST_OBJECT_UNLOCK (buf);
 }
 
 /**
--- /usr/tmp/clean/gst-plugins-base-0.10.10/gst-libs/gst/audio/gstaudiosink.c	2006-09-05 16:01:21.000000000 +0100
+++ gst-plugins-base-0.10.10/gst-libs/gst/audio/gstaudiosink.c	2006-11-14 11:07:59.894725000 +0000
@@ -156,6 +156,7 @@
   GstAudioSinkClass *csink;
   GstAudioRingBuffer *abuf = GST_AUDIORING_BUFFER_CAST (buf);
   WriteFunc writefunc;
+  int starting = 1;
 
   sink = GST_AUDIO_SINK (GST_OBJECT_PARENT (buf));
   csink = GST_AUDIO_SINK_GET_CLASS (sink);
@@ -199,13 +200,16 @@
       GST_DEBUG ("signal wait");
       GST_AUDIORING_BUFFER_SIGNAL (buf);
       GST_DEBUG ("wait for action");
-      GST_AUDIORING_BUFFER_WAIT (buf);
-      GST_DEBUG ("got signal");
+      if (buf->first_silent_seg != -1 || starting) {
+        GST_AUDIORING_BUFFER_WAIT (buf);
+        GST_DEBUG ("got signal");
+      }
       if (!abuf->running)
         goto stop_running;
       GST_DEBUG ("continue running");
       GST_OBJECT_UNLOCK (abuf);
     }
+    starting = 0;
   }
   GST_DEBUG ("exit thread");
 
