[pulseaudio-discuss] [RFC v2 16/18] bluetooth: utility to trigger a2dp reconfigure

Frédéric Dalleau frederic.dalleau at linux.intel.com
Thu Mar 22 09:36:40 PDT 2012


---
 src/modules/bluetooth/bluetooth-util.c |   64 ++++++++++++++++++++++++++++++++
 src/modules/bluetooth/bluetooth-util.h |    3 +
 2 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 7680065..0dbf143 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -75,6 +75,11 @@ struct pa_bluetooth_discovery {
     pa_bool_t filter_added;
 };
 
+struct pending_config_info {
+    bt_transport_config_cb_t cb;
+    void *data;
+};
+
 static void get_properties_reply(DBusPendingCall *pending, void *userdata);
 static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m, DBusPendingCallNotifyFunction func, void *call_data);
 
@@ -1036,6 +1041,65 @@ const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetoo
     return NULL;
 }
 
+static void request_configuration_reply(DBusPendingCall *pending, void *userdata) {
+    DBusMessage *r;
+    pa_dbus_pending *p;
+    pa_bluetooth_discovery *y;
+    struct pending_config_info *cbinfo;
+    int err;
+
+    pa_assert(pending);
+
+    pa_assert_se(p = userdata);
+    pa_assert_se(y = p->context_data);
+    pa_assert_se(cbinfo = p->call_data);
+    pa_assert_se(r = dbus_pending_call_steal_reply(pending));
+
+    if (dbus_message_is_error(r, DBUS_ERROR_SERVICE_UNKNOWN)) {
+        pa_log("Bluetooth daemon is apparently not available.");
+        err = -1;
+        goto finish;
+    }
+
+    if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) {
+        pa_log("org.bluez.MediaTransport.RequestConfiguration() failed: %s: %s", dbus_message_get_error_name(r), pa_dbus_get_error_message(r));
+        err = -2;
+        goto finish;
+    }
+
+    err = 0;
+
+finish:
+    dbus_message_unref(r);
+
+    PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p);
+    pa_dbus_pending_free(p);
+
+    if (cbinfo->cb)
+        cbinfo->cb(err, cbinfo->data);
+
+    pa_xfree(cbinfo);
+}
+
+void pa_bluetooth_transport_reconfigure(const pa_bluetooth_transport *t, const char *endpoint, bt_transport_config_cb_t cb, void *data) {
+    DBusMessage *m;
+    DBusError err;
+    struct pending_config_info *cbinfo;
+
+    pa_assert(t);
+    pa_assert(t->y);
+
+    dbus_error_init(&err);
+
+    pa_assert_se(m = dbus_message_new_method_call("org.bluez", t->path, "org.bluez.MediaTransport", "Reconfigure"));
+    pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_STRING, &endpoint, DBUS_TYPE_INVALID));
+
+    cbinfo = pa_xmalloc(sizeof(struct pending_config_info));
+    cbinfo->cb = cb;
+    cbinfo->data = data;
+    send_and_add_to_pending(t->y, m, request_configuration_reply, cbinfo);
+}
+
 int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu) {
     DBusMessage *m, *r;
     DBusError err;
diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h
index 2752a69..b446cbe 100644
--- a/src/modules/bluetooth/bluetooth-util.h
+++ b/src/modules/bluetooth/bluetooth-util.h
@@ -115,6 +115,8 @@ struct pa_bluetooth_device {
     pa_bt_audio_state_t hfgw_state;
 };
 
+typedef int (*bt_transport_config_cb_t)(int err, void *data);
+
 pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core);
 pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y);
 void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *d);
@@ -127,6 +129,7 @@ const pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_di
 const pa_bluetooth_transport* pa_bluetooth_discovery_get_transport(pa_bluetooth_discovery *y, const char *path);
 const pa_bluetooth_transport* pa_bluetooth_device_get_transport(const pa_bluetooth_device *d, enum profile profile);
 
+void pa_bluetooth_transport_reconfigure(const pa_bluetooth_transport *t, const char *endpoint, bt_transport_config_cb_t cb, void *data);
 int pa_bluetooth_transport_acquire(const pa_bluetooth_transport *t, const char *accesstype, size_t *imtu, size_t *omtu);
 void pa_bluetooth_transport_release(const pa_bluetooth_transport *t, const char *accesstype);
 int pa_bluetooth_transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *i);
-- 
1.7.5.4



More information about the pulseaudio-discuss mailing list