mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
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:
parent
a872aac9f8
commit
e846919fe9
4 changed files with 31 additions and 4 deletions
|
@ -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):
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue