gst-libs/gst/audio/: Fixed gstbaseaudiosrc adding ring buffer sync to it.
authorEdgard Lima <edgard.lima@indt.org.br>
Thu, 6 Oct 2005 15:15:04 +0000 (15:15 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Thu, 6 Oct 2005 15:15:04 +0000 (15:15 +0000)
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_event),
(gst_base_audio_src_create), (gst_base_audio_src_change_state):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
* gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_read):
patch from Edgard Lima <edgard.lima@indt.org.br>
Fixed gstbaseaudiosrc adding ring buffer sync to it.

ChangeLog
gst-libs/gst/audio/gstbaseaudiosrc.c
gst-libs/gst/audio/gstbaseaudiosrc.h
gst-libs/gst/audio/gstringbuffer.c

index 3dc2c2b..dd61758 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2005-10-06  Wim Taymans  <wim@fluendo.com>
 
+       * gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_event),
+       (gst_base_audio_src_create), (gst_base_audio_src_change_state):
+       * gst-libs/gst/audio/gstbaseaudiosrc.h:
+       * gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_read):
+       patch from Edgard Lima <edgard.lima@indt.org.br>
+       Fixed gstbaseaudiosrc adding ring buffer sync to it.
+
+2005-10-06  Wim Taymans  <wim@fluendo.com>
+
        * ext/ogg/gstoggdemux.c: (gst_ogg_demux_loop):
        Report the FLOW_RETURN as string in the error message.
 
index ae18b6e..726e6db 100644 (file)
@@ -289,8 +289,12 @@ gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event)
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_FLUSH_START:
       gst_ring_buffer_pause (src->ringbuffer);
+      gst_ring_buffer_clear_all (src->ringbuffer);
       break;
     case GST_EVENT_FLUSH_STOP:
+      /* always resync on sample after a flush */
+      src->next_sample = -1;
+      gst_ring_buffer_clear_all (src->ringbuffer);
       break;
     default:
       break;
@@ -306,6 +310,7 @@ gst_base_audio_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
   guchar *data;
   guint len;
   guint res;
+  guint64 sample;
 
   if (!gst_ring_buffer_is_acquired (src->ringbuffer))
     goto wrong_state;
@@ -315,10 +320,18 @@ gst_base_audio_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
   data = GST_BUFFER_DATA (buf);
   len = GST_BUFFER_SIZE (buf);
 
-  res = gst_ring_buffer_read (src->ringbuffer, -1, data, len);
+  if (src->next_sample != -1) {
+    sample = src->next_sample;
+  } else {
+    sample = 0;
+  }
+
+  res = gst_ring_buffer_read (src->ringbuffer, sample, data, len);
   if (res == -1)
     goto stopped;
 
+  src->next_sample = sample + len / src->ringbuffer->spec.bytes_per_sample;
+
   gst_buffer_set_caps (buf, GST_PAD_CAPS (GST_BASE_SRC_PAD (psrc)));
 
   *outbuf = buf;
@@ -378,6 +391,7 @@ gst_base_audio_src_change_state (GstElement * element,
       }
       if (!gst_ring_buffer_open_device (src->ringbuffer))
         return GST_STATE_CHANGE_FAILURE;
+      src->next_sample = 0;
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       break;
@@ -394,8 +408,8 @@ gst_base_audio_src_change_state (GstElement * element,
       gst_ring_buffer_pause (src->ringbuffer);
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      gst_ring_buffer_stop (src->ringbuffer);
       gst_ring_buffer_release (src->ringbuffer);
+      src->next_sample = 0;
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
       gst_ring_buffer_close_device (src->ringbuffer);
index 7019d90..bf539fb 100644 (file)
@@ -57,6 +57,9 @@ struct _GstBaseAudioSrc {
   GstClockTime   buffer_time;
   GstClockTime   latency_time;
 
+  /* the next sample to write */
+  guint64       next_sample;
+
   /* clock */
   GstClock     *clock;
 
index 6ac0ba4..daa1027 100644 (file)
@@ -1065,9 +1065,10 @@ gst_ring_buffer_read (GstRingBuffer * buf, guint64 sample, guchar * data,
 
       /* segment too far ahead, we need to drop */
       if (diff < 0) {
-        /* we need to drop one segment at a time, pretend we wrote a
-         * segment. */
+        /* we need to drop one segment at a time, pretend we read an
+         * empty segment. */
         readlen = MIN (segsize, len);
+        memcpy (data, buf->empty_seg, readlen);
         goto next;
       }