gst-libs/gst/audio/: Fixed gstbaseaudiosrc adding ring buffer sync to it.

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.
This commit is contained in:
Edgard Lima 2005-10-06 15:15:04 +00:00 committed by Wim Taymans
parent a872aac9f8
commit e846919fe9
4 changed files with 31 additions and 4 deletions

View file

@ -1,3 +1,12 @@
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> 2005-10-06 Wim Taymans <wim@fluendo.com>
* ext/ogg/gstoggdemux.c: (gst_ogg_demux_loop): * ext/ogg/gstoggdemux.c: (gst_ogg_demux_loop):

View file

@ -289,8 +289,12 @@ gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event)
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_FLUSH_START: case GST_EVENT_FLUSH_START:
gst_ring_buffer_pause (src->ringbuffer); gst_ring_buffer_pause (src->ringbuffer);
gst_ring_buffer_clear_all (src->ringbuffer);
break; break;
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
/* always resync on sample after a flush */
src->next_sample = -1;
gst_ring_buffer_clear_all (src->ringbuffer);
break; break;
default: default:
break; break;
@ -306,6 +310,7 @@ gst_base_audio_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
guchar *data; guchar *data;
guint len; guint len;
guint res; guint res;
guint64 sample;
if (!gst_ring_buffer_is_acquired (src->ringbuffer)) if (!gst_ring_buffer_is_acquired (src->ringbuffer))
goto wrong_state; goto wrong_state;
@ -315,10 +320,18 @@ gst_base_audio_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
data = GST_BUFFER_DATA (buf); data = GST_BUFFER_DATA (buf);
len = GST_BUFFER_SIZE (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) if (res == -1)
goto stopped; 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))); gst_buffer_set_caps (buf, GST_PAD_CAPS (GST_BASE_SRC_PAD (psrc)));
*outbuf = buf; *outbuf = buf;
@ -378,6 +391,7 @@ gst_base_audio_src_change_state (GstElement * element,
} }
if (!gst_ring_buffer_open_device (src->ringbuffer)) if (!gst_ring_buffer_open_device (src->ringbuffer))
return GST_STATE_CHANGE_FAILURE; return GST_STATE_CHANGE_FAILURE;
src->next_sample = 0;
break; break;
case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_PAUSED:
break; break;
@ -394,8 +408,8 @@ gst_base_audio_src_change_state (GstElement * element,
gst_ring_buffer_pause (src->ringbuffer); gst_ring_buffer_pause (src->ringbuffer);
break; break;
case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_PAUSED_TO_READY:
gst_ring_buffer_stop (src->ringbuffer);
gst_ring_buffer_release (src->ringbuffer); gst_ring_buffer_release (src->ringbuffer);
src->next_sample = 0;
break; break;
case GST_STATE_CHANGE_READY_TO_NULL: case GST_STATE_CHANGE_READY_TO_NULL:
gst_ring_buffer_close_device (src->ringbuffer); gst_ring_buffer_close_device (src->ringbuffer);

View file

@ -57,6 +57,9 @@ struct _GstBaseAudioSrc {
GstClockTime buffer_time; GstClockTime buffer_time;
GstClockTime latency_time; GstClockTime latency_time;
/* the next sample to write */
guint64 next_sample;
/* clock */ /* clock */
GstClock *clock; GstClock *clock;

View file

@ -1065,9 +1065,10 @@ gst_ring_buffer_read (GstRingBuffer * buf, guint64 sample, guchar * data,
/* segment too far ahead, we need to drop */ /* segment too far ahead, we need to drop */
if (diff < 0) { if (diff < 0) {
/* we need to drop one segment at a time, pretend we wrote a /* we need to drop one segment at a time, pretend we read an
* segment. */ * empty segment. */
readlen = MIN (segsize, len); readlen = MIN (segsize, len);
memcpy (data, buf->empty_seg, readlen);
goto next; goto next;
} }