mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
audio: GstRingBuffer -> GstAudioRingBuffer
This commit is contained in:
parent
b81af23992
commit
6511f36fdb
16 changed files with 569 additions and 556 deletions
|
@ -134,7 +134,6 @@ _GST_AUDIO_FORMAT_NE
|
|||
GstAudioClock
|
||||
GstAudioClockGetTimeFunc
|
||||
gst_audio_clock_new
|
||||
gst_audio_clock_new_full
|
||||
gst_audio_clock_adjust
|
||||
gst_audio_clock_get_time
|
||||
gst_audio_clock_reset
|
||||
|
@ -360,69 +359,69 @@ gst_audio_channel_position_get_type
|
|||
<SECTION>
|
||||
<FILE>gstringbuffer</FILE>
|
||||
<INCLUDE>gst/audio/gstringbuffer.h</INCLUDE>
|
||||
GstRingBuffer
|
||||
GstRingBufferClass
|
||||
GstRingBufferSpec
|
||||
GstRingBufferCallback
|
||||
GstRingBufferSegState
|
||||
GstRingBufferState
|
||||
GstAudioRingBuffer
|
||||
GstAudioRingBufferClass
|
||||
GstAudioRingBufferSpec
|
||||
GstAudioRingBufferCallback
|
||||
GstAudioRingBufferSegState
|
||||
GstAudioRingBufferState
|
||||
GstBufferFormatType
|
||||
|
||||
GST_RING_BUFFER_BROADCAST
|
||||
GST_RING_BUFFER_GET_COND
|
||||
GST_RING_BUFFER_SIGNAL
|
||||
GST_RING_BUFFER_WAIT
|
||||
GST_AUDIO_RING_BUFFER_BROADCAST
|
||||
GST_AUDIO_RING_BUFFER_GET_COND
|
||||
GST_AUDIO_RING_BUFFER_SIGNAL
|
||||
GST_AUDIO_RING_BUFFER_WAIT
|
||||
|
||||
gst_ring_buffer_set_callback
|
||||
gst_audio_ring_buffer_set_callback
|
||||
|
||||
gst_ring_buffer_acquire
|
||||
gst_ring_buffer_release
|
||||
gst_ring_buffer_is_acquired
|
||||
gst_audio_ring_buffer_acquire
|
||||
gst_audio_ring_buffer_release
|
||||
gst_audio_ring_buffer_is_acquired
|
||||
|
||||
gst_ring_buffer_activate
|
||||
gst_ring_buffer_is_active
|
||||
gst_audio_ring_buffer_activate
|
||||
gst_audio_ring_buffer_is_active
|
||||
|
||||
gst_ring_buffer_start
|
||||
gst_ring_buffer_pause
|
||||
gst_ring_buffer_stop
|
||||
gst_audio_ring_buffer_start
|
||||
gst_audio_ring_buffer_pause
|
||||
gst_audio_ring_buffer_stop
|
||||
|
||||
gst_ring_buffer_delay
|
||||
gst_ring_buffer_samples_done
|
||||
gst_ring_buffer_set_sample
|
||||
gst_ring_buffer_commit
|
||||
gst_ring_buffer_commit_full
|
||||
gst_ring_buffer_convert
|
||||
gst_audio_ring_buffer_delay
|
||||
gst_audio_ring_buffer_samples_done
|
||||
gst_audio_ring_buffer_set_sample
|
||||
gst_audio_ring_buffer_commit
|
||||
gst_audio_ring_buffer_commit_full
|
||||
gst_audio_ring_buffer_convert
|
||||
|
||||
gst_ring_buffer_prepare_read
|
||||
gst_ring_buffer_read
|
||||
gst_ring_buffer_clear
|
||||
gst_ring_buffer_clear_all
|
||||
gst_ring_buffer_advance
|
||||
gst_audio_ring_buffer_prepare_read
|
||||
gst_audio_ring_buffer_read
|
||||
gst_audio_ring_buffer_clear
|
||||
gst_audio_ring_buffer_clear_all
|
||||
gst_audio_ring_buffer_advance
|
||||
|
||||
gst_ring_buffer_close_device
|
||||
gst_ring_buffer_open_device
|
||||
gst_ring_buffer_device_is_open
|
||||
gst_audio_ring_buffer_close_device
|
||||
gst_audio_ring_buffer_open_device
|
||||
gst_audio_ring_buffer_device_is_open
|
||||
|
||||
gst_ring_buffer_may_start
|
||||
gst_ring_buffer_parse_caps
|
||||
gst_ring_buffer_set_flushing
|
||||
gst_audio_ring_buffer_may_start
|
||||
gst_audio_ring_buffer_parse_caps
|
||||
gst_audio_ring_buffer_set_flushing
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GST_TYPE_RING_BUFFER
|
||||
GST_RING_BUFFER
|
||||
GST_RING_BUFFER_CLASS
|
||||
GST_RING_BUFFER_GET_CLASS
|
||||
GST_IS_RING_BUFFER
|
||||
GST_IS_RING_BUFFER_CLASS
|
||||
GST_RING_BUFFER_CAST
|
||||
gst_ring_buffer_get_type
|
||||
GST_TYPE_RING_BUFFER_SEG_STATE
|
||||
gst_ring_buffer_seg_state_get_type
|
||||
GST_TYPE_RING_BUFFER_STATE
|
||||
gst_ring_buffer_state_get_type
|
||||
GST_TYPE_AUDIO_RING_BUFFER
|
||||
GST_AUDIO_RING_BUFFER
|
||||
GST_AUDIO_RING_BUFFER_CLASS
|
||||
GST_AUDIO_RING_BUFFER_GET_CLASS
|
||||
GST_IS_AUDIO_RING_BUFFER
|
||||
GST_IS_AUDIO_RING_BUFFER_CLASS
|
||||
GST_AUDIO_RING_BUFFER_CAST
|
||||
gst_audio_ring_buffer_get_type
|
||||
GST_TYPE_AUDIO_RING_BUFFER_SEG_STATE
|
||||
gst_audio_ring_buffer_seg_state_get_type
|
||||
GST_TYPE_AUDIO_RING_BUFFER_STATE
|
||||
gst_audio_ring_buffer_state_get_type
|
||||
<SUBSECTION Private>
|
||||
gst_ring_buffer_debug_spec_buff
|
||||
gst_ring_buffer_debug_spec_caps
|
||||
gst_audio_ring_buffer_debug_spec_buff
|
||||
gst_audio_ring_buffer_debug_spec_caps
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
|
|
|
@ -18,7 +18,7 @@ gst_base_audio_sink_get_type
|
|||
#include <gst/audio/gstbaseaudiosrc.h>
|
||||
gst_base_audio_src_get_type
|
||||
#include <gst/audio/gstringbuffer.h>
|
||||
gst_ring_buffer_get_type
|
||||
gst_audio_ring_buffer_get_type
|
||||
|
||||
|
||||
#include <gst/cdda/gstcddabasesrc.h>
|
||||
|
|
|
@ -83,7 +83,7 @@ static GstCaps *gst_alsasink_getcaps (GstBaseSink * bsink, GstCaps * filter);
|
|||
|
||||
static gboolean gst_alsasink_open (GstAudioSink * asink);
|
||||
static gboolean gst_alsasink_prepare (GstAudioSink * asink,
|
||||
GstRingBufferSpec * spec);
|
||||
GstAudioRingBufferSpec * spec);
|
||||
static gboolean gst_alsasink_unprepare (GstAudioSink * asink);
|
||||
static gboolean gst_alsasink_close (GstAudioSink * asink);
|
||||
static gint gst_alsasink_write (GstAudioSink * asink, gpointer data,
|
||||
|
@ -588,7 +588,7 @@ set_sw_params:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
alsasink_parse_spec (GstAlsaSink * alsa, GstRingBufferSpec * spec)
|
||||
alsasink_parse_spec (GstAlsaSink * alsa, GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
/* Initialize our boolean */
|
||||
alsa->iec958 = FALSE;
|
||||
|
@ -754,7 +754,7 @@ open_error:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_alsasink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
|
||||
gst_alsasink_prepare (GstAudioSink * asink, GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstAlsaSink *alsa;
|
||||
gint err;
|
||||
|
|
|
@ -81,7 +81,7 @@ static GstCaps *gst_alsasrc_getcaps (GstBaseSrc * bsrc, GstCaps * filter);
|
|||
|
||||
static gboolean gst_alsasrc_open (GstAudioSrc * asrc);
|
||||
static gboolean gst_alsasrc_prepare (GstAudioSrc * asrc,
|
||||
GstRingBufferSpec * spec);
|
||||
GstAudioRingBufferSpec * spec);
|
||||
static gboolean gst_alsasrc_unprepare (GstAudioSrc * asrc);
|
||||
static gboolean gst_alsasrc_close (GstAudioSrc * asrc);
|
||||
static guint gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length);
|
||||
|
@ -657,7 +657,7 @@ set_sw_params:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
alsasrc_parse_spec (GstAlsaSrc * alsa, GstRingBufferSpec * spec)
|
||||
alsasrc_parse_spec (GstAlsaSrc * alsa, GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
switch (spec->type) {
|
||||
case GST_BUFTYPE_RAW:
|
||||
|
@ -816,7 +816,7 @@ open_error:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_alsasrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
|
||||
gst_alsasrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstAlsaSrc *alsa;
|
||||
gint err;
|
||||
|
|
|
@ -72,7 +72,7 @@ caps_get_string_field (const GstCaps * caps, const gchar * field)
|
|||
* Since: 0.10.36
|
||||
*/
|
||||
guint
|
||||
gst_audio_iec61937_frame_size (const GstRingBufferSpec * spec)
|
||||
gst_audio_iec61937_frame_size (const GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
switch (spec->type) {
|
||||
case GST_BUFTYPE_AC3:
|
||||
|
@ -149,7 +149,7 @@ gst_audio_iec61937_frame_size (const GstRingBufferSpec * spec)
|
|||
*/
|
||||
gboolean
|
||||
gst_audio_iec61937_payload (const guint8 * src, guint src_n, guint8 * dst,
|
||||
guint dst_n, const GstRingBufferSpec * spec)
|
||||
guint dst_n, const GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
guint i, tmp;
|
||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||
|
|
|
@ -24,8 +24,8 @@
|
|||
|
||||
#include <gst/audio/gstringbuffer.h>
|
||||
|
||||
guint gst_audio_iec61937_frame_size (const GstRingBufferSpec * spec);
|
||||
guint gst_audio_iec61937_frame_size (const GstAudioRingBufferSpec * spec);
|
||||
gboolean gst_audio_iec61937_payload (const guint8 * src, guint src_n,
|
||||
guint8 * dst, guint dst_n, const GstRingBufferSpec * spec);
|
||||
guint8 * dst, guint dst_n, const GstAudioRingBufferSpec * spec);
|
||||
|
||||
#endif /* __GST_AUDIO_IEC61937_H__ */
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
/**
|
||||
* SECTION:gstaudiosink
|
||||
* @short_description: Simple base class for audio sinks
|
||||
* @see_also: #GstBaseAudioSink, #GstRingBuffer, #GstAudioSink.
|
||||
* @see_also: #GstBaseAudioSink, #GstAudioRingBuffer, #GstAudioSink.
|
||||
*
|
||||
* This is the most simple base class for audio sinks that only requires
|
||||
* subclasses to implement a set of simple functions:
|
||||
|
@ -62,7 +62,7 @@
|
|||
*
|
||||
* All scheduling of samples and timestamps is done in this base class
|
||||
* together with #GstBaseAudioSink using a default implementation of a
|
||||
* #GstRingBuffer that uses threads.
|
||||
* #GstAudioRingBuffer that uses threads.
|
||||
*
|
||||
* Last reviewed on 2006-09-27 (0.10.12)
|
||||
*/
|
||||
|
@ -99,7 +99,7 @@ typedef struct _GstAudioSinkRingBufferClass GstAudioSinkRingBufferClass;
|
|||
|
||||
struct _GstAudioSinkRingBuffer
|
||||
{
|
||||
GstRingBuffer object;
|
||||
GstAudioRingBuffer object;
|
||||
|
||||
gboolean running;
|
||||
gint queuedseg;
|
||||
|
@ -109,7 +109,7 @@ struct _GstAudioSinkRingBuffer
|
|||
|
||||
struct _GstAudioSinkRingBufferClass
|
||||
{
|
||||
GstRingBufferClass parent_class;
|
||||
GstAudioRingBufferClass parent_class;
|
||||
};
|
||||
|
||||
static void gst_audio_sink_ring_buffer_class_init (GstAudioSinkRingBufferClass *
|
||||
|
@ -119,18 +119,20 @@ static void gst_audio_sink_ring_buffer_init (GstAudioSinkRingBuffer *
|
|||
static void gst_audio_sink_ring_buffer_dispose (GObject * object);
|
||||
static void gst_audio_sink_ring_buffer_finalize (GObject * object);
|
||||
|
||||
static GstRingBufferClass *ring_parent_class = NULL;
|
||||
static GstAudioRingBufferClass *ring_parent_class = NULL;
|
||||
|
||||
static gboolean gst_audio_sink_ring_buffer_open_device (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_close_device (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_acquire (GstRingBuffer * buf,
|
||||
GstRingBufferSpec * spec);
|
||||
static gboolean gst_audio_sink_ring_buffer_release (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_start (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_pause (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_stop (GstRingBuffer * buf);
|
||||
static guint gst_audio_sink_ring_buffer_delay (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_activate (GstRingBuffer * buf,
|
||||
static gboolean gst_audio_sink_ring_buffer_open_device (GstAudioRingBuffer *
|
||||
buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_close_device (GstAudioRingBuffer *
|
||||
buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_acquire (GstAudioRingBuffer * buf,
|
||||
GstAudioRingBufferSpec * spec);
|
||||
static gboolean gst_audio_sink_ring_buffer_release (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_start (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_pause (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_stop (GstAudioRingBuffer * buf);
|
||||
static guint gst_audio_sink_ring_buffer_delay (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_sink_ring_buffer_activate (GstAudioRingBuffer * buf,
|
||||
gboolean active);
|
||||
|
||||
/* ringbuffer abstract base class */
|
||||
|
@ -154,8 +156,8 @@ gst_audio_sink_ring_buffer_get_type (void)
|
|||
};
|
||||
|
||||
ringbuffer_type =
|
||||
g_type_register_static (GST_TYPE_RING_BUFFER, "GstAudioSinkRingBuffer",
|
||||
&ringbuffer_info, 0);
|
||||
g_type_register_static (GST_TYPE_AUDIO_RING_BUFFER,
|
||||
"GstAudioSinkRingBuffer", &ringbuffer_info, 0);
|
||||
}
|
||||
return ringbuffer_type;
|
||||
}
|
||||
|
@ -164,10 +166,10 @@ static void
|
|||
gst_audio_sink_ring_buffer_class_init (GstAudioSinkRingBufferClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstRingBufferClass *gstringbuffer_class;
|
||||
GstAudioRingBufferClass *gstringbuffer_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstringbuffer_class = (GstRingBufferClass *) klass;
|
||||
gstringbuffer_class = (GstAudioRingBufferClass *) klass;
|
||||
|
||||
ring_parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
|
@ -205,7 +207,7 @@ typedef gint (*WriteFunc) (GstAudioSink * sink, gpointer data, guint length);
|
|||
* The start/stop methods control the thread.
|
||||
*/
|
||||
static void
|
||||
audioringbuffer_thread_func (GstRingBuffer * buf)
|
||||
audioringbuffer_thread_func (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -242,7 +244,7 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
|
|||
gint readseg;
|
||||
|
||||
/* buffer must be started */
|
||||
if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
|
||||
if (gst_audio_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
|
||||
gint written;
|
||||
|
||||
left = len;
|
||||
|
@ -263,16 +265,16 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
|
|||
} while (left > 0);
|
||||
|
||||
/* clear written samples */
|
||||
gst_ring_buffer_clear (buf, readseg);
|
||||
gst_audio_ring_buffer_clear (buf, readseg);
|
||||
|
||||
/* we wrote one segment */
|
||||
gst_ring_buffer_advance (buf, 1);
|
||||
gst_audio_ring_buffer_advance (buf, 1);
|
||||
} else {
|
||||
GST_OBJECT_LOCK (abuf);
|
||||
if (!abuf->running)
|
||||
goto stop_running;
|
||||
if (G_UNLIKELY (g_atomic_int_get (&buf->state) ==
|
||||
GST_RING_BUFFER_STATE_STARTED)) {
|
||||
GST_AUDIO_RING_BUFFER_STATE_STARTED)) {
|
||||
GST_OBJECT_UNLOCK (abuf);
|
||||
continue;
|
||||
}
|
||||
|
@ -338,7 +340,7 @@ gst_audio_sink_ring_buffer_finalize (GObject * object)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_open_device (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_open_device (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -363,7 +365,7 @@ could_not_open:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_close_device (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_close_device (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -388,8 +390,8 @@ could_not_close:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_acquire (GstRingBuffer * buf,
|
||||
GstRingBufferSpec * spec)
|
||||
gst_audio_sink_ring_buffer_acquire (GstAudioRingBuffer * buf,
|
||||
GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -420,7 +422,7 @@ could_not_prepare:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_activate (GstRingBuffer * buf, gboolean active)
|
||||
gst_audio_sink_ring_buffer_activate (GstAudioRingBuffer * buf, gboolean active)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkRingBuffer *abuf;
|
||||
|
@ -470,7 +472,7 @@ thread_failed:
|
|||
|
||||
/* function is called with LOCK */
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_release (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_release (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -501,7 +503,7 @@ could_not_unprepare:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_start (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_start (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
|
||||
|
@ -514,7 +516,7 @@ gst_audio_sink_ring_buffer_start (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_pause (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_pause (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -533,7 +535,7 @@ gst_audio_sink_ring_buffer_pause (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_sink_ring_buffer_stop (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_stop (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -559,7 +561,7 @@ gst_audio_sink_ring_buffer_stop (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static guint
|
||||
gst_audio_sink_ring_buffer_delay (GstRingBuffer * buf)
|
||||
gst_audio_sink_ring_buffer_delay (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSink *sink;
|
||||
GstAudioSinkClass *csink;
|
||||
|
@ -592,7 +594,7 @@ enum
|
|||
G_DEFINE_TYPE_WITH_CODE (GstAudioSink, gst_audio_sink,
|
||||
GST_TYPE_BASE_AUDIO_SINK, _do_init);
|
||||
|
||||
static GstRingBuffer *gst_audio_sink_create_ringbuffer (GstBaseAudioSink *
|
||||
static GstAudioRingBuffer *gst_audio_sink_create_ringbuffer (GstBaseAudioSink *
|
||||
sink);
|
||||
|
||||
static void
|
||||
|
@ -613,10 +615,10 @@ gst_audio_sink_init (GstAudioSink * audiosink)
|
|||
{
|
||||
}
|
||||
|
||||
static GstRingBuffer *
|
||||
static GstAudioRingBuffer *
|
||||
gst_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
|
||||
{
|
||||
GstRingBuffer *buffer;
|
||||
GstAudioRingBuffer *buffer;
|
||||
|
||||
GST_DEBUG_OBJECT (sink, "creating ringbuffer");
|
||||
buffer = g_object_new (GST_TYPE_AUDIO_SINK_RING_BUFFER, NULL);
|
||||
|
|
|
@ -77,7 +77,7 @@ struct _GstAudioSinkClass {
|
|||
/* open the device with given specs */
|
||||
gboolean (*open) (GstAudioSink *sink);
|
||||
/* prepare resources and state to operate with the given specs */
|
||||
gboolean (*prepare) (GstAudioSink *sink, GstRingBufferSpec *spec);
|
||||
gboolean (*prepare) (GstAudioSink *sink, GstAudioRingBufferSpec *spec);
|
||||
/* undo anything that was done in prepare() */
|
||||
gboolean (*unprepare) (GstAudioSink *sink);
|
||||
/* close the device */
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
/**
|
||||
* SECTION:gstaudiosrc
|
||||
* @short_description: Simple base class for audio sources
|
||||
* @see_also: #GstBaseAudioSrc, #GstRingBuffer, #GstAudioSrc.
|
||||
* @see_also: #GstBaseAudioSrc, #GstAudioRingBuffer, #GstAudioSrc.
|
||||
*
|
||||
* This is the most simple base class for audio sources that only requires
|
||||
* subclasses to implement a set of simple functions:
|
||||
|
@ -62,7 +62,7 @@
|
|||
*
|
||||
* All scheduling of samples and timestamps is done in this base class
|
||||
* together with #GstBaseAudioSrc using a default implementation of a
|
||||
* #GstRingBuffer that uses threads.
|
||||
* #GstAudioRingBuffer that uses threads.
|
||||
*
|
||||
* Last reviewed on 2006-09-27 (0.10.12)
|
||||
*/
|
||||
|
@ -97,7 +97,7 @@ typedef struct _GstAudioSrcRingBufferClass GstAudioSrcRingBufferClass;
|
|||
|
||||
struct _GstAudioSrcRingBuffer
|
||||
{
|
||||
GstRingBuffer object;
|
||||
GstAudioRingBuffer object;
|
||||
|
||||
gboolean running;
|
||||
gint queuedseg;
|
||||
|
@ -107,7 +107,7 @@ struct _GstAudioSrcRingBuffer
|
|||
|
||||
struct _GstAudioSrcRingBufferClass
|
||||
{
|
||||
GstRingBufferClass parent_class;
|
||||
GstAudioRingBufferClass parent_class;
|
||||
};
|
||||
|
||||
static void gst_audio_src_ring_buffer_class_init (GstAudioSrcRingBufferClass *
|
||||
|
@ -117,16 +117,18 @@ static void gst_audio_src_ring_buffer_init (GstAudioSrcRingBuffer * ringbuffer,
|
|||
static void gst_audio_src_ring_buffer_dispose (GObject * object);
|
||||
static void gst_audio_src_ring_buffer_finalize (GObject * object);
|
||||
|
||||
static GstRingBufferClass *ring_parent_class = NULL;
|
||||
static GstAudioRingBufferClass *ring_parent_class = NULL;
|
||||
|
||||
static gboolean gst_audio_src_ring_buffer_open_device (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_close_device (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_acquire (GstRingBuffer * buf,
|
||||
GstRingBufferSpec * spec);
|
||||
static gboolean gst_audio_src_ring_buffer_release (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_start (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_stop (GstRingBuffer * buf);
|
||||
static guint gst_audio_src_ring_buffer_delay (GstRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_open_device (GstAudioRingBuffer *
|
||||
buf);
|
||||
static gboolean gst_audio_src_ring_buffer_close_device (GstAudioRingBuffer *
|
||||
buf);
|
||||
static gboolean gst_audio_src_ring_buffer_acquire (GstAudioRingBuffer * buf,
|
||||
GstAudioRingBufferSpec * spec);
|
||||
static gboolean gst_audio_src_ring_buffer_release (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_start (GstAudioRingBuffer * buf);
|
||||
static gboolean gst_audio_src_ring_buffer_stop (GstAudioRingBuffer * buf);
|
||||
static guint gst_audio_src_ring_buffer_delay (GstAudioRingBuffer * buf);
|
||||
|
||||
/* ringbuffer abstract base class */
|
||||
static GType
|
||||
|
@ -149,8 +151,8 @@ gst_audio_src_ring_buffer_get_type (void)
|
|||
};
|
||||
|
||||
ringbuffer_type =
|
||||
g_type_register_static (GST_TYPE_RING_BUFFER, "GstAudioSrcRingBuffer",
|
||||
&ringbuffer_info, 0);
|
||||
g_type_register_static (GST_TYPE_AUDIO_RING_BUFFER,
|
||||
"GstAudioSrcRingBuffer", &ringbuffer_info, 0);
|
||||
}
|
||||
return ringbuffer_type;
|
||||
}
|
||||
|
@ -159,10 +161,10 @@ static void
|
|||
gst_audio_src_ring_buffer_class_init (GstAudioSrcRingBufferClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstRingBufferClass *gstringbuffer_class;
|
||||
GstAudioRingBufferClass *gstringbuffer_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstringbuffer_class = (GstRingBufferClass *) klass;
|
||||
gstringbuffer_class = (GstAudioRingBufferClass *) klass;
|
||||
|
||||
ring_parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
|
@ -196,7 +198,7 @@ typedef guint (*ReadFunc) (GstAudioSrc * src, gpointer data, guint length);
|
|||
* The start/stop methods control the thread.
|
||||
*/
|
||||
static void
|
||||
audioringbuffer_thread_func (GstRingBuffer * buf)
|
||||
audioringbuffer_thread_func (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -228,7 +230,7 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
|
|||
guint8 *readptr;
|
||||
gint readseg;
|
||||
|
||||
if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
|
||||
if (gst_audio_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
|
||||
gint read;
|
||||
|
||||
left = len;
|
||||
|
@ -247,13 +249,13 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
|
|||
} while (left > 0);
|
||||
|
||||
/* we read one segment */
|
||||
gst_ring_buffer_advance (buf, 1);
|
||||
gst_audio_ring_buffer_advance (buf, 1);
|
||||
} else {
|
||||
GST_OBJECT_LOCK (abuf);
|
||||
if (!abuf->running)
|
||||
goto stop_running;
|
||||
if (G_UNLIKELY (g_atomic_int_get (&buf->state) ==
|
||||
GST_RING_BUFFER_STATE_STARTED)) {
|
||||
GST_AUDIO_RING_BUFFER_STATE_STARTED)) {
|
||||
GST_OBJECT_UNLOCK (abuf);
|
||||
continue;
|
||||
}
|
||||
|
@ -322,7 +324,7 @@ gst_audio_src_ring_buffer_finalize (GObject * object)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_open_device (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_open_device (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -346,7 +348,7 @@ could_not_open:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_close_device (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_close_device (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -370,8 +372,8 @@ could_not_open:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_acquire (GstRingBuffer * buf,
|
||||
GstRingBufferSpec * spec)
|
||||
gst_audio_src_ring_buffer_acquire (GstAudioRingBuffer * buf,
|
||||
GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -408,7 +410,7 @@ could_not_open:
|
|||
|
||||
/* function is called with LOCK */
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_release (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_release (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -439,7 +441,7 @@ gst_audio_src_ring_buffer_release (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_start (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_start (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GST_DEBUG ("start, sending signal");
|
||||
GST_AUDIO_SRC_RING_BUFFER_SIGNAL (buf);
|
||||
|
@ -448,7 +450,7 @@ gst_audio_src_ring_buffer_start (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_audio_src_ring_buffer_stop (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_stop (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -472,7 +474,7 @@ gst_audio_src_ring_buffer_stop (GstRingBuffer * buf)
|
|||
}
|
||||
|
||||
static guint
|
||||
gst_audio_src_ring_buffer_delay (GstRingBuffer * buf)
|
||||
gst_audio_src_ring_buffer_delay (GstAudioRingBuffer * buf)
|
||||
{
|
||||
GstAudioSrc *src;
|
||||
GstAudioSrcClass *csrc;
|
||||
|
@ -505,7 +507,8 @@ enum
|
|||
G_DEFINE_TYPE_WITH_CODE (GstAudioSrc, gst_audio_src,
|
||||
GST_TYPE_BASE_AUDIO_SRC, _do_init);
|
||||
|
||||
static GstRingBuffer *gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src);
|
||||
static GstAudioRingBuffer *gst_audio_src_create_ringbuffer (GstBaseAudioSrc *
|
||||
src);
|
||||
|
||||
static void
|
||||
gst_audio_src_class_init (GstAudioSrcClass * klass)
|
||||
|
@ -525,10 +528,10 @@ gst_audio_src_init (GstAudioSrc * audiosrc)
|
|||
{
|
||||
}
|
||||
|
||||
static GstRingBuffer *
|
||||
static GstAudioRingBuffer *
|
||||
gst_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
|
||||
{
|
||||
GstRingBuffer *buffer;
|
||||
GstAudioRingBuffer *buffer;
|
||||
|
||||
GST_DEBUG ("creating ringbuffer");
|
||||
buffer = g_object_new (GST_TYPE_AUDIO_SRC_RING_BUFFER, NULL);
|
||||
|
|
|
@ -75,7 +75,7 @@ struct _GstAudioSrcClass {
|
|||
/* open the device with given specs */
|
||||
gboolean (*open) (GstAudioSrc *src);
|
||||
/* prepare resources and state to operate with the given specs */
|
||||
gboolean (*prepare) (GstAudioSrc *src, GstRingBufferSpec *spec);
|
||||
gboolean (*prepare) (GstAudioSrc *src, GstAudioRingBufferSpec *spec);
|
||||
/* undo anything that was done in prepare() */
|
||||
gboolean (*unprepare) (GstAudioSrc *src);
|
||||
/* close the device */
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
/**
|
||||
* SECTION:gstbaseaudiosink
|
||||
* @short_description: Base class for audio sinks
|
||||
* @see_also: #GstAudioSink, #GstRingBuffer.
|
||||
* @see_also: #GstAudioSink, #GstAudioRingBuffer.
|
||||
*
|
||||
* This is the base class for audio sinks. Subclasses need to implement the
|
||||
* ::create_ringbuffer vmethod. This base class will then take care of
|
||||
|
@ -165,8 +165,8 @@ static gboolean gst_base_audio_sink_query (GstElement * element, GstQuery *
|
|||
static GstClock *gst_base_audio_sink_provide_clock (GstElement * elem);
|
||||
static GstClockTime gst_base_audio_sink_get_time (GstClock * clock,
|
||||
GstBaseAudioSink * sink);
|
||||
static void gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data,
|
||||
guint len, gpointer user_data);
|
||||
static void gst_base_audio_sink_callback (GstAudioRingBuffer * rbuf,
|
||||
guint8 * data, guint len, gpointer user_data);
|
||||
|
||||
static GstFlowReturn gst_base_audio_sink_preroll (GstBaseSink * bsink,
|
||||
GstBuffer * buffer);
|
||||
|
@ -292,7 +292,7 @@ gst_base_audio_sink_class_init (GstBaseAudioSinkClass * klass)
|
|||
/* ref class from a thread-safe context to work around missing bit of
|
||||
* thread-safety in GObject */
|
||||
g_type_class_ref (GST_TYPE_AUDIO_CLOCK);
|
||||
g_type_class_ref (GST_TYPE_RING_BUFFER);
|
||||
g_type_class_ref (GST_TYPE_AUDIO_RING_BUFFER);
|
||||
|
||||
}
|
||||
|
||||
|
@ -356,7 +356,7 @@ gst_base_audio_sink_provide_clock (GstElement * elem)
|
|||
if (sink->ringbuffer == NULL)
|
||||
goto wrong_state;
|
||||
|
||||
if (!gst_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
if (!gst_audio_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
goto wrong_state;
|
||||
|
||||
GST_OBJECT_LOCK (sink);
|
||||
|
@ -400,8 +400,9 @@ gst_base_audio_sink_query_pad (GstBaseSink * bsink, GstQuery * query)
|
|||
|
||||
if (basesink->ringbuffer) {
|
||||
gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL);
|
||||
res = gst_ring_buffer_convert (basesink->ringbuffer, src_fmt, src_val,
|
||||
dest_fmt, &dest_val);
|
||||
res =
|
||||
gst_audio_ring_buffer_convert (basesink->ringbuffer, src_fmt,
|
||||
src_val, dest_fmt, &dest_val);
|
||||
if (res) {
|
||||
gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
|
||||
}
|
||||
|
@ -439,7 +440,7 @@ gst_base_audio_sink_query (GstElement * element, GstQuery * query)
|
|||
|
||||
/* we and upstream are both live, adjust the min_latency */
|
||||
if (live && us_live) {
|
||||
GstRingBufferSpec *spec;
|
||||
GstAudioRingBufferSpec *spec;
|
||||
|
||||
GST_OBJECT_LOCK (basesink);
|
||||
if (!basesink->ringbuffer || !basesink->ringbuffer->spec.info.rate) {
|
||||
|
@ -492,8 +493,9 @@ gst_base_audio_sink_query (GstElement * element, GstQuery * query)
|
|||
|
||||
if (basesink->ringbuffer) {
|
||||
gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, NULL);
|
||||
res = gst_ring_buffer_convert (basesink->ringbuffer, src_fmt, src_val,
|
||||
dest_fmt, &dest_val);
|
||||
res =
|
||||
gst_audio_ring_buffer_convert (basesink->ringbuffer, src_fmt,
|
||||
src_val, dest_fmt, &dest_val);
|
||||
if (res) {
|
||||
gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
|
||||
}
|
||||
|
@ -521,11 +523,11 @@ gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink)
|
|||
return GST_CLOCK_TIME_NONE;
|
||||
|
||||
/* our processed samples are always increasing */
|
||||
raw = samples = gst_ring_buffer_samples_done (sink->ringbuffer);
|
||||
raw = samples = gst_audio_ring_buffer_samples_done (sink->ringbuffer);
|
||||
|
||||
/* the number of samples not yet processed, this is still queued in the
|
||||
* device (not played for playback). */
|
||||
delay = gst_ring_buffer_delay (sink->ringbuffer);
|
||||
delay = gst_audio_ring_buffer_delay (sink->ringbuffer);
|
||||
|
||||
if (G_LIKELY (samples >= delay))
|
||||
samples -= delay;
|
||||
|
@ -851,7 +853,7 @@ static gboolean
|
|||
gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
||||
{
|
||||
GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
|
||||
GstRingBufferSpec *spec;
|
||||
GstAudioRingBufferSpec *spec;
|
||||
GstClockTime now;
|
||||
GstClockTime crate_num, crate_denom;
|
||||
|
||||
|
@ -871,9 +873,9 @@ gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
GST_DEBUG_OBJECT (sink, "time was %" GST_TIME_FORMAT, GST_TIME_ARGS (now));
|
||||
|
||||
/* release old ringbuffer */
|
||||
gst_ring_buffer_pause (sink->ringbuffer);
|
||||
gst_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_ring_buffer_release (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_pause (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_release (sink->ringbuffer);
|
||||
|
||||
GST_DEBUG_OBJECT (sink, "parse caps");
|
||||
|
||||
|
@ -881,18 +883,18 @@ gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
spec->latency_time = sink->latency_time;
|
||||
|
||||
/* parse new caps */
|
||||
if (!gst_ring_buffer_parse_caps (spec, caps))
|
||||
if (!gst_audio_ring_buffer_parse_caps (spec, caps))
|
||||
goto parse_error;
|
||||
|
||||
gst_ring_buffer_debug_spec_buff (spec);
|
||||
gst_audio_ring_buffer_debug_spec_buff (spec);
|
||||
|
||||
GST_DEBUG_OBJECT (sink, "acquire ringbuffer");
|
||||
if (!gst_ring_buffer_acquire (sink->ringbuffer, spec))
|
||||
if (!gst_audio_ring_buffer_acquire (sink->ringbuffer, spec))
|
||||
goto acquire_error;
|
||||
|
||||
if (bsink->pad_mode == GST_PAD_ACTIVATE_PUSH) {
|
||||
GST_DEBUG_OBJECT (sink, "activate ringbuffer");
|
||||
gst_ring_buffer_activate (sink->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_activate (sink->ringbuffer, TRUE);
|
||||
}
|
||||
|
||||
/* due to possible changes in the spec file we should recalibrate the clock */
|
||||
|
@ -909,7 +911,7 @@ gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
|
||||
spec->buffer_time = spec->segtotal * spec->latency_time;
|
||||
|
||||
gst_ring_buffer_debug_spec_buff (spec);
|
||||
gst_audio_ring_buffer_debug_spec_buff (spec);
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
@ -982,8 +984,8 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
|
|||
/* need to start playback before we can drain, but only when
|
||||
* we have successfully negotiated a format and thus acquired the
|
||||
* ringbuffer. */
|
||||
if (gst_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
gst_ring_buffer_start (sink->ringbuffer);
|
||||
if (gst_audio_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
gst_audio_ring_buffer_start (sink->ringbuffer);
|
||||
|
||||
if (sink->priv->eos_time != -1) {
|
||||
GST_DEBUG_OBJECT (sink,
|
||||
|
@ -1008,7 +1010,7 @@ gst_base_audio_sink_event (GstBaseSink * bsink, GstEvent * event)
|
|||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_FLUSH_START:
|
||||
if (sink->ringbuffer)
|
||||
gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
|
||||
break;
|
||||
case GST_EVENT_FLUSH_STOP:
|
||||
/* always resync on sample after a flush */
|
||||
|
@ -1017,7 +1019,7 @@ gst_base_audio_sink_event (GstBaseSink * bsink, GstEvent * event)
|
|||
sink->priv->eos_time = -1;
|
||||
sink->priv->discont_time = -1;
|
||||
if (sink->ringbuffer)
|
||||
gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
||||
break;
|
||||
case GST_EVENT_EOS:
|
||||
/* now wait till we played everything */
|
||||
|
@ -1034,7 +1036,7 @@ gst_base_audio_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer)
|
|||
{
|
||||
GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
|
||||
|
||||
if (!gst_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
if (!gst_audio_ring_buffer_is_acquired (sink->ringbuffer))
|
||||
goto wrong_state;
|
||||
|
||||
/* we don't really do anything when prerolling. We could make a
|
||||
|
@ -1398,7 +1400,7 @@ gst_base_audio_sink_sync_latency (GstBaseSink * bsink, GstMiniObject * obj)
|
|||
}
|
||||
|
||||
/* start ringbuffer so we can start slaving right away when we need to */
|
||||
gst_ring_buffer_start (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_start (sink->ringbuffer);
|
||||
|
||||
GST_DEBUG_OBJECT (sink,
|
||||
"internal time: %" GST_TIME_FORMAT " external time: %" GST_TIME_FORMAT,
|
||||
|
@ -1453,7 +1455,7 @@ static gint64
|
|||
gst_base_audio_sink_get_alignment (GstBaseAudioSink * sink,
|
||||
GstClockTime sample_offset)
|
||||
{
|
||||
GstRingBuffer *ringbuf = sink->ringbuffer;
|
||||
GstAudioRingBuffer *ringbuf = sink->ringbuffer;
|
||||
gint64 align;
|
||||
gint64 sample_diff;
|
||||
gint64 max_sample_diff;
|
||||
|
@ -1535,7 +1537,7 @@ gst_base_audio_sink_render (GstBaseSink * bsink, GstBuffer * buf)
|
|||
GstClockTimeDiff sync_offset, ts_offset;
|
||||
GstBaseAudioSinkClass *bclass;
|
||||
GstBaseAudioSink *sink;
|
||||
GstRingBuffer *ringbuf;
|
||||
GstAudioRingBuffer *ringbuf;
|
||||
gint64 diff, align;
|
||||
guint64 ctime, cstop;
|
||||
gsize offset;
|
||||
|
@ -1559,7 +1561,7 @@ gst_base_audio_sink_render (GstBaseSink * bsink, GstBuffer * buf)
|
|||
ringbuf = sink->ringbuffer;
|
||||
|
||||
/* can't do anything when we don't have the device */
|
||||
if (G_UNLIKELY (!gst_ring_buffer_is_acquired (ringbuf)))
|
||||
if (G_UNLIKELY (!gst_audio_ring_buffer_is_acquired (ringbuf)))
|
||||
goto wrong_state;
|
||||
|
||||
/* Wait for upstream latency before starting the ringbuffer, we do this so
|
||||
|
@ -1830,8 +1832,8 @@ no_sync:
|
|||
data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
|
||||
do {
|
||||
written =
|
||||
gst_ring_buffer_commit_full (ringbuf, &sample_offset, data + offset,
|
||||
samples, out_samples, &accum);
|
||||
gst_audio_ring_buffer_commit_full (ringbuf, &sample_offset,
|
||||
data + offset, samples, out_samples, &accum);
|
||||
|
||||
GST_DEBUG_OBJECT (sink, "wrote %u of %u", written, samples);
|
||||
/* if we wrote all, we're done */
|
||||
|
@ -1870,7 +1872,7 @@ no_sync:
|
|||
if (GST_CLOCK_TIME_IS_VALID (stop) && stop >= bsink->segment.stop) {
|
||||
GST_DEBUG_OBJECT (sink,
|
||||
"start playback because we are at the end of segment");
|
||||
gst_ring_buffer_start (ringbuf);
|
||||
gst_audio_ring_buffer_start (ringbuf);
|
||||
}
|
||||
|
||||
ret = GST_FLOW_OK;
|
||||
|
@ -1936,17 +1938,17 @@ sync_latency_failed:
|
|||
* gst_base_audio_sink_create_ringbuffer:
|
||||
* @sink: a #GstBaseAudioSink.
|
||||
*
|
||||
* Create and return the #GstRingBuffer for @sink. This function will call the
|
||||
* Create and return the #GstAudioRingBuffer for @sink. This function will call the
|
||||
* ::create_ringbuffer vmethod and will set @sink as the parent of the returned
|
||||
* buffer (see gst_object_set_parent()).
|
||||
*
|
||||
* Returns: The new ringbuffer of @sink.
|
||||
*/
|
||||
GstRingBuffer *
|
||||
GstAudioRingBuffer *
|
||||
gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
|
||||
{
|
||||
GstBaseAudioSinkClass *bclass;
|
||||
GstRingBuffer *buffer = NULL;
|
||||
GstAudioRingBuffer *buffer = NULL;
|
||||
|
||||
bclass = GST_BASE_AUDIO_SINK_GET_CLASS (sink);
|
||||
if (bclass->create_ringbuffer)
|
||||
|
@ -1959,8 +1961,8 @@ gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_base_audio_sink_callback (GstRingBuffer * rbuf, guint8 * data, guint len,
|
||||
gpointer user_data)
|
||||
gst_base_audio_sink_callback (GstAudioRingBuffer * rbuf, guint8 * data,
|
||||
guint len, gpointer user_data)
|
||||
{
|
||||
GstBaseSink *basesink;
|
||||
GstBaseAudioSink *sink;
|
||||
|
@ -2019,7 +2021,7 @@ error:
|
|||
{
|
||||
GST_WARNING_OBJECT (basesink, "Got flow '%s' but can't return it: %d",
|
||||
gst_flow_get_name (ret), ret);
|
||||
gst_ring_buffer_pause (rbuf);
|
||||
gst_audio_ring_buffer_pause (rbuf);
|
||||
GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
|
||||
return;
|
||||
}
|
||||
|
@ -2030,7 +2032,7 @@ eos:
|
|||
* set segment.stop and segment.duration to the last sample or so */
|
||||
GST_DEBUG_OBJECT (sink, "EOS");
|
||||
gst_base_audio_sink_drain (sink);
|
||||
gst_ring_buffer_pause (rbuf);
|
||||
gst_audio_ring_buffer_pause (rbuf);
|
||||
gst_element_post_message (GST_ELEMENT_CAST (sink),
|
||||
gst_message_new_eos (GST_OBJECT_CAST (sink)));
|
||||
GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
|
||||
|
@ -2038,7 +2040,7 @@ eos:
|
|||
flushing:
|
||||
{
|
||||
GST_DEBUG_OBJECT (sink, "we are flushing");
|
||||
gst_ring_buffer_pause (rbuf);
|
||||
gst_audio_ring_buffer_pause (rbuf);
|
||||
GST_BASE_SINK_PREROLL_UNLOCK (basesink);
|
||||
GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
|
||||
return;
|
||||
|
@ -2046,7 +2048,7 @@ flushing:
|
|||
preroll_error:
|
||||
{
|
||||
GST_DEBUG_OBJECT (sink, "error %s", gst_flow_get_name (ret));
|
||||
gst_ring_buffer_pause (rbuf);
|
||||
gst_audio_ring_buffer_pause (rbuf);
|
||||
GST_BASE_SINK_PREROLL_UNLOCK (basesink);
|
||||
GST_PAD_STREAM_UNLOCK (basesink->sinkpad);
|
||||
return;
|
||||
|
@ -2062,14 +2064,14 @@ gst_base_audio_sink_activate_pull (GstBaseSink * basesink, gboolean active)
|
|||
if (active) {
|
||||
GST_DEBUG_OBJECT (basesink, "activating pull");
|
||||
|
||||
gst_ring_buffer_set_callback (sink->ringbuffer,
|
||||
gst_audio_ring_buffer_set_callback (sink->ringbuffer,
|
||||
gst_base_audio_sink_callback, sink);
|
||||
|
||||
ret = gst_ring_buffer_activate (sink->ringbuffer, TRUE);
|
||||
ret = gst_audio_ring_buffer_activate (sink->ringbuffer, TRUE);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (basesink, "deactivating pull");
|
||||
gst_ring_buffer_set_callback (sink->ringbuffer, NULL, NULL);
|
||||
ret = gst_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_set_callback (sink->ringbuffer, NULL, NULL);
|
||||
ret = gst_audio_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -2086,10 +2088,10 @@ gst_base_audio_sink_async_play (GstBaseSink * basesink)
|
|||
|
||||
GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
|
||||
sink->priv->sync_latency = TRUE;
|
||||
gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
||||
if (basesink->pad_mode == GST_PAD_ACTIVATE_PULL) {
|
||||
/* we always start the ringbuffer in pull mode immediatly */
|
||||
gst_ring_buffer_start (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_start (sink->ringbuffer);
|
||||
}
|
||||
|
||||
return GST_STATE_CHANGE_SUCCESS;
|
||||
|
@ -2109,7 +2111,7 @@ gst_base_audio_sink_change_state (GstElement * element,
|
|||
gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
|
||||
sink->ringbuffer = gst_base_audio_sink_create_ringbuffer (sink);
|
||||
}
|
||||
if (!gst_ring_buffer_open_device (sink->ringbuffer))
|
||||
if (!gst_audio_ring_buffer_open_device (sink->ringbuffer))
|
||||
goto open_failed;
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||
|
@ -2117,8 +2119,8 @@ gst_base_audio_sink_change_state (GstElement * element,
|
|||
sink->priv->last_align = -1;
|
||||
sink->priv->eos_time = -1;
|
||||
sink->priv->discont_time = -1;
|
||||
gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
||||
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||
|
||||
/* Only post clock-provide messages if this is the clock that
|
||||
* we've created. If the subclass has overriden it the subclass
|
||||
|
@ -2140,20 +2142,20 @@ gst_base_audio_sink_change_state (GstElement * element,
|
|||
eos = GST_BASE_SINK (sink)->eos;
|
||||
GST_OBJECT_UNLOCK (sink);
|
||||
|
||||
gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_may_start (sink->ringbuffer, TRUE);
|
||||
if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_PAD_ACTIVATE_PULL ||
|
||||
g_atomic_int_get (&sink->eos_rendering) || eos) {
|
||||
/* we always start the ringbuffer in pull mode immediatly */
|
||||
/* sync rendering on eos needs running clock,
|
||||
* and others need running clock when finished rendering eos */
|
||||
gst_ring_buffer_start (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_start (sink->ringbuffer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||
/* ringbuffer cannot start anymore */
|
||||
gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||
gst_ring_buffer_pause (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_may_start (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_pause (sink->ringbuffer);
|
||||
|
||||
GST_OBJECT_LOCK (sink);
|
||||
sink->priv->sync_latency = FALSE;
|
||||
|
@ -2172,7 +2174,7 @@ gst_base_audio_sink_change_state (GstElement * element,
|
|||
|
||||
/* make sure we unblock before calling the parent state change
|
||||
* so it can grab the STREAM_LOCK */
|
||||
gst_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_set_flushing (sink->ringbuffer, TRUE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2186,17 +2188,17 @@ gst_base_audio_sink_change_state (GstElement * element,
|
|||
gst_clock_set_master (sink->provided_clock, NULL);
|
||||
break;
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||
gst_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_ring_buffer_release (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_release (sink->ringbuffer);
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
/* we release again here because the aqcuire happens when setting the
|
||||
* caps, which happens before we commit the state to PAUSED and thus the
|
||||
* PAUSED->READY state change (see above, where we release the ringbuffer)
|
||||
* might not be called when we get here. */
|
||||
gst_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_ring_buffer_release (sink->ringbuffer);
|
||||
gst_ring_buffer_close_device (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_activate (sink->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_release (sink->ringbuffer);
|
||||
gst_audio_ring_buffer_close_device (sink->ringbuffer);
|
||||
GST_OBJECT_LOCK (sink);
|
||||
gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
|
||||
sink->ringbuffer = NULL;
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
* function will be used to perform a pull_range() on the sinkpad.
|
||||
* The thread scheduling the callback can be a real-time thread.
|
||||
*
|
||||
* Subclasses must implement a GstRingBuffer in addition to overriding
|
||||
* Subclasses must implement a GstAudioRingBuffer in addition to overriding
|
||||
* the methods in GstBaseSink and this class.
|
||||
*/
|
||||
|
||||
|
@ -107,25 +107,25 @@ typedef struct _GstBaseAudioSinkPrivate GstBaseAudioSinkPrivate;
|
|||
* Opaque #GstBaseAudioSink.
|
||||
*/
|
||||
struct _GstBaseAudioSink {
|
||||
GstBaseSink element;
|
||||
GstBaseSink element;
|
||||
|
||||
/*< protected >*/ /* with LOCK */
|
||||
/* our ringbuffer */
|
||||
GstRingBuffer *ringbuffer;
|
||||
GstAudioRingBuffer *ringbuffer;
|
||||
|
||||
/* required buffer and latency in microseconds */
|
||||
guint64 buffer_time;
|
||||
guint64 latency_time;
|
||||
guint64 buffer_time;
|
||||
guint64 latency_time;
|
||||
|
||||
/* the next sample to write */
|
||||
guint64 next_sample;
|
||||
guint64 next_sample;
|
||||
|
||||
/* clock */
|
||||
gboolean provide_clock;
|
||||
GstClock *provided_clock;
|
||||
gboolean provide_clock;
|
||||
GstClock *provided_clock;
|
||||
|
||||
/* with g_atomic_; currently rendering eos */
|
||||
gboolean eos_rendering;
|
||||
gboolean eos_rendering;
|
||||
|
||||
/*< private >*/
|
||||
GstBaseAudioSinkPrivate *priv;
|
||||
|
@ -136,7 +136,7 @@ struct _GstBaseAudioSink {
|
|||
/**
|
||||
* GstBaseAudioSinkClass:
|
||||
* @parent_class: the parent class.
|
||||
* @create_ringbuffer: create and return a #GstRingBuffer to write to.
|
||||
* @create_ringbuffer: create and return a #GstAudioRingBuffer to write to.
|
||||
* @payload: payload data in a format suitable to write to the sink. If no
|
||||
* payloading is required, returns a reffed copy of the original
|
||||
* buffer, else returns the payloaded buffer with all other metadata
|
||||
|
@ -146,14 +146,14 @@ struct _GstBaseAudioSink {
|
|||
* functionality.
|
||||
*/
|
||||
struct _GstBaseAudioSinkClass {
|
||||
GstBaseSinkClass parent_class;
|
||||
GstBaseSinkClass parent_class;
|
||||
|
||||
/* subclass ringbuffer allocation */
|
||||
GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSink *sink);
|
||||
GstAudioRingBuffer* (*create_ringbuffer) (GstBaseAudioSink *sink);
|
||||
|
||||
/* subclass payloader */
|
||||
GstBuffer* (*payload) (GstBaseAudioSink *sink,
|
||||
GstBuffer *buffer);
|
||||
GstBuffer* (*payload) (GstBaseAudioSink *sink,
|
||||
GstBuffer *buffer);
|
||||
/*< private >*/
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
@ -161,29 +161,30 @@ struct _GstBaseAudioSinkClass {
|
|||
GType gst_base_audio_sink_get_type(void);
|
||||
GType gst_base_audio_sink_slave_method_get_type (void);
|
||||
|
||||
GstRingBuffer *gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink);
|
||||
GstAudioRingBuffer *
|
||||
gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink);
|
||||
|
||||
void gst_base_audio_sink_set_provide_clock (GstBaseAudioSink *sink, gboolean provide);
|
||||
gboolean gst_base_audio_sink_get_provide_clock (GstBaseAudioSink *sink);
|
||||
void gst_base_audio_sink_set_provide_clock (GstBaseAudioSink *sink, gboolean provide);
|
||||
gboolean gst_base_audio_sink_get_provide_clock (GstBaseAudioSink *sink);
|
||||
|
||||
void gst_base_audio_sink_set_slave_method (GstBaseAudioSink *sink,
|
||||
GstBaseAudioSinkSlaveMethod method);
|
||||
void gst_base_audio_sink_set_slave_method (GstBaseAudioSink *sink,
|
||||
GstBaseAudioSinkSlaveMethod method);
|
||||
GstBaseAudioSinkSlaveMethod
|
||||
gst_base_audio_sink_get_slave_method (GstBaseAudioSink *sink);
|
||||
gst_base_audio_sink_get_slave_method (GstBaseAudioSink *sink);
|
||||
|
||||
void gst_base_audio_sink_set_drift_tolerance (GstBaseAudioSink *sink,
|
||||
gint64 drift_tolerance);
|
||||
gint64 gst_base_audio_sink_get_drift_tolerance (GstBaseAudioSink *sink);
|
||||
void gst_base_audio_sink_set_drift_tolerance (GstBaseAudioSink *sink,
|
||||
gint64 drift_tolerance);
|
||||
gint64 gst_base_audio_sink_get_drift_tolerance (GstBaseAudioSink *sink);
|
||||
|
||||
void gst_base_audio_sink_set_alignment_threshold (GstBaseAudioSink * sink,
|
||||
GstClockTime alignment_threshold);
|
||||
GstClockTime
|
||||
gst_base_audio_sink_get_alignment_threshold (GstBaseAudioSink * sink);
|
||||
|
||||
void gst_base_audio_sink_set_discont_wait (GstBaseAudioSink * sink,
|
||||
GstClockTime discont_wait);
|
||||
void gst_base_audio_sink_set_discont_wait (GstBaseAudioSink * sink,
|
||||
GstClockTime discont_wait);
|
||||
GstClockTime
|
||||
gst_base_audio_sink_get_discont_wait (GstBaseAudioSink * sink);
|
||||
gst_base_audio_sink_get_discont_wait (GstBaseAudioSink * sink);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
/**
|
||||
* SECTION:gstbaseaudiosrc
|
||||
* @short_description: Base class for audio sources
|
||||
* @see_also: #GstAudioSrc, #GstRingBuffer.
|
||||
* @see_also: #GstAudioSrc, #GstAudioRingBuffer.
|
||||
*
|
||||
* This is the base class for audio sources. Subclasses need to implement the
|
||||
* ::create_ringbuffer vmethod. This base class will then take care of
|
||||
|
@ -230,7 +230,7 @@ gst_base_audio_src_class_init (GstBaseAudioSrcClass * klass)
|
|||
/* ref class from a thread-safe context to work around missing bit of
|
||||
* thread-safety in GObject */
|
||||
g_type_class_ref (GST_TYPE_AUDIO_CLOCK);
|
||||
g_type_class_ref (GST_TYPE_RING_BUFFER);
|
||||
g_type_class_ref (GST_TYPE_AUDIO_RING_BUFFER);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -291,7 +291,7 @@ gst_base_audio_src_provide_clock (GstElement * elem)
|
|||
if (src->ringbuffer == NULL)
|
||||
goto wrong_state;
|
||||
|
||||
if (!gst_ring_buffer_is_acquired (src->ringbuffer))
|
||||
if (!gst_audio_ring_buffer_is_acquired (src->ringbuffer))
|
||||
goto wrong_state;
|
||||
|
||||
GST_OBJECT_LOCK (src);
|
||||
|
@ -328,11 +328,11 @@ gst_base_audio_src_get_time (GstClock * clock, GstBaseAudioSrc * src)
|
|||
|| src->ringbuffer->spec.info.rate == 0))
|
||||
return GST_CLOCK_TIME_NONE;
|
||||
|
||||
raw = samples = gst_ring_buffer_samples_done (src->ringbuffer);
|
||||
raw = samples = gst_audio_ring_buffer_samples_done (src->ringbuffer);
|
||||
|
||||
/* the number of samples not yet processed, this is still queued in the
|
||||
* device (not yet read for capture). */
|
||||
delay = gst_ring_buffer_delay (src->ringbuffer);
|
||||
delay = gst_audio_ring_buffer_delay (src->ringbuffer);
|
||||
|
||||
samples += delay;
|
||||
|
||||
|
@ -527,7 +527,7 @@ static gboolean
|
|||
gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
|
||||
{
|
||||
GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc);
|
||||
GstRingBufferSpec *spec;
|
||||
GstAudioRingBufferSpec *spec;
|
||||
gint bpf, rate;
|
||||
|
||||
spec = &src->ringbuffer->spec;
|
||||
|
@ -536,7 +536,7 @@ gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
|
|||
spec->latency_time = src->latency_time;
|
||||
|
||||
GST_OBJECT_LOCK (src);
|
||||
if (!gst_ring_buffer_parse_caps (spec, caps)) {
|
||||
if (!gst_audio_ring_buffer_parse_caps (spec, caps)) {
|
||||
GST_OBJECT_UNLOCK (src);
|
||||
goto parse_error;
|
||||
}
|
||||
|
@ -552,13 +552,13 @@ gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
|
|||
|
||||
GST_DEBUG ("release old ringbuffer");
|
||||
|
||||
gst_ring_buffer_release (src->ringbuffer);
|
||||
gst_audio_ring_buffer_release (src->ringbuffer);
|
||||
|
||||
gst_ring_buffer_debug_spec_buff (spec);
|
||||
gst_audio_ring_buffer_debug_spec_buff (spec);
|
||||
|
||||
GST_DEBUG ("acquire new ringbuffer");
|
||||
|
||||
if (!gst_ring_buffer_acquire (src->ringbuffer, spec))
|
||||
if (!gst_audio_ring_buffer_acquire (src->ringbuffer, spec))
|
||||
goto acquire_error;
|
||||
|
||||
/* calculate actual latency and buffer times */
|
||||
|
@ -566,7 +566,7 @@ gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
|
|||
spec->buffer_time =
|
||||
spec->segtotal * spec->segsize * GST_MSECOND / (rate * bpf);
|
||||
|
||||
gst_ring_buffer_debug_spec_buff (spec);
|
||||
gst_audio_ring_buffer_debug_spec_buff (spec);
|
||||
|
||||
g_object_notify (G_OBJECT (src), "actual-buffer-time");
|
||||
g_object_notify (G_OBJECT (src), "actual-latency-time");
|
||||
|
@ -606,7 +606,7 @@ gst_base_audio_src_query (GstBaseSrc * bsrc, GstQuery * query)
|
|||
case GST_QUERY_LATENCY:
|
||||
{
|
||||
GstClockTime min_latency, max_latency;
|
||||
GstRingBufferSpec *spec;
|
||||
GstAudioRingBufferSpec *spec;
|
||||
gint bpf, rate;
|
||||
|
||||
GST_OBJECT_LOCK (src);
|
||||
|
@ -671,14 +671,14 @@ gst_base_audio_src_event (GstBaseSrc * bsrc, GstEvent * event)
|
|||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_FLUSH_START:
|
||||
GST_DEBUG_OBJECT (bsrc, "flush-start");
|
||||
gst_ring_buffer_pause (src->ringbuffer);
|
||||
gst_ring_buffer_clear_all (src->ringbuffer);
|
||||
gst_audio_ring_buffer_pause (src->ringbuffer);
|
||||
gst_audio_ring_buffer_clear_all (src->ringbuffer);
|
||||
break;
|
||||
case GST_EVENT_FLUSH_STOP:
|
||||
GST_DEBUG_OBJECT (bsrc, "flush-stop");
|
||||
/* always resync on sample after a flush */
|
||||
src->next_sample = -1;
|
||||
gst_ring_buffer_clear_all (src->ringbuffer);
|
||||
gst_audio_ring_buffer_clear_all (src->ringbuffer);
|
||||
break;
|
||||
case GST_EVENT_SEEK:
|
||||
GST_DEBUG_OBJECT (bsrc, "refuse to seek");
|
||||
|
@ -755,8 +755,8 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
|
|||
guint samples, total_samples;
|
||||
guint64 sample;
|
||||
gint bpf, rate;
|
||||
GstRingBuffer *ringbuffer;
|
||||
GstRingBufferSpec *spec;
|
||||
GstAudioRingBuffer *ringbuffer;
|
||||
GstAudioRingBufferSpec *spec;
|
||||
guint read;
|
||||
GstClockTime timestamp, duration;
|
||||
GstClock *clock;
|
||||
|
@ -764,7 +764,7 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
|
|||
ringbuffer = src->ringbuffer;
|
||||
spec = &ringbuffer->spec;
|
||||
|
||||
if (G_UNLIKELY (!gst_ring_buffer_is_acquired (ringbuffer)))
|
||||
if (G_UNLIKELY (!gst_audio_ring_buffer_is_acquired (ringbuffer)))
|
||||
goto wrong_state;
|
||||
|
||||
bpf = GST_AUDIO_INFO_BPF (&spec->info);
|
||||
|
@ -803,7 +803,7 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
|
|||
|
||||
data = ptr = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
|
||||
do {
|
||||
read = gst_ring_buffer_read (ringbuffer, sample, ptr, samples);
|
||||
read = gst_audio_ring_buffer_read (ringbuffer, sample, ptr, samples);
|
||||
GST_DEBUG_OBJECT (src, "read %u of %u", read, samples);
|
||||
/* if we read all, we're done */
|
||||
if (read == samples)
|
||||
|
@ -932,7 +932,7 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
|
|||
segment_diff = running_time_segment - last_written_segment;
|
||||
|
||||
/* advance the ringbuffer */
|
||||
gst_ring_buffer_advance (ringbuffer, segment_diff);
|
||||
gst_audio_ring_buffer_advance (ringbuffer, segment_diff);
|
||||
|
||||
/* we move the new read segment to the last known written segment */
|
||||
new_read_segment =
|
||||
|
@ -1045,17 +1045,17 @@ stopped:
|
|||
* gst_base_audio_src_create_ringbuffer:
|
||||
* @src: a #GstBaseAudioSrc.
|
||||
*
|
||||
* Create and return the #GstRingBuffer for @src. This function will call the
|
||||
* Create and return the #GstAudioRingBuffer for @src. This function will call the
|
||||
* ::create_ringbuffer vmethod and will set @src as the parent of the returned
|
||||
* buffer (see gst_object_set_parent()).
|
||||
*
|
||||
* Returns: The new ringbuffer of @src.
|
||||
*/
|
||||
GstRingBuffer *
|
||||
GstAudioRingBuffer *
|
||||
gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc * src)
|
||||
{
|
||||
GstBaseAudioSrcClass *bclass;
|
||||
GstRingBuffer *buffer = NULL;
|
||||
GstAudioRingBuffer *buffer = NULL;
|
||||
|
||||
bclass = GST_BASE_AUDIO_SRC_GET_CLASS (src);
|
||||
if (bclass->create_ringbuffer)
|
||||
|
@ -1083,14 +1083,14 @@ gst_base_audio_src_change_state (GstElement * element,
|
|||
src->ringbuffer = gst_base_audio_src_create_ringbuffer (src);
|
||||
}
|
||||
GST_OBJECT_UNLOCK (src);
|
||||
if (!gst_ring_buffer_open_device (src->ringbuffer))
|
||||
if (!gst_audio_ring_buffer_open_device (src->ringbuffer))
|
||||
goto open_failed;
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||
GST_DEBUG_OBJECT (src, "READY->PAUSED");
|
||||
src->next_sample = -1;
|
||||
gst_ring_buffer_set_flushing (src->ringbuffer, FALSE);
|
||||
gst_ring_buffer_may_start (src->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_set_flushing (src->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_may_start (src->ringbuffer, FALSE);
|
||||
/* Only post clock-provide messages if this is the clock that
|
||||
* we've created. If the subclass has overriden it the subclass
|
||||
* should post this messages whenever necessary */
|
||||
|
@ -1103,12 +1103,12 @@ gst_base_audio_src_change_state (GstElement * element,
|
|||
break;
|
||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||
GST_DEBUG_OBJECT (src, "PAUSED->PLAYING");
|
||||
gst_ring_buffer_may_start (src->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_may_start (src->ringbuffer, TRUE);
|
||||
break;
|
||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||
GST_DEBUG_OBJECT (src, "PLAYING->PAUSED");
|
||||
gst_ring_buffer_may_start (src->ringbuffer, FALSE);
|
||||
gst_ring_buffer_pause (src->ringbuffer);
|
||||
gst_audio_ring_buffer_may_start (src->ringbuffer, FALSE);
|
||||
gst_audio_ring_buffer_pause (src->ringbuffer);
|
||||
break;
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||
GST_DEBUG_OBJECT (src, "PAUSED->READY");
|
||||
|
@ -1120,7 +1120,7 @@ gst_base_audio_src_change_state (GstElement * element,
|
|||
(GstAudioClockGetTimeFunc) gst_base_audio_src_get_time)
|
||||
gst_element_post_message (element,
|
||||
gst_message_new_clock_lost (GST_OBJECT_CAST (element), src->clock));
|
||||
gst_ring_buffer_set_flushing (src->ringbuffer, TRUE);
|
||||
gst_audio_ring_buffer_set_flushing (src->ringbuffer, TRUE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -1131,11 +1131,11 @@ gst_base_audio_src_change_state (GstElement * element,
|
|||
switch (transition) {
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||
GST_DEBUG_OBJECT (src, "PAUSED->READY");
|
||||
gst_ring_buffer_release (src->ringbuffer);
|
||||
gst_audio_ring_buffer_release (src->ringbuffer);
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
GST_DEBUG_OBJECT (src, "READY->NULL");
|
||||
gst_ring_buffer_close_device (src->ringbuffer);
|
||||
gst_audio_ring_buffer_close_device (src->ringbuffer);
|
||||
GST_OBJECT_LOCK (src);
|
||||
gst_object_unparent (GST_OBJECT_CAST (src->ringbuffer));
|
||||
src->ringbuffer = NULL;
|
||||
|
|
|
@ -87,21 +87,21 @@ typedef enum
|
|||
* Opaque #GstBaseAudioSrc.
|
||||
*/
|
||||
struct _GstBaseAudioSrc {
|
||||
GstPushSrc element;
|
||||
GstPushSrc element;
|
||||
|
||||
/*< protected >*/ /* with LOCK */
|
||||
/* our ringbuffer */
|
||||
GstRingBuffer *ringbuffer;
|
||||
GstAudioRingBuffer *ringbuffer;
|
||||
|
||||
/* required buffer and latency */
|
||||
GstClockTime buffer_time;
|
||||
GstClockTime latency_time;
|
||||
GstClockTime buffer_time;
|
||||
GstClockTime latency_time;
|
||||
|
||||
/* the next sample to write */
|
||||
guint64 next_sample;
|
||||
guint64 next_sample;
|
||||
|
||||
/* clock */
|
||||
GstClock *clock;
|
||||
GstClock *clock;
|
||||
|
||||
/*< private >*/
|
||||
GstBaseAudioSrcPrivate *priv;
|
||||
|
@ -112,16 +112,16 @@ struct _GstBaseAudioSrc {
|
|||
/**
|
||||
* GstBaseAudioSrcClass:
|
||||
* @parent_class: the parent class.
|
||||
* @create_ringbuffer: create and return a #GstRingBuffer to read from.
|
||||
* @create_ringbuffer: create and return a #GstAudioRingBuffer to read from.
|
||||
*
|
||||
* #GstBaseAudioSrc class. Override the vmethod to implement
|
||||
* functionality.
|
||||
*/
|
||||
struct _GstBaseAudioSrcClass {
|
||||
GstPushSrcClass parent_class;
|
||||
GstPushSrcClass parent_class;
|
||||
|
||||
/* subclass ringbuffer allocation */
|
||||
GstRingBuffer* (*create_ringbuffer) (GstBaseAudioSrc *src);
|
||||
GstAudioRingBuffer* (*create_ringbuffer) (GstBaseAudioSrc *src);
|
||||
|
||||
/*< private >*/
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
|
@ -130,7 +130,8 @@ struct _GstBaseAudioSrcClass {
|
|||
GType gst_base_audio_src_get_type(void);
|
||||
GType gst_base_audio_src_slave_method_get_type (void);
|
||||
|
||||
GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src);
|
||||
GstAudioRingBuffer *
|
||||
gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src);
|
||||
|
||||
void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide);
|
||||
gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -20,54 +20,54 @@
|
|||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GST_RING_BUFFER_H__
|
||||
#define __GST_RING_BUFFER_H__
|
||||
#ifndef __GST_AUDIO_RING_BUFFER_H__
|
||||
#define __GST_AUDIO_RING_BUFFER_H__
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/audio/audio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_RING_BUFFER (gst_ring_buffer_get_type())
|
||||
#define GST_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RING_BUFFER,GstRingBuffer))
|
||||
#define GST_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RING_BUFFER,GstRingBufferClass))
|
||||
#define GST_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_RING_BUFFER, GstRingBufferClass))
|
||||
#define GST_RING_BUFFER_CAST(obj) ((GstRingBuffer *)obj)
|
||||
#define GST_IS_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RING_BUFFER))
|
||||
#define GST_IS_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RING_BUFFER))
|
||||
#define GST_TYPE_AUDIO_RING_BUFFER (gst_audio_ring_buffer_get_type())
|
||||
#define GST_AUDIO_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_RING_BUFFER,GstAudioRingBuffer))
|
||||
#define GST_AUDIO_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_RING_BUFFER,GstAudioRingBufferClass))
|
||||
#define GST_AUDIO_RING_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AUDIO_RING_BUFFER, GstAudioRingBufferClass))
|
||||
#define GST_AUDIO_RING_BUFFER_CAST(obj) ((GstAudioRingBuffer *)obj)
|
||||
#define GST_IS_AUDIO_RING_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_RING_BUFFER))
|
||||
#define GST_IS_AUDIO_RING_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_RING_BUFFER))
|
||||
|
||||
typedef struct _GstRingBuffer GstRingBuffer;
|
||||
typedef struct _GstRingBufferClass GstRingBufferClass;
|
||||
typedef struct _GstRingBufferSpec GstRingBufferSpec;
|
||||
typedef struct _GstAudioRingBuffer GstAudioRingBuffer;
|
||||
typedef struct _GstAudioRingBufferClass GstAudioRingBufferClass;
|
||||
typedef struct _GstAudioRingBufferSpec GstAudioRingBufferSpec;
|
||||
|
||||
/**
|
||||
* GstRingBufferCallback:
|
||||
* @rbuf: a #GstRingBuffer
|
||||
* GstAudioRingBufferCallback:
|
||||
* @rbuf: a #GstAudioRingBuffer
|
||||
* @data: target to fill
|
||||
* @len: amount to fill
|
||||
* @user_data: user data
|
||||
*
|
||||
* This function is set with gst_ring_buffer_set_callback() and is
|
||||
* This function is set with gst_audio_ring_buffer_set_callback() and is
|
||||
* called to fill the memory at @data with @len bytes of samples.
|
||||
*/
|
||||
typedef void (*GstRingBufferCallback) (GstRingBuffer *rbuf, guint8* data, guint len, gpointer user_data);
|
||||
typedef void (*GstAudioRingBufferCallback) (GstAudioRingBuffer *rbuf, guint8* data, guint len, gpointer user_data);
|
||||
|
||||
/**
|
||||
* GstRingBufferState:
|
||||
* @GST_RING_BUFFER_STATE_STOPPED: The ringbuffer is stopped
|
||||
* @GST_RING_BUFFER_STATE_PAUSED: The ringbuffer is paused
|
||||
* @GST_RING_BUFFER_STATE_STARTED: The ringbuffer is started
|
||||
* GstAudioRingBufferState:
|
||||
* @GST_AUDIO_RING_BUFFER_STATE_STOPPED: The ringbuffer is stopped
|
||||
* @GST_AUDIO_RING_BUFFER_STATE_PAUSED: The ringbuffer is paused
|
||||
* @GST_AUDIO_RING_BUFFER_STATE_STARTED: The ringbuffer is started
|
||||
*
|
||||
* The state of the ringbuffer.
|
||||
*/
|
||||
typedef enum {
|
||||
GST_RING_BUFFER_STATE_STOPPED,
|
||||
GST_RING_BUFFER_STATE_PAUSED,
|
||||
GST_RING_BUFFER_STATE_STARTED
|
||||
} GstRingBufferState;
|
||||
GST_AUDIO_RING_BUFFER_STATE_STOPPED,
|
||||
GST_AUDIO_RING_BUFFER_STATE_PAUSED,
|
||||
GST_AUDIO_RING_BUFFER_STATE_STARTED
|
||||
} GstAudioRingBufferState;
|
||||
|
||||
/**
|
||||
* GstRingBufferSegState:
|
||||
* GstAudioRingBufferSegState:
|
||||
* @GST_SEGSTATE_INVALID: The content of the segment is invalid
|
||||
* @GST_SEGSTATE_EMPTY: The segment is empty
|
||||
* @GST_SEGSTATE_FILLED: The segment contains valid data
|
||||
|
@ -80,7 +80,7 @@ typedef enum {
|
|||
GST_SEGSTATE_EMPTY,
|
||||
GST_SEGSTATE_FILLED,
|
||||
GST_SEGSTATE_PARTIAL
|
||||
} GstRingBufferSegState;
|
||||
} GstAudioRingBufferSegState;
|
||||
|
||||
/**
|
||||
* GstBufferFormatType:
|
||||
|
@ -116,7 +116,7 @@ typedef enum
|
|||
} GstBufferFormatType;
|
||||
|
||||
/**
|
||||
* GstRingBufferSpec:
|
||||
* GstAudioRingBufferSpec:
|
||||
* @caps: The caps that generated the Spec.
|
||||
* @type: the sample type
|
||||
* @info: the #GstAudioInfo
|
||||
|
@ -129,7 +129,7 @@ typedef enum
|
|||
*
|
||||
* The structure containing the format specification of the ringbuffer.
|
||||
*/
|
||||
struct _GstRingBufferSpec
|
||||
struct _GstAudioRingBufferSpec
|
||||
{
|
||||
/*< public >*/
|
||||
/* in */
|
||||
|
@ -160,13 +160,13 @@ struct _GstRingBufferSpec
|
|||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
#define GST_RING_BUFFER_GET_COND(buf) (((GstRingBuffer *)buf)->cond)
|
||||
#define GST_RING_BUFFER_WAIT(buf) (g_cond_wait (GST_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
|
||||
#define GST_RING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_RING_BUFFER_GET_COND (buf)))
|
||||
#define GST_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_RING_BUFFER_GET_COND (buf)))
|
||||
#define GST_AUDIO_RING_BUFFER_GET_COND(buf) (((GstAudioRingBuffer *)buf)->cond)
|
||||
#define GST_AUDIO_RING_BUFFER_WAIT(buf) (g_cond_wait (GST_AUDIO_RING_BUFFER_GET_COND (buf), GST_OBJECT_GET_LOCK (buf)))
|
||||
#define GST_AUDIO_RING_BUFFER_SIGNAL(buf) (g_cond_signal (GST_AUDIO_RING_BUFFER_GET_COND (buf)))
|
||||
#define GST_AUDIO_RING_BUFFER_BROADCAST(buf)(g_cond_broadcast (GST_AUDIO_RING_BUFFER_GET_COND (buf)))
|
||||
|
||||
/**
|
||||
* GstRingBuffer:
|
||||
* GstAudioRingBuffer:
|
||||
* @cond: used to signal start/stop/pause/resume actions
|
||||
* @open: boolean indicating that the ringbuffer is open
|
||||
* @acquired: boolean indicating that the ringbuffer is acquired
|
||||
|
@ -183,41 +183,41 @@ struct _GstRingBufferSpec
|
|||
*
|
||||
* The ringbuffer base class structure.
|
||||
*/
|
||||
struct _GstRingBuffer {
|
||||
GstObject object;
|
||||
struct _GstAudioRingBuffer {
|
||||
GstObject object;
|
||||
|
||||
/*< public >*/ /* with LOCK */
|
||||
GCond *cond;
|
||||
gboolean open;
|
||||
gboolean acquired;
|
||||
guint8 *memory;
|
||||
gsize size;
|
||||
GstRingBufferSpec spec;
|
||||
GstRingBufferSegState *segstate;
|
||||
gint samples_per_seg;
|
||||
guint8 *empty_seg;
|
||||
GCond *cond;
|
||||
gboolean open;
|
||||
gboolean acquired;
|
||||
guint8 *memory;
|
||||
gsize size;
|
||||
GstAudioRingBufferSpec spec;
|
||||
GstAudioRingBufferSegState *segstate;
|
||||
gint samples_per_seg;
|
||||
guint8 *empty_seg;
|
||||
|
||||
/*< public >*/ /* ATOMIC */
|
||||
gint state;
|
||||
gint segdone;
|
||||
gint segbase;
|
||||
gint waiting;
|
||||
gint state;
|
||||
gint segdone;
|
||||
gint segbase;
|
||||
gint waiting;
|
||||
|
||||
/*< private >*/
|
||||
GstRingBufferCallback callback;
|
||||
gpointer cb_data;
|
||||
GstAudioRingBufferCallback callback;
|
||||
gpointer cb_data;
|
||||
|
||||
gboolean flushing;
|
||||
gboolean flushing;
|
||||
/* ATOMIC */
|
||||
gint may_start;
|
||||
gboolean active;
|
||||
gint may_start;
|
||||
gboolean active;
|
||||
|
||||
/*< private >*/
|
||||
gpointer _gst_reserved[GST_PADDING + 0];
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
/**
|
||||
* GstRingBufferClass:
|
||||
* GstAudioRingBufferClass:
|
||||
* @parent_class: parent class
|
||||
* @open_device: open the device, don't set any params or allocate anything
|
||||
* @acquire: allocate the resources for the ringbuffer using the given spec
|
||||
|
@ -235,104 +235,105 @@ struct _GstRingBuffer {
|
|||
*
|
||||
* The vmethods that subclasses can override to implement the ringbuffer.
|
||||
*/
|
||||
struct _GstRingBufferClass {
|
||||
struct _GstAudioRingBufferClass {
|
||||
GstObjectClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
gboolean (*open_device) (GstRingBuffer *buf);
|
||||
gboolean (*acquire) (GstRingBuffer *buf, GstRingBufferSpec *spec);
|
||||
gboolean (*release) (GstRingBuffer *buf);
|
||||
gboolean (*close_device) (GstRingBuffer *buf);
|
||||
gboolean (*open_device) (GstAudioRingBuffer *buf);
|
||||
gboolean (*acquire) (GstAudioRingBuffer *buf, GstAudioRingBufferSpec *spec);
|
||||
gboolean (*release) (GstAudioRingBuffer *buf);
|
||||
gboolean (*close_device) (GstAudioRingBuffer *buf);
|
||||
|
||||
gboolean (*start) (GstRingBuffer *buf);
|
||||
gboolean (*pause) (GstRingBuffer *buf);
|
||||
gboolean (*resume) (GstRingBuffer *buf);
|
||||
gboolean (*stop) (GstRingBuffer *buf);
|
||||
gboolean (*start) (GstAudioRingBuffer *buf);
|
||||
gboolean (*pause) (GstAudioRingBuffer *buf);
|
||||
gboolean (*resume) (GstAudioRingBuffer *buf);
|
||||
gboolean (*stop) (GstAudioRingBuffer *buf);
|
||||
|
||||
guint (*delay) (GstRingBuffer *buf);
|
||||
guint (*delay) (GstAudioRingBuffer *buf);
|
||||
|
||||
/* ABI added */
|
||||
gboolean (*activate) (GstRingBuffer *buf, gboolean active);
|
||||
gboolean (*activate) (GstAudioRingBuffer *buf, gboolean active);
|
||||
|
||||
guint (*commit) (GstRingBuffer * buf, guint64 *sample,
|
||||
guint (*commit) (GstAudioRingBuffer * buf, guint64 *sample,
|
||||
guchar * data, gint in_samples,
|
||||
gint out_samples, gint * accum);
|
||||
|
||||
void (*clear_all) (GstRingBuffer * buf);
|
||||
void (*clear_all) (GstAudioRingBuffer * buf);
|
||||
|
||||
/*< private >*/
|
||||
gpointer _gst_reserved[GST_PADDING - 3];
|
||||
gpointer _gst_reserved[GST_PADDING];
|
||||
};
|
||||
|
||||
GType gst_ring_buffer_get_type(void);
|
||||
GType gst_audio_ring_buffer_get_type(void);
|
||||
|
||||
/* callback stuff */
|
||||
void gst_ring_buffer_set_callback (GstRingBuffer *buf, GstRingBufferCallback cb,
|
||||
gpointer user_data);
|
||||
void gst_audio_ring_buffer_set_callback (GstAudioRingBuffer *buf,
|
||||
GstAudioRingBufferCallback cb,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean gst_ring_buffer_parse_caps (GstRingBufferSpec *spec, GstCaps *caps);
|
||||
void gst_ring_buffer_debug_spec_caps (GstRingBufferSpec *spec);
|
||||
void gst_ring_buffer_debug_spec_buff (GstRingBufferSpec *spec);
|
||||
gboolean gst_audio_ring_buffer_parse_caps (GstAudioRingBufferSpec *spec, GstCaps *caps);
|
||||
void gst_audio_ring_buffer_debug_spec_caps (GstAudioRingBufferSpec *spec);
|
||||
void gst_audio_ring_buffer_debug_spec_buff (GstAudioRingBufferSpec *spec);
|
||||
|
||||
gboolean gst_ring_buffer_convert (GstRingBuffer * buf, GstFormat src_fmt,
|
||||
gint64 src_val, GstFormat dest_fmt,
|
||||
gint64 * dest_val);
|
||||
gboolean gst_audio_ring_buffer_convert (GstAudioRingBuffer * buf, GstFormat src_fmt,
|
||||
gint64 src_val, GstFormat dest_fmt,
|
||||
gint64 * dest_val);
|
||||
|
||||
/* device state */
|
||||
gboolean gst_ring_buffer_open_device (GstRingBuffer *buf);
|
||||
gboolean gst_ring_buffer_close_device (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_open_device (GstAudioRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_close_device (GstAudioRingBuffer *buf);
|
||||
|
||||
gboolean gst_ring_buffer_device_is_open (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_device_is_open (GstAudioRingBuffer *buf);
|
||||
|
||||
/* allocate resources */
|
||||
gboolean gst_ring_buffer_acquire (GstRingBuffer *buf, GstRingBufferSpec *spec);
|
||||
gboolean gst_ring_buffer_release (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_acquire (GstAudioRingBuffer *buf, GstAudioRingBufferSpec *spec);
|
||||
gboolean gst_audio_ring_buffer_release (GstAudioRingBuffer *buf);
|
||||
|
||||
gboolean gst_ring_buffer_is_acquired (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_is_acquired (GstAudioRingBuffer *buf);
|
||||
|
||||
/* activating */
|
||||
gboolean gst_ring_buffer_activate (GstRingBuffer *buf, gboolean active);
|
||||
gboolean gst_ring_buffer_is_active (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_activate (GstAudioRingBuffer *buf, gboolean active);
|
||||
gboolean gst_audio_ring_buffer_is_active (GstAudioRingBuffer *buf);
|
||||
|
||||
/* flushing */
|
||||
void gst_ring_buffer_set_flushing (GstRingBuffer *buf, gboolean flushing);
|
||||
void gst_audio_ring_buffer_set_flushing (GstAudioRingBuffer *buf, gboolean flushing);
|
||||
|
||||
/* playback/pause */
|
||||
gboolean gst_ring_buffer_start (GstRingBuffer *buf);
|
||||
gboolean gst_ring_buffer_pause (GstRingBuffer *buf);
|
||||
gboolean gst_ring_buffer_stop (GstRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_start (GstAudioRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_pause (GstAudioRingBuffer *buf);
|
||||
gboolean gst_audio_ring_buffer_stop (GstAudioRingBuffer *buf);
|
||||
|
||||
/* get status */
|
||||
guint gst_ring_buffer_delay (GstRingBuffer *buf);
|
||||
guint64 gst_ring_buffer_samples_done (GstRingBuffer *buf);
|
||||
guint gst_audio_ring_buffer_delay (GstAudioRingBuffer *buf);
|
||||
guint64 gst_audio_ring_buffer_samples_done (GstAudioRingBuffer *buf);
|
||||
|
||||
void gst_ring_buffer_set_sample (GstRingBuffer *buf, guint64 sample);
|
||||
void gst_audio_ring_buffer_set_sample (GstAudioRingBuffer *buf, guint64 sample);
|
||||
|
||||
/* clear all segments */
|
||||
void gst_ring_buffer_clear_all (GstRingBuffer *buf);
|
||||
void gst_audio_ring_buffer_clear_all (GstAudioRingBuffer *buf);
|
||||
|
||||
/* commit samples */
|
||||
guint gst_ring_buffer_commit (GstRingBuffer *buf, guint64 sample,
|
||||
guchar *data, guint len);
|
||||
guint gst_ring_buffer_commit_full (GstRingBuffer * buf, guint64 *sample,
|
||||
guchar * data, gint in_samples,
|
||||
gint out_samples, gint * accum);
|
||||
guint gst_audio_ring_buffer_commit (GstAudioRingBuffer *buf, guint64 sample,
|
||||
guchar *data, guint len);
|
||||
guint gst_audio_ring_buffer_commit_full (GstAudioRingBuffer * buf, guint64 *sample,
|
||||
guchar * data, gint in_samples,
|
||||
gint out_samples, gint * accum);
|
||||
|
||||
/* read samples */
|
||||
guint gst_ring_buffer_read (GstRingBuffer *buf, guint64 sample,
|
||||
guchar *data, guint len);
|
||||
guint gst_audio_ring_buffer_read (GstAudioRingBuffer *buf, guint64 sample,
|
||||
guchar *data, guint len);
|
||||
|
||||
/* mostly protected */
|
||||
/* not yet implemented
|
||||
gboolean gst_ring_buffer_prepare_write (GstRingBuffer *buf, gint *segment, guint8 **writeptr, gint *len);
|
||||
gboolean gst_audio_ring_buffer_prepare_write (GstAudioRingBuffer *buf, gint *segment, guint8 **writeptr, gint *len);
|
||||
*/
|
||||
gboolean gst_ring_buffer_prepare_read (GstRingBuffer *buf, gint *segment, guint8 **readptr, gint *len);
|
||||
void gst_ring_buffer_clear (GstRingBuffer *buf, gint segment);
|
||||
void gst_ring_buffer_advance (GstRingBuffer *buf, guint advance);
|
||||
|
||||
void gst_ring_buffer_may_start (GstRingBuffer *buf, gboolean allowed);
|
||||
gboolean gst_audio_ring_buffer_prepare_read (GstAudioRingBuffer *buf, gint *segment,
|
||||
guint8 **readptr, gint *len);
|
||||
void gst_audio_ring_buffer_clear (GstAudioRingBuffer *buf, gint segment);
|
||||
void gst_audio_ring_buffer_advance (GstAudioRingBuffer *buf, guint advance);
|
||||
|
||||
void gst_audio_ring_buffer_may_start (GstAudioRingBuffer *buf, gboolean allowed);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_RING_BUFFER_H__ */
|
||||
#endif /* __GST_AUDIO_RING_BUFFER_H__ */
|
||||
|
|
Loading…
Reference in a new issue