If a device has two profiles, the old code would start the wait timer when the first profile connects, but when the second profile connects, the timer would not get stopped and the CONNECTION_CHANGED hook would not get fired, because the code for that was inside an if block that only gets executed when the first profile connects. As a result, module-bluez5-device loading would always be delayed until the wait timeout expires. --- src/modules/bluetooth/bluez5-util.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c index 7d63f35..d397045 100644 --- a/src/modules/bluetooth/bluez5-util.c +++ b/src/modules/bluetooth/bluez5-util.c @@ -259,6 +259,7 @@ static void device_start_waiting_for_profiles(pa_bluetooth_device *device) { void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_transport_state_t state) { bool old_any_connected; + unsigned n_disconnected_profiles; pa_assert(t); @@ -274,27 +275,26 @@ void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_tr pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t); - if (old_any_connected != pa_bluetooth_device_any_transport_connected(t->device)) { - unsigned n_disconnected_profiles; - - /* If there are profiles that are expected to get connected soon (based - * on the UUID list), we wait for a bit before announcing the new - * device, so that all profiles have time to get connected before the - * card object is created. If we didn't wait, the card would always - * have only one profile marked as available in the initial state, - * which would prevent module-card-restore from restoring the initial - * profile properly. */ - - n_disconnected_profiles = device_count_disconnected_profiles(t->device); + /* If there are profiles that are expected to get connected soon (based + * on the UUID list), we wait for a bit before announcing the new + * device, so that all profiles have time to get connected before the + * card object is created. If we didn't wait, the card would always + * have only one profile marked as available in the initial state, + * which would prevent module-card-restore from restoring the initial + * profile properly. */ - if (n_disconnected_profiles == 0) - device_stop_waiting_for_profiles(t->device); + n_disconnected_profiles = device_count_disconnected_profiles(t->device); + if (old_any_connected != pa_bluetooth_device_any_transport_connected(t->device)) { if (!old_any_connected && n_disconnected_profiles > 0) device_start_waiting_for_profiles(t->device); else pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); - } + } else if (n_disconnected_profiles == 0 && t->device->wait_for_profiles_timer) + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); + + if (n_disconnected_profiles == 0) + device_stop_waiting_for_profiles(t->device); } void pa_bluetooth_transport_put(pa_bluetooth_transport *t) { -- 2.8.1