[RFC next v4 09/16] bluetooth: Support media transport's State property

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Mikel Astiz <mikel.astiz@xxxxxxxxxxxx>

BlueZ 5 exposes a 'State' property in the media transport interface.
With regard to PA, this replaces the profile-specific interfaces, since
they were being used to know if the audio was streaming or not.
---
 src/modules/bluetooth/bluetooth-util.c | 42 +++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 871341d..396325d 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -126,6 +126,20 @@ static pa_bt_audio_state_t audio_state_from_string(const char* value) {
     return PA_BT_AUDIO_STATE_INVALID;
 }
 
+static int transport_state_from_string(const char* value, pa_bluetooth_transport_state_t *state) {
+    pa_assert(value);
+    pa_assert(state);
+
+    if (pa_streq(value, "idle"))
+        *state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE;
+    else if (pa_streq(value, "pending") || pa_streq(value, "active")) /* We don't need such a separation */
+        *state = PA_BLUETOOTH_TRANSPORT_STATE_PLAYING;
+    else
+        return -1;
+
+    return 0;
+}
+
 const char *pa_bt_profile_to_string(enum profile profile) {
     switch(profile) {
         case PROFILE_A2DP:
@@ -1089,6 +1103,29 @@ static int transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *
 
             break;
          }
+
+        case DBUS_TYPE_STRING: {
+
+            const char *value;
+            dbus_message_iter_get_basic(&variant_i, &value);
+
+            if (pa_streq(key, "State")) { /* Added in BlueZ 5.0 */
+                bool old_any_connected = pa_bluetooth_device_any_audio_connected(t->device);
+
+                if (transport_state_from_string(value, &t->state) < 0) {
+                    pa_log("Transport %s has an invalid state: '%s'", t->path, value);
+                    return -1;
+                }
+
+                pa_log_debug("dbus: transport %s set to state '%s'", t->path, value);
+                pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t);
+
+                if (old_any_connected != pa_bluetooth_device_any_audio_connected(t->device))
+                    run_callback(t->device, old_any_connected);
+            }
+
+            break;
+        }
     }
 
     return 0;
@@ -1563,7 +1600,10 @@ static pa_bluetooth_transport *transport_new(pa_bluetooth_device *d, const char
         memcpy(t->config, config, size);
     }
 
-    t->state = audio_state_to_transport_state(d->profile_state[p]);
+    if (d->discovery->version == BLUEZ_VERSION_4)
+        t->state = audio_state_to_transport_state(d->profile_state[p]);
+    else
+        t->state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE;
 
     return t;
 }
-- 
1.8.1.4



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux