[pulseaudio-discuss] [PATCH v2 2/3] bluetooth: separate HSP and HFP
James Bottomley
James.Bottomley at HansenPartnership.com
Sun Aug 21 23:30:37 UTC 2016
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);
}
}
More information about the pulseaudio-discuss
mailing list