opensles: make the volume property actually work
authorJosep Torra <n770galaxy@gmail.com>
Thu, 20 Sep 2012 16:04:29 +0000 (18:04 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 18 Oct 2012 12:03:08 +0000 (14:03 +0200)
sys/opensles/openslesringbuffer.c
sys/opensles/openslesringbuffer.h
sys/opensles/openslessink.c
sys/opensles/openslessink.h

index 6202153..e8d7e82 100644 (file)
@@ -300,6 +300,29 @@ _opensles_player_cb (SLAndroidSimpleBufferQueueItf bufferQueue, void *context)
 }
 
 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)
 {
   GstOpenSLESRingBuffer *thiz = GST_OPENSLES_RING_BUFFER_CAST (rb);
@@ -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)
 {
index 98a56fe..822929d 100644 (file)
@@ -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__ */
index be21f9c..364e944 100644 (file)
@@ -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;
 }
 
index 836441b..4b3494a 100644 (file)
@@ -40,7 +40,7 @@ struct _GstOpenSLESSink
 {
   GstBaseAudioSink sink;
 
-  double volume;
+  gfloat volume;
 };
 
 struct _GstOpenSLESSinkClass