Bug 94958

Summary: BlueZ5 module fails to clean out card after headset disconnects
Product: PulseAudio Reporter: juha.kuikka
Component: modulesAssignee: pulseaudio-bugs
Status: RESOLVED FIXED QA Contact: pulseaudio-bugs
Severity: normal    
Priority: medium CC: lennart
Version: unspecified   
Hardware: All   
OS: Linux (All)   
Whiteboard:
i915 platform: i915 features:
Attachments: Patch to fix the issue

Description juha.kuikka 2016-04-16 00:39:04 UTC
Created attachment 122981 [details]
Patch to fix the issue

SW: Pulseaudio 8.0 / BlueZ 5.39

Symptoms:
While disconnecting/reconnecting a paired bluetooth headset (LG HBS750) audio fails roughly on every other connection.

On a failed connection "pactl list cards" shows the bluetooth device's card but "Active Profile: off". Issuing "pacmd set-card-profile X a2dp_sink" makes audio work immediately.

I realized that when this happened, the previous disconnection did not remove the card, instead it was only configured for "Active Profile: off" but otherwise left in place.

Upon looking at PA debug logs I saw that the transport for the a2dp_sink was first set into disconnected state and then into idle state. In "device_connection_changed_cb()" this causes the "pa_bluetooth_device_any_transport_connected()" return true and the module-bluez5-device is not unloaded.

Further investigation shows that this is caused by a race of module-bluez5-device.c:thread_func() and MediaPoint1::ClearConfiguration():

When the FD in thread_func() is closed (POLLHUP) an BLUETOOTH_MESSAGE_STREAM_FD_HUP message is sent into the main thread. The handler of this message unconditionally sets the transport into IDLE state. This is a problem if it has already been set into DISCONNECTED state.

See attached patch for a fix.
Comment 1 Tanu Kaskinen 2016-11-28 11:24:17 UTC
Thanks a lot for investigating and fixing this! I applied the patch now. I'm sorry it took so long, I have a bunch of old bugmail that I didn't have time to read at the time, and I'm now catching up on them.

Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.