bluez: Expose transport volume as a property on avdtpsrc
authorArun Raghavan <git@arunraghavan.net>
Mon, 9 Jul 2018 01:10:24 +0000 (06:40 +0530)
committerArun Raghavan <git@arunraghavan.net>
Mon, 9 Jul 2018 01:10:24 +0000 (06:40 +0530)
This can be handy if we want to track Bluetooth volume changes from the
device, or if we want to set it.

https://bugzilla.gnome.org/show_bug.cgi?id=787020

sys/bluez/gstavdtpsrc.c
sys/bluez/gstavdtputil.c
sys/bluez/gstavdtputil.h

index f40ef00..cf427ec 100644 (file)
@@ -40,6 +40,7 @@ enum
 {
   PROP_0,
   PROP_TRANSPORT,
+  PROP_TRANSPORT_VOLUME,
 };
 
 #define parent_class gst_avdtp_src_parent_class
@@ -101,6 +102,12 @@ gst_avdtp_src_class_init (GstAvdtpSrcClass * klass)
       g_param_spec_string ("transport",
           "Transport", "Use configured transport", NULL, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_TRANSPORT_VOLUME,
+      g_param_spec_uint ("transport-volume",
+          "Transport volume",
+          "Volume of the transport (only valid if transport is acquired)",
+          0, 127, 127, G_PARAM_READWRITE));
+
   gst_element_class_set_static_metadata (element_class,
       "Bluetooth AVDTP Source",
       "Source/Audio/Network/RTP",
@@ -149,6 +156,11 @@ gst_avdtp_src_get_property (GObject * object, guint prop_id,
       g_value_set_string (value, avdtpsrc->conn.transport);
       break;
 
+    case PROP_TRANSPORT_VOLUME:
+      g_value_set_uint (value,
+          gst_avdtp_connection_get_volume (&avdtpsrc->conn));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -167,6 +179,10 @@ gst_avdtp_src_set_property (GObject * object, guint prop_id,
           g_value_get_string (value));
       break;
 
+    case PROP_TRANSPORT_VOLUME:
+      /* This is no-op because setting is handled via a GBinding */
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -376,6 +392,11 @@ gst_avdtp_src_start (GstBaseSrc * bsrc)
 
   g_atomic_int_set (&avdtpsrc->unlocked, FALSE);
 
+  /* The life time of the connection is shorter than the src object, so we
+   * don't need to worry about memory management */
+  gst_avdtp_connection_notify_volume (&avdtpsrc->conn, G_OBJECT (avdtpsrc),
+      "transport-volume");
+
   gst_avdtp_src_start_avrcp (avdtpsrc);
 
   return TRUE;
index efc4f42..8f9f9a0 100644 (file)
@@ -722,6 +722,30 @@ gst_avdtp_connection_get_caps (GstAvdtpConnection * conn)
   return caps;
 }
 
+guint
+gst_avdtp_connection_get_volume (GstAvdtpConnection * conn)
+{
+  if (conn->data.is_acquired)
+    return bluez_media_transport1_get_volume (conn->data.conn);
+  else
+    return 127;
+}
+
+void
+gst_avdtp_connection_set_volume (GstAvdtpConnection * conn, guint16 volume)
+{
+  if (conn->data.is_acquired)
+    bluez_media_transport1_set_volume (conn->data.conn, volume);
+}
+
+void
+gst_avdtp_connection_notify_volume (GstAvdtpConnection * conn,
+    GObject * target, const gchar * property)
+{
+  g_object_bind_property (conn->data.conn, "volume", target, property,
+      G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+}
+
 gboolean
 gst_avdtp_connection_conf_recv_stream_fd (GstAvdtpConnection * conn)
 {
index 1319441..9939460 100644 (file)
@@ -69,6 +69,11 @@ void gst_avdtp_connection_set_device (GstAvdtpConnection * conn,
     const char *device);
 void gst_avdtp_connection_set_transport (GstAvdtpConnection * conn,
     const char *transport);
+guint gst_avdtp_connection_get_volume (GstAvdtpConnection * conn);
+void gst_avdtp_connection_set_volume (GstAvdtpConnection * conn,
+    guint16 volume);
+void gst_avdtp_connection_notify_volume (GstAvdtpConnection * conn,
+    GObject * target, const gchar * property);
 gboolean gst_avdtp_connection_conf_recv_stream_fd (GstAvdtpConnection * conn);
 
 G_END_DECLS