From f06688c7b27ecdb40a208f14335a02c260329edc Mon Sep 17 00:00:00 2001 From: Josep Torra Date: Thu, 20 Sep 2012 18:04:29 +0200 Subject: [PATCH] opensles: make the volume property actually work --- sys/opensles/openslesringbuffer.c | 42 +++++++++++++++++++++++++++++++ sys/opensles/openslesringbuffer.h | 3 +++ sys/opensles/openslessink.c | 3 ++- sys/opensles/openslessink.h | 2 +- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/sys/opensles/openslesringbuffer.c b/sys/opensles/openslesringbuffer.c index 6202153149..e8d7e822aa 100644 --- a/sys/opensles/openslesringbuffer.c +++ b/sys/opensles/openslesringbuffer.c @@ -299,6 +299,29 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context) gst_ring_buffer_advance (rb, 1); } +static gboolean +_opensles_player_change_volume (GstRingBuffer * rb) +{ + GstOpenSLESRingBuffer *thiz; + SLresult result; + + thiz = GST_OPENSLES_RING_BUFFER_CAST (rb); + + if (thiz->playerVolume) { + gint millibel = (1.0 - thiz->volume) * -5000.0; + result = + (*thiz->playerVolume)->SetVolumeLevel (thiz->playerVolume, millibel); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (thiz, "player.SetVolumeLevel failed(0x%08x)", + (guint32) result); + return FALSE; + } + GST_DEBUG_OBJECT (thiz, "changed volume to %d", millibel); + } + + return TRUE; +} + static gboolean _opensles_player_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec) { @@ -375,6 +398,9 @@ _opensles_player_acquire (GstRingBuffer * rb, GstRingBufferSpec * spec) goto failed; } + /* Configure the volume state */ + _opensles_player_change_volume (rb); + /* Define our ringbuffer in terms of number of buffers and buffer size. */ spec->segsize = (spec->rate * spec->bytes_per_sample); spec->segtotal = 4; @@ -462,11 +488,13 @@ gst_opensles_ringbuffer_new (RingBufferMode mode) thiz->start = _opensles_recorder_start; thiz->pause = _opensles_recorder_stop; thiz->stop = _opensles_recorder_stop; + thiz->change_volume = NULL; } else if (mode == RB_MODE_SINK_PCM) { thiz->acquire = _opensles_player_acquire; thiz->start = _opensles_player_start; thiz->pause = _opensles_player_pause; thiz->stop = _opensles_player_stop; + thiz->change_volume = _opensles_player_change_volume; } } @@ -474,6 +502,20 @@ gst_opensles_ringbuffer_new (RingBufferMode mode) return GST_RING_BUFFER (thiz); } +void +gst_opensles_ringbuffer_set_volume (GstRingBuffer * rb, gfloat volume) +{ + GstOpenSLESRingBuffer *thiz; + + thiz = GST_OPENSLES_RING_BUFFER_CAST (rb); + + thiz->volume = volume; + + if (thiz->change_volume) { + thiz->change_volume (rb); + } +} + static gboolean gst_opensles_ringbuffer_open_device (GstRingBuffer * rb) { diff --git a/sys/opensles/openslesringbuffer.h b/sys/opensles/openslesringbuffer.h index 98a56fe413..822929d797 100644 --- a/sys/opensles/openslesringbuffer.h +++ b/sys/opensles/openslesringbuffer.h @@ -75,6 +75,7 @@ struct _GstOpenSLESRingBuffer SLObjectItf playerObject; SLPlayItf playerPlay; SLVolumeItf playerVolume; + gfloat volume; /* recorder interfaces */ SLObjectItf recorderObject; @@ -89,6 +90,7 @@ struct _GstOpenSLESRingBuffer StateFunc start; StateFunc pause; StateFunc stop; + StateFunc change_volume; }; struct _GstOpenSLESRingBufferClass @@ -98,6 +100,7 @@ struct _GstOpenSLESRingBufferClass GType gst_opensles_ringbuffer_get_type (void); GstRingBuffer *gst_opensles_ringbuffer_new (RingBufferMode mode); +void gst_opensles_ringbuffer_set_volume (GstRingBuffer * rb, gfloat volume); G_END_DECLS #endif /* __OPENSLESRINGBUFFER_H__ */ diff --git a/sys/opensles/openslessink.c b/sys/opensles/openslessink.c index be21f9c996..364e94431f 100644 --- a/sys/opensles/openslessink.c +++ b/sys/opensles/openslessink.c @@ -81,10 +81,11 @@ gst_opensles_sink_base_init (gpointer g_class) static GstRingBuffer * gst_opensles_sink_create_ringbuffer (GstBaseAudioSink * base) { + GstOpenSLESSink *sink = GST_OPENSLES_SINK (base); GstRingBuffer *rb; rb = gst_opensles_ringbuffer_new (RB_MODE_SINK_PCM); - + gst_opensles_ringbuffer_set_volume (rb, sink->volume); return rb; } diff --git a/sys/opensles/openslessink.h b/sys/opensles/openslessink.h index 836441bc09..4b3494a237 100644 --- a/sys/opensles/openslessink.h +++ b/sys/opensles/openslessink.h @@ -40,7 +40,7 @@ struct _GstOpenSLESSink { GstBaseAudioSink sink; - double volume; + gfloat volume; }; struct _GstOpenSLESSinkClass