mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 00:36:51 +00:00
opensles: Port to 1.0
This commit is contained in:
parent
1e1d4da87c
commit
e0026d7203
9 changed files with 131 additions and 168 deletions
|
@ -323,7 +323,7 @@ GST_PLUGINS_NONPORTED=" aiff \
|
|||
decklink fbdev linsys vcd \
|
||||
apexsink cdaudio cog dc1394 dirac directfb \
|
||||
gsettings jasper ladspa \
|
||||
musepack musicbrainz nas neon ofa openal opensles rsvg sdl sndfile timidity \
|
||||
musepack musicbrainz nas neon ofa openal rsvg sdl sndfile timidity \
|
||||
directdraw direct3d9 acm wininet \
|
||||
wildmidi xvid lv2 teletextdec sndio uvch264"
|
||||
AC_SUBST(GST_PLUGINS_NONPORTED)
|
||||
|
|
|
@ -9,13 +9,12 @@ libgstopensles_la_SOURCES = openslesringbuffer.c \
|
|||
libgstopensles_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \
|
||||
-Wno-deprecated-declarations
|
||||
libgstopensles_la_LIBADD = \
|
||||
-lgstinterfaces-@GST_MAJORMINOR@ \
|
||||
-lgstaudio-@GST_MAJORMINOR@ \
|
||||
-lgstaudio-@GST_API_VERSION@ \
|
||||
$(GST_PLUGINS_BASE_LIBS) \
|
||||
$(GST_BASE_LIBS) \
|
||||
$(GST_LIBS)
|
||||
libgstopensles_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -lOpenSLES
|
||||
libgstopensles_la_LIBTOOLFLAGS = --tag=disable-static --tag=CC
|
||||
libgstopensles_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
|
||||
|
||||
noinst_HEADERS = openslesringbuffer.h \
|
||||
openslessink.h \
|
||||
|
|
|
@ -39,7 +39,7 @@ plugin_init (GstPlugin * plugin)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
GST_PLUGIN_DEFINE2 (GST_VERSION_MAJOR,
|
||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||
GST_VERSION_MINOR,
|
||||
opensles,
|
||||
"OpenSL ES support for GStreamer",
|
||||
|
|
|
@ -26,17 +26,13 @@
|
|||
GST_DEBUG_CATEGORY_STATIC (opensles_ringbuffer_debug);
|
||||
#define GST_CAT_DEFAULT opensles_ringbuffer_debug
|
||||
|
||||
static GstRingBufferClass *ring_parent_class = NULL;
|
||||
|
||||
static void
|
||||
_do_init (GType type)
|
||||
{
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_ringbuffer_debug,
|
||||
#define _do_init \
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_ringbuffer_debug, \
|
||||
"opensles_ringbuffer", 0, "OpenSL ES ringbuffer");
|
||||
}
|
||||
|
||||
GST_BOILERPLATE_FULL (GstOpenSLESRingBuffer, gst_opensles_ringbuffer,
|
||||
GstRingBuffer, GST_TYPE_RING_BUFFER, _do_init);
|
||||
#define parent_class gst_opensles_ringbuffer_parent_class
|
||||
G_DEFINE_TYPE_WITH_CODE (GstOpenSLESRingBuffer, gst_opensles_ringbuffer,
|
||||
GST_TYPE_AUDIO_RING_BUFFER, _do_init);
|
||||
|
||||
/*
|
||||
* Some generic helper functions
|
||||
|
@ -78,9 +74,9 @@ _opensles_sample_rate (guint rate)
|
|||
}
|
||||
|
||||
static inline SLuint32
|
||||
_opensles_channel_mask (GstRingBufferSpec * spec)
|
||||
_opensles_channel_mask (GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
switch (spec->channels) {
|
||||
switch (spec->info.channels) {
|
||||
case 1:
|
||||
return (SL_SPEAKER_FRONT_CENTER);
|
||||
case 2:
|
||||
|
@ -91,16 +87,17 @@ _opensles_channel_mask (GstRingBufferSpec * spec)
|
|||
}
|
||||
|
||||
static inline void
|
||||
_opensles_format (GstRingBufferSpec * spec, SLDataFormat_PCM * format)
|
||||
_opensles_format (GstAudioRingBufferSpec * spec, SLDataFormat_PCM * format)
|
||||
{
|
||||
format->formatType = SL_DATAFORMAT_PCM;
|
||||
format->numChannels = spec->channels;
|
||||
format->samplesPerSec = _opensles_sample_rate (spec->rate);
|
||||
format->bitsPerSample = spec->depth;
|
||||
format->containerSize = spec->width;
|
||||
format->numChannels = spec->info.channels;
|
||||
format->samplesPerSec = _opensles_sample_rate (spec->info.rate);
|
||||
format->bitsPerSample = spec->info.finfo->depth;
|
||||
format->containerSize = spec->info.finfo->width;
|
||||
format->channelMask = _opensles_channel_mask (spec);
|
||||
format->endianness =
|
||||
(spec->bigend ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN);
|
||||
((spec->info.finfo->endianness ==
|
||||
G_BIG_ENDIAN) ? SL_BYTEORDER_BIGENDIAN : SL_BYTEORDER_LITTLEENDIAN);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -108,7 +105,8 @@ _opensles_format (GstRingBufferSpec * spec, SLDataFormat_PCM * format)
|
|||
*/
|
||||
|
||||
static gboolean
|
||||
_opensles_recorder_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
|
||||
_opensles_recorder_acquire (GstAudioRingBuffer * rb,
|
||||
GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -185,7 +183,7 @@ failed:
|
|||
static void
|
||||
_opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
||||
{
|
||||
GstRingBuffer *rb = GST_RING_BUFFER_CAST (context);
|
||||
GstAudioRingBuffer *rb = GST_AUDIO_RING_BUFFER_CAST (context);
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
guint8 *ptr;
|
||||
|
@ -194,11 +192,11 @@ _opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
|||
|
||||
/* Advance only when we are called by the callback function */
|
||||
if (bufferQueue) {
|
||||
gst_ring_buffer_advance (rb, 1);
|
||||
gst_audio_ring_buffer_advance (rb, 1);
|
||||
}
|
||||
|
||||
/* Get a segment form the GStreamer ringbuffer to write in */
|
||||
if (!gst_ring_buffer_prepare_read (rb, &seg, &ptr, &len)) {
|
||||
if (!gst_audio_ring_buffer_prepare_read (rb, &seg, &ptr, &len)) {
|
||||
GST_WARNING_OBJECT (rb, "No segment available");
|
||||
return;
|
||||
}
|
||||
|
@ -215,7 +213,7 @@ _opensles_recorder_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_recorder_start (GstRingBuffer * rb)
|
||||
_opensles_recorder_start (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -249,7 +247,7 @@ _opensles_recorder_start (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_recorder_stop (GstRingBuffer * rb)
|
||||
_opensles_recorder_stop (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -290,7 +288,7 @@ _opensles_recorder_stop (GstRingBuffer * rb)
|
|||
*/
|
||||
|
||||
static gboolean
|
||||
_opensles_player_change_volume (GstRingBuffer * rb)
|
||||
_opensles_player_change_volume (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
SLresult result;
|
||||
|
@ -313,7 +311,7 @@ _opensles_player_change_volume (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_player_change_mute (GstRingBuffer * rb)
|
||||
_opensles_player_change_mute (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
SLresult result;
|
||||
|
@ -351,7 +349,8 @@ _opensles_player_event_cb (SLPlayItf caller, void *context, SLuint32 event)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_player_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
|
||||
_opensles_player_acquire (GstAudioRingBuffer * rb,
|
||||
GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -478,7 +477,7 @@ failed:
|
|||
static void
|
||||
_opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
||||
{
|
||||
GstRingBuffer *rb = GST_RING_BUFFER_CAST (context);
|
||||
GstAudioRingBuffer *rb = GST_AUDIO_RING_BUFFER_CAST (context);
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
guint8 *ptr, *cur;
|
||||
|
@ -486,7 +485,7 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
|||
gint len;
|
||||
|
||||
/* Get a segment form the GStreamer ringbuffer to read some samples */
|
||||
if (!gst_ring_buffer_prepare_read (rb, &seg, &ptr, &len)) {
|
||||
if (!gst_audio_ring_buffer_prepare_read (rb, &seg, &ptr, &len)) {
|
||||
GST_WARNING_OBJECT (rb, "No segment available");
|
||||
return;
|
||||
}
|
||||
|
@ -510,13 +509,13 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
|
|||
}
|
||||
|
||||
/* Fill with silence samples the segment of the GStreamer ringbuffer */
|
||||
gst_ring_buffer_clear (rb, seg);
|
||||
gst_audio_ring_buffer_clear (rb, seg);
|
||||
/* Make the segment reusable */
|
||||
gst_ring_buffer_advance (rb, 1);
|
||||
gst_audio_ring_buffer_advance (rb, 1);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_player_start (GstRingBuffer * rb)
|
||||
_opensles_player_start (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -556,7 +555,7 @@ _opensles_player_start (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_player_pause (GstRingBuffer * rb)
|
||||
_opensles_player_pause (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -573,7 +572,7 @@ _opensles_player_pause (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
_opensles_player_stop (GstRingBuffer * rb)
|
||||
_opensles_player_stop (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
|
||||
SLresult result;
|
||||
|
@ -617,7 +616,7 @@ _opensles_player_stop (GstRingBuffer * rb)
|
|||
* OpenSL ES ringbuffer wrapper
|
||||
*/
|
||||
|
||||
GstRingBuffer *
|
||||
GstAudioRingBuffer *
|
||||
gst_opensles_ringbuffer_new (RingBufferMode mode)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
@ -645,11 +644,11 @@ gst_opensles_ringbuffer_new (RingBufferMode mode)
|
|||
|
||||
GST_DEBUG_OBJECT (thiz, "ringbuffer created");
|
||||
|
||||
return GST_RING_BUFFER (thiz);
|
||||
return GST_AUDIO_RING_BUFFER (thiz);
|
||||
}
|
||||
|
||||
void
|
||||
gst_opensles_ringbuffer_set_volume (GstRingBuffer * rb, gfloat volume)
|
||||
gst_opensles_ringbuffer_set_volume (GstAudioRingBuffer * rb, gfloat volume)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -663,7 +662,7 @@ gst_opensles_ringbuffer_set_volume (GstRingBuffer * rb, gfloat volume)
|
|||
}
|
||||
|
||||
void
|
||||
gst_opensles_ringbuffer_set_mute (GstRingBuffer * rb, gboolean mute)
|
||||
gst_opensles_ringbuffer_set_mute (GstAudioRingBuffer * rb, gboolean mute)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -677,7 +676,7 @@ gst_opensles_ringbuffer_set_mute (GstRingBuffer * rb, gboolean mute)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_open_device (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_open_device (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
SLresult result;
|
||||
|
@ -758,7 +757,7 @@ failed:
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_close_device (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_close_device (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -784,7 +783,8 @@ gst_opensles_ringbuffer_close_device (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
|
||||
gst_opensles_ringbuffer_acquire (GstAudioRingBuffer * rb,
|
||||
GstAudioRingBufferSpec * spec)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -796,15 +796,15 @@ gst_opensles_ringbuffer_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec)
|
|||
}
|
||||
|
||||
/* Initialize our ringbuffer memory region */
|
||||
rb->data = gst_buffer_new_and_alloc (spec->segtotal * spec->segsize);
|
||||
memset (GST_BUFFER_DATA (rb->data), 0, GST_BUFFER_SIZE (rb->data));
|
||||
rb->size = spec->segtotal * spec->segsize;
|
||||
rb->memory = g_malloc0 (rb->size);
|
||||
|
||||
GST_DEBUG_OBJECT (thiz, "ringbuffer acquired");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_release (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_release (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -830,9 +830,10 @@ gst_opensles_ringbuffer_release (GstRingBuffer * rb)
|
|||
thiz->data = NULL;
|
||||
}
|
||||
|
||||
if (rb->data) {
|
||||
gst_buffer_unref (rb->data);
|
||||
rb->data = NULL;
|
||||
if (rb->memory) {
|
||||
g_free (rb->memory);
|
||||
rb->memory = NULL;
|
||||
rb->size = 0;
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (thiz, "ringbuffer released");
|
||||
|
@ -840,7 +841,7 @@ gst_opensles_ringbuffer_release (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_start (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_start (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
gboolean res;
|
||||
|
@ -853,7 +854,7 @@ gst_opensles_ringbuffer_start (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_pause (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_pause (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
gboolean res;
|
||||
|
@ -866,7 +867,7 @@ gst_opensles_ringbuffer_pause (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static gboolean
|
||||
gst_opensles_ringbuffer_stop (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_stop (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
gboolean res;
|
||||
|
@ -879,7 +880,7 @@ gst_opensles_ringbuffer_stop (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static guint
|
||||
gst_opensles_ringbuffer_delay (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_delay (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
guint res = 0;
|
||||
|
@ -893,7 +894,8 @@ gst_opensles_ringbuffer_delay (GstRingBuffer * rb)
|
|||
(*thiz->playerPlay)->GetPlayState (thiz->playerPlay, &state);
|
||||
if (state == SL_PLAYSTATE_PLAYING) {
|
||||
(*thiz->playerPlay)->GetPosition (thiz->playerPlay, &position);
|
||||
playedpos = gst_util_uint64_scale_round (position, rb->spec.rate, 1000);
|
||||
playedpos =
|
||||
gst_util_uint64_scale_round (position, rb->spec.info.rate, 1000);
|
||||
queuedpos = g_atomic_int_get (&thiz->segqueued) * rb->samples_per_seg;
|
||||
res = queuedpos - playedpos;
|
||||
}
|
||||
|
@ -907,7 +909,7 @@ gst_opensles_ringbuffer_delay (GstRingBuffer * rb)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_clear_all (GstRingBuffer * rb)
|
||||
gst_opensles_ringbuffer_clear_all (GstAudioRingBuffer * rb)
|
||||
{
|
||||
GstOpenSLESRingBuffer *thiz;
|
||||
|
||||
|
@ -928,37 +930,29 @@ gst_opensles_ringbuffer_clear_all (GstRingBuffer * rb)
|
|||
g_atomic_int_set (&thiz->is_prerolled, 0);
|
||||
}
|
||||
|
||||
GST_CALL_PARENT (GST_RING_BUFFER_CLASS, clear_all, (rb));
|
||||
GST_CALL_PARENT (GST_AUDIO_RING_BUFFER_CLASS, clear_all, (rb));
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_dispose (GObject * object)
|
||||
{
|
||||
G_OBJECT_CLASS (ring_parent_class)->dispose (object);
|
||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_finalize (GObject * object)
|
||||
{
|
||||
G_OBJECT_CLASS (ring_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_base_init (gpointer g_class)
|
||||
{
|
||||
/* Nothing to do right now */
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_class_init (GstOpenSLESRingBufferClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstRingBufferClass *gstringbuffer_class;
|
||||
GstAudioRingBufferClass *gstringbuffer_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstringbuffer_class = (GstRingBufferClass *) klass;
|
||||
|
||||
ring_parent_class = g_type_class_peek_parent (klass);
|
||||
gstringbuffer_class = (GstAudioRingBufferClass *) klass;
|
||||
|
||||
gobject_class->dispose = gst_opensles_ringbuffer_dispose;
|
||||
gobject_class->finalize = gst_opensles_ringbuffer_finalize;
|
||||
|
@ -985,8 +979,7 @@ gst_opensles_ringbuffer_class_init (GstOpenSLESRingBufferClass * klass)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_opensles_ringbuffer_init (GstOpenSLESRingBuffer * thiz,
|
||||
GstOpenSLESRingBufferClass * g_class)
|
||||
gst_opensles_ringbuffer_init (GstOpenSLESRingBuffer * thiz)
|
||||
{
|
||||
thiz->mode = RB_MODE_NONE;
|
||||
thiz->engineObject = NULL;
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define __OPENSLESRINGBUFFER_H__
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/audio/gstringbuffer.h>
|
||||
#include <gst/audio/gstaudioringbuffer.h>
|
||||
|
||||
#include <SLES/OpenSLES.h>
|
||||
#include <SLES/OpenSLES_Android.h>
|
||||
|
@ -54,15 +54,15 @@ typedef enum
|
|||
RB_MODE_LAST
|
||||
} RingBufferMode;
|
||||
|
||||
typedef gboolean (*AcquireFunc) (GstRingBuffer * rb, GstRingBufferSpec * spec);
|
||||
typedef gboolean (*StateFunc) (GstRingBuffer * rb);
|
||||
typedef gboolean (*AcquireFunc) (GstAudioRingBuffer * rb, GstAudioRingBufferSpec * spec);
|
||||
typedef gboolean (*StateFunc) (GstAudioRingBuffer * rb);
|
||||
|
||||
typedef struct _GstOpenSLESRingBuffer GstOpenSLESRingBuffer;
|
||||
typedef struct _GstOpenSLESRingBufferClass GstOpenSLESRingBufferClass;
|
||||
|
||||
struct _GstOpenSLESRingBuffer
|
||||
{
|
||||
GstRingBuffer object;
|
||||
GstAudioRingBuffer object;
|
||||
|
||||
RingBufferMode mode;
|
||||
|
||||
|
@ -105,13 +105,13 @@ struct _GstOpenSLESRingBuffer
|
|||
|
||||
struct _GstOpenSLESRingBufferClass
|
||||
{
|
||||
GstRingBufferClass parent_class;
|
||||
GstAudioRingBufferClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_opensles_ringbuffer_get_type (void);
|
||||
GstRingBuffer *gst_opensles_ringbuffer_new (RingBufferMode mode);
|
||||
void gst_opensles_ringbuffer_set_volume (GstRingBuffer * rb, gfloat volume);
|
||||
void gst_opensles_ringbuffer_set_mute (GstRingBuffer * rb, gboolean mute);
|
||||
GstAudioRingBuffer *gst_opensles_ringbuffer_new (RingBufferMode mode);
|
||||
void gst_opensles_ringbuffer_set_volume (GstAudioRingBuffer * rb, gfloat volume);
|
||||
void gst_opensles_ringbuffer_set_mute (GstAudioRingBuffer * rb, gboolean mute);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* __OPENSLESRINGBUFFER_H__ */
|
||||
|
|
|
@ -62,49 +62,23 @@ enum
|
|||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS ("audio/x-raw-int, "
|
||||
"endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, "
|
||||
"signed = (boolean) { TRUE }, "
|
||||
"width = (int) 16, "
|
||||
"depth = (int) 16, "
|
||||
"rate = (int) { " RATES "}, "
|
||||
"channels = (int) [1, 2];"
|
||||
"audio/x-raw-int, "
|
||||
"endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, "
|
||||
"signed = (boolean) { FALSE }, "
|
||||
"width = (int) 8, "
|
||||
"depth = (int) 8, "
|
||||
GST_STATIC_CAPS ("audio/x-raw, "
|
||||
"format = (string) { " GST_AUDIO_NE (S16) ", " GST_AUDIO_NE (U8) "}, "
|
||||
"rate = (int) { " RATES "}, " "channels = (int) [1, 2]")
|
||||
);
|
||||
|
||||
static void
|
||||
_do_init (GType type)
|
||||
{
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_sink_debug, "opensles_sink", 0,
|
||||
#define _do_init \
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_sink_debug, "opensles_sink", 0, \
|
||||
"OpenSL ES Sink");
|
||||
}
|
||||
#define parent_class gst_opensles_sink_parent_class
|
||||
G_DEFINE_TYPE_WITH_CODE (GstOpenSLESSink, gst_opensles_sink,
|
||||
GST_TYPE_AUDIO_BASE_SINK, _do_init);
|
||||
|
||||
GST_BOILERPLATE_FULL (GstOpenSLESSink, gst_opensles_sink, GstBaseAudioSink,
|
||||
GST_TYPE_BASE_AUDIO_SINK, _do_init);
|
||||
|
||||
static void
|
||||
gst_opensles_sink_base_init (gpointer g_class)
|
||||
{
|
||||
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &sink_factory);
|
||||
|
||||
gst_element_class_set_details_simple (element_class, "OpenSL ES Sink",
|
||||
"Sink/Audio",
|
||||
"Output sound using the OpenSL ES APIs",
|
||||
"Josep Torra <support@fluendo.com>");
|
||||
}
|
||||
|
||||
static GstRingBuffer *
|
||||
gst_opensles_sink_create_ringbuffer (GstBaseAudioSink * base)
|
||||
static GstAudioRingBuffer *
|
||||
gst_opensles_sink_create_ringbuffer (GstAudioBaseSink * base)
|
||||
{
|
||||
GstOpenSLESSink *sink = GST_OPENSLES_SINK (base);
|
||||
GstRingBuffer *rb;
|
||||
GstAudioRingBuffer *rb;
|
||||
|
||||
rb = gst_opensles_ringbuffer_new (RB_MODE_SINK_PCM);
|
||||
gst_opensles_ringbuffer_set_volume (rb, sink->volume);
|
||||
|
@ -208,7 +182,7 @@ gst_opensles_sink_set_property (GObject * object, guint prop_id,
|
|||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
GstOpenSLESSink *sink = GST_OPENSLES_SINK (object);
|
||||
GstRingBuffer *rb = GST_BASE_AUDIO_SINK (sink)->ringbuffer;
|
||||
GstAudioRingBuffer *rb = GST_AUDIO_BASE_SINK (sink)->ringbuffer;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_VOLUME:
|
||||
|
@ -251,12 +225,12 @@ static void
|
|||
gst_opensles_sink_class_init (GstOpenSLESSinkClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstBaseAudioSinkClass *gstbaseaudiosink_class;
|
||||
GstElementClass *gstelement_class;
|
||||
GstAudioBaseSinkClass *gstbaseaudiosink_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
gstbaseaudiosink_class = (GstAudioBaseSinkClass *) klass;
|
||||
|
||||
gobject_class->set_property = gst_opensles_sink_set_property;
|
||||
gobject_class->get_property = gst_opensles_sink_get_property;
|
||||
|
@ -269,21 +243,29 @@ gst_opensles_sink_class_init (GstOpenSLESSinkClass * klass)
|
|||
g_param_spec_boolean ("mute", "Mute", "Mute state of this stream",
|
||||
DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&sink_factory));
|
||||
|
||||
gst_element_class_set_static_metadata (gstelement_class, "OpenSL ES Sink",
|
||||
"Sink/Audio",
|
||||
"Output sound using the OpenSL ES APIs",
|
||||
"Josep Torra <support@fluendo.com>");
|
||||
|
||||
gstbaseaudiosink_class->create_ringbuffer =
|
||||
GST_DEBUG_FUNCPTR (gst_opensles_sink_create_ringbuffer);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_sink_init (GstOpenSLESSink * sink, GstOpenSLESSinkClass * gclass)
|
||||
gst_opensles_sink_init (GstOpenSLESSink * sink)
|
||||
{
|
||||
sink->volume = DEFAULT_VOLUME;
|
||||
sink->mute = DEFAULT_MUTE;
|
||||
|
||||
_opensles_query_capabilities (sink);
|
||||
|
||||
gst_base_audio_sink_set_provide_clock (GST_BASE_AUDIO_SINK (sink), TRUE);
|
||||
gst_audio_base_sink_set_provide_clock (GST_AUDIO_BASE_SINK (sink), TRUE);
|
||||
/* Override some default values to fit on the AudioFlinger behaviour of
|
||||
* processing 20ms buffers as minimum buffer size. */
|
||||
GST_BASE_AUDIO_SINK (sink)->buffer_time = 400000;
|
||||
GST_BASE_AUDIO_SINK (sink)->latency_time = 20000;
|
||||
GST_AUDIO_BASE_SINK (sink)->buffer_time = 400000;
|
||||
GST_AUDIO_BASE_SINK (sink)->latency_time = 20000;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define __OPENSLESSINK_H__
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/audio/gstbaseaudiosink.h>
|
||||
#include <gst/audio/gstaudiobasesink.h>
|
||||
#include "openslesringbuffer.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@ -38,7 +38,7 @@ typedef struct _GstOpenSLESSinkClass GstOpenSLESSinkClass;
|
|||
|
||||
struct _GstOpenSLESSink
|
||||
{
|
||||
GstBaseAudioSink sink;
|
||||
GstAudioBaseSink sink;
|
||||
|
||||
gfloat volume;
|
||||
gboolean mute;
|
||||
|
@ -46,7 +46,7 @@ struct _GstOpenSLESSink
|
|||
|
||||
struct _GstOpenSLESSinkClass
|
||||
{
|
||||
GstBaseAudioSinkClass parent_class;
|
||||
GstAudioBaseSinkClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_opensles_sink_get_type (void);
|
||||
|
|
|
@ -45,43 +45,24 @@ GST_DEBUG_CATEGORY_STATIC (opensles_src_debug);
|
|||
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS ("audio/x-raw-int, "
|
||||
"endianness = (int) {" G_STRINGIFY (G_BYTE_ORDER) " }, "
|
||||
"signed = (boolean) { TRUE }, "
|
||||
"width = (int) 16, "
|
||||
"depth = (int) 16, "
|
||||
"rate = (int) 16000, "
|
||||
GST_STATIC_CAPS ("audio/x-raw, "
|
||||
"format = (string) " GST_AUDIO_NE (S16) ", "
|
||||
"rate = (int) { 16000 }, "
|
||||
"channels = (int) 1")
|
||||
);
|
||||
/* *INDENT-ON* */
|
||||
|
||||
static void
|
||||
_do_init (GType type)
|
||||
{
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_src_debug, "opensles_src", 0,
|
||||
#define _do_init \
|
||||
GST_DEBUG_CATEGORY_INIT (opensles_src_debug, "opensles_src", 0, \
|
||||
"OpenSL ES Src");
|
||||
}
|
||||
#define parent_class gst_opensles_src_parent_class
|
||||
G_DEFINE_TYPE_WITH_CODE (GstOpenSLESSrc, gst_opensles_src,
|
||||
GST_TYPE_AUDIO_BASE_SRC, _do_init);
|
||||
|
||||
GST_BOILERPLATE_FULL (GstOpenSLESSrc, gst_opensles_src, GstBaseAudioSrc,
|
||||
GST_TYPE_BASE_AUDIO_SRC, _do_init);
|
||||
|
||||
static void
|
||||
gst_opensles_src_base_init (gpointer g_class)
|
||||
static GstAudioRingBuffer *
|
||||
gst_opensles_src_create_ringbuffer (GstAudioBaseSrc * base)
|
||||
{
|
||||
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_static_pad_template (element_class, &src_factory);
|
||||
|
||||
gst_element_class_set_details_simple (element_class, "OpenSL ES Src",
|
||||
"Src/Audio",
|
||||
"Input sound using the OpenSL ES APIs",
|
||||
"Josep Torra <support@fluendo.com>");
|
||||
}
|
||||
|
||||
static GstRingBuffer *
|
||||
gst_opensles_src_create_ringbuffer (GstBaseAudioSrc * base)
|
||||
{
|
||||
GstRingBuffer *rb;
|
||||
GstAudioRingBuffer *rb;
|
||||
|
||||
rb = gst_opensles_ringbuffer_new (RB_MODE_SRC);
|
||||
|
||||
|
@ -91,21 +72,29 @@ gst_opensles_src_create_ringbuffer (GstBaseAudioSrc * base)
|
|||
static void
|
||||
gst_opensles_src_class_init (GstOpenSLESSrcClass * klass)
|
||||
{
|
||||
GstBaseAudioSrcClass *gstbaseaudiosrc_class;
|
||||
GstElementClass *gstelement_class;
|
||||
GstAudioBaseSrcClass *gstaudiobasesrc_class;
|
||||
|
||||
gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
gstaudiobasesrc_class = (GstAudioBaseSrcClass *) klass;
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
gst_element_class_add_pad_template (gstelement_class,
|
||||
gst_static_pad_template_get (&src_factory));
|
||||
|
||||
gstbaseaudiosrc_class->create_ringbuffer =
|
||||
gst_element_class_set_static_metadata (gstelement_class, "OpenSL ES Src",
|
||||
"Src/Audio",
|
||||
"Input sound using the OpenSL ES APIs",
|
||||
"Josep Torra <support@fluendo.com>");
|
||||
|
||||
gstaudiobasesrc_class->create_ringbuffer =
|
||||
GST_DEBUG_FUNCPTR (gst_opensles_src_create_ringbuffer);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_opensles_src_init (GstOpenSLESSrc * src, GstOpenSLESSrcClass * gclass)
|
||||
gst_opensles_src_init (GstOpenSLESSrc * src)
|
||||
{
|
||||
/* Override some default values to fit on the AudioFlinger behaviour of
|
||||
* processing 20ms buffers as minimum buffer size. */
|
||||
GST_BASE_AUDIO_SRC (src)->buffer_time = 400000;
|
||||
GST_BASE_AUDIO_SRC (src)->latency_time = 20000;
|
||||
GST_AUDIO_BASE_SRC (src)->buffer_time = 400000;
|
||||
GST_AUDIO_BASE_SRC (src)->latency_time = 20000;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#define __OPENSLESSRC_H__
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/audio/gstbaseaudiosrc.h>
|
||||
#include <gst/audio/gstaudiobasesrc.h>
|
||||
#include "openslesringbuffer.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@ -38,12 +38,12 @@ typedef struct _GstOpenSLESSrcClass GstOpenSLESSrcClass;
|
|||
|
||||
struct _GstOpenSLESSrc
|
||||
{
|
||||
GstBaseAudioSrc src;
|
||||
GstAudioBaseSrc src;
|
||||
};
|
||||
|
||||
struct _GstOpenSLESSrcClass
|
||||
{
|
||||
GstBaseAudioSrcClass parent_class;
|
||||
GstAudioBaseSrcClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_opensles_src_get_type (void);
|
||||
|
|
Loading…
Reference in a new issue