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.
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;
guchar *data;
guint len;
guint res;
+ guint64 sample;
if (!gst_ring_buffer_is_acquired (src->ringbuffer))
goto wrong_state;
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;
}
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;
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);
/* 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;
}