[pulseaudio-discuss] [RFC 12/24] bluetooth: Create a pa_bluetooth_transport for each HF card

jprvita at gmail.com jprvita at gmail.com
Tue Mar 26 22:16:51 PDT 2013


From: João Paulo Rechi Vita <jprvita at openbossa.org>

Every time a HF card is found a new pa_transport is created on the
pa_bluetooth_device representing the bluetooth audio device. This way
the module-bluetooth-device is loaded if necessary, and kept around even
when all other transports get disconnected.
---
 src/modules/bluetooth/bluetooth-util.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 59d0854..9a3bc6c 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -137,8 +137,13 @@ struct handsfree_card {
 
     int fd;
     uint8_t codec;
+
+    pa_bluetooth_device *device;
 };
 
+static pa_bluetooth_transport *transport_new(pa_bluetooth_device *d, const char *owner, const char *path, enum profile p,
+                                             const uint8_t *config, int size);
+
 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);
@@ -1206,6 +1211,21 @@ static void hfagent_card_found(pa_bluetooth_discovery *y, const char *path, DBus
     }
 
     pa_hashmap_put(y->hf_cards, hf_card->path, hf_card);
+
+    hf_card->device = pa_bluetooth_discovery_get_by_address(y, hf_card->remote);
+    if(hf_card->device) {
+        bool old_any_connected = pa_bluetooth_device_any_audio_connected(hf_card->device);
+        pa_bluetooth_transport *t = transport_new(hf_card->device, y->ofono_bus_id, path,
+                                                                    PROFILE_HFP_AG, NULL, 0);
+        hf_card->device->transports[PROFILE_HFP_AG] = t;
+        pa_assert_se(pa_hashmap_put(y->transports, t->path, t) >= 0);
+        pa_hook_fire(&y->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t);
+
+        if (old_any_connected != pa_bluetooth_device_any_audio_connected(hf_card->device))
+            run_callback(hf_card->device, false);
+    } else
+        pa_log_error("Device doesnt exist for %s", path);
+
     return;
 
 fail:
-- 
1.7.11.7



More information about the pulseaudio-discuss mailing list