audio: GstRingBuffer -> GstAudioRingBuffer

This commit is contained in:
Wim Taymans 2011-11-11 11:21:41 +01:00
parent b81af23992
commit 6511f36fdb
16 changed files with 569 additions and 556 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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__ */

View file

@ -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);

View file

@ -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 */

View file

@ -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);

View file

@ -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 */

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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__ */