On Sun, 2016-08-21 at 15:19 +0300, Tanu Kaskinen wrote: > One thing that needs fixing is the profile waiting logic - we wait > until all supported profiles are connected (or until a timeout > expires) before loading module-bluez5-device. Since we will now > connect only HFP or HSP, it doesn't make sense to wait for both of > them getting connected. The waiting logic is implemented in > pa_bluetooth_transport_set_state(). This actually seems to be broken today. I unwound all my patches and I still see the debug message Aug 21 19:23:28 jarvis pulseaudio[12479]: [pulseaudio] bluez5-util.c: Timeout expired, and device /org/bluez/hci0/dev_B8_AD_3E_8E_DE_EF still has disconnected profiles: meaning the timer expired even though all profiles were connected. I think the bug is that pa_bluetooth_transport_set_state() starts the timer when we go from 0->1 disconnected profiles, but after that, the test (old_any_connected != pa_bluetooth_device_any_transport_connected(t->device) is always true and so the timer never gets stopped if we're waiting for more than one transport connection. I think the fix is this. James --- diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c index 7d63f35..e8a0b3d 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,8 +275,9 @@ 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); + n_disconnected_profiles = device_count_disconnected_profiles(t->device); + 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 @@ -285,8 +287,6 @@ void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_tr * which would prevent module-card-restore from restoring the initial * profile properly. */ - n_disconnected_profiles = device_count_disconnected_profiles(t->device); - if (n_disconnected_profiles == 0) device_stop_waiting_for_profiles(t->device); @@ -294,6 +294,9 @@ void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_tr 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) { + device_stop_waiting_for_profiles(t->device); + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); } }