From: Jo?o Paulo Rechi Vita <jprvita@xxxxxxxxxxxxx> 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