Hi, On Thu, Oct 10, 2019 at 11:13 PM yayfortrees <yayfortrees@xxxxxxxxx> wrote: > > Hello, > > I've attached debug logs for 5.50 nopatch and 5.50 with the patch. > > To me it looked like it may be a timing issue - trying to connect the > a2dp sink too early. As an experiment I put a sleep(1) at the top of > the hs_cb function from your patch and the a2dp sink was connected. > With the sleep I still get the "Device or resource busy" error early > on, but it does reconnect the a2dp sink later in the connection and > things work. It's not consistent though, maybe 1 of 5 attempts would > fail to connect the a2dp profile. Try with the following patch. > I included that debug log as well. > > Hope this helps, thanks! > > On Thu, Oct 10, 2019 at 2:10 AM Luiz Augusto von Dentz > <luiz.dentz@xxxxxxxxx> wrote: > > > > Hi, > > > > On Wed, Oct 9, 2019 at 10:51 AM Luiz Augusto von Dentz > > <luiz.dentz@xxxxxxxxx> wrote: > > > > > > Hi, > > > > > > On Wed, Oct 9, 2019 at 1:56 AM yayfortrees <yayfortrees@xxxxxxxxx> wrote: > > > > > > > > Hello, > > > > > > > > I've attached btmon traces for 5.50 and 5.51. Thanks for taking a look! > > > > > > > > Let me know if you need anything else. > > > > > > Must likely the following error has something to do with it: > > > > > > = bluetoothd: a2dp-sink profile connect failed for 34:DF:2A:0D:F8:C2: > > > Device or resource busy > > > > > > I will check why this could be happening. > > > > I tried this one and couldn't reproduce with the headsets I have, > > could you please run bluetooth -dn and attach the logs here? > > > > > > On Tue, Oct 8, 2019 at 4:24 AM Luiz Augusto von Dentz > > > > <luiz.dentz@xxxxxxxxx> wrote: > > > > > > > > > > Hi, > > > > > > > > > > On Mon, Oct 7, 2019 at 10:34 PM yayfortrees <yayfortrees@xxxxxxxxx> wrote: > > > > > > > > > > > > Hello, > > > > > > > > > > > > I recently upgraded bluez to 5.51 from 5.50 and my headphones stopped > > > > > > using the A2DP sink during autoconnect. The headphones instead go to > > > > > > HSP/HFP mode and the A2DP sink is disabled in pavucontrol/pactl. The > > > > > > A2DP sink will only work when the device is initially paired. > > > > > > > > > > > > This had worked flawlessly for years. I was able to track down the > > > > > > regression to this patch: > > > > > > https://www.spinics.net/lists/linux-bluetooth/msg76180.html ([PATCH > > > > > > BlueZ] policy: Add logic to connect a Sink). If I apply the patch to > > > > > > 5.50, my headphones no longer connect to the A2DP sink, if I remove it > > > > > > the problem goes away. > > > > > > > > > > > > Not sure what else I should include to help track this down. The > > > > > > headphones I'm using are Beats Wireless (Solo Bluetooth). > > > > > > > > > > > > The only relevant log entry I see with the patch applied is: > > > > > > a2dp-sink profile connect failed for 34:DF:2A:0D:F8:C2: Device or resource busy > > > > > > > > > > Can you collect the HCI traces of the problem using btmon? I didn't > > > > > expect that to cause any problems, it should in theory solve them but > > > > > lets see. > > > > > > > > > > > Let me know if any other information is needed. > > > > > > Thanks. > > > > > > > > > > > > > > > > > > > > -- > > > > > Luiz Augusto von Dentz > > > > > > > > > > > > -- > > > Luiz Augusto von Dentz > > > > > > > > -- > > Luiz Augusto von Dentz -- Luiz Augusto von Dentz
From 4bbd477cf6ac05aff73ee74f18a1a418b1c1af9f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> Date: Fri, 11 Oct 2019 15:40:04 +0300 Subject: [PATCH BlueZ] audio: Fix cancelling disconnect timeout If AVDTP session has been connected but no stream has been setup calls to service->connect would return -EBUSY to avoid stream setup collision but it also takes a reference to the session which cancelling the disconnect timeout and disabling the stream_setup logic that would attempt to estabilish a stream. --- profiles/audio/sink.c | 25 ++++++++++++------------- profiles/audio/source.c | 25 ++++++++++++------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c index 7cac21034..966440534 100644 --- a/profiles/audio/sink.c +++ b/profiles/audio/sink.c @@ -256,11 +256,18 @@ gboolean sink_setup_stream(struct btd_service *service, struct avdtp *session) if (sink->connect_id > 0 || sink->disconnect_id > 0) return FALSE; - if (session && !sink->session) - sink->session = avdtp_ref(session); - - if (!sink->session) - return FALSE; + if (!sink->session) { + if (session) + sink->session = avdtp_ref(session); + else + sink->session = a2dp_avdtp_get( + btd_service_get_device(service)); + + if (!sink->session) { + DBG("Unable to get a session"); + return FALSE; + } + } sink->connect_id = a2dp_discover(sink->session, discovery_complete, sink); @@ -274,14 +281,6 @@ int sink_connect(struct btd_service *service) { struct sink *sink = btd_service_get_user_data(service); - if (!sink->session) - sink->session = a2dp_avdtp_get(btd_service_get_device(service)); - - if (!sink->session) { - DBG("Unable to get a session"); - return -EIO; - } - if (sink->connect_id > 0 || sink->disconnect_id > 0) return -EBUSY; diff --git a/profiles/audio/source.c b/profiles/audio/source.c index 4081e1970..0ac20fe40 100644 --- a/profiles/audio/source.c +++ b/profiles/audio/source.c @@ -257,11 +257,18 @@ gboolean source_setup_stream(struct btd_service *service, if (source->connect_id > 0 || source->disconnect_id > 0) return FALSE; - if (session && !source->session) - source->session = avdtp_ref(session); - - if (!source->session) - return FALSE; + if (!source->session) { + if (session) + source->session = avdtp_ref(session); + else + source->session = a2dp_avdtp_get( + btd_service_get_device(service)); + + if (!source->session) { + DBG("Unable to get a session"); + return FALSE; + } + } source->connect_id = a2dp_discover(source->session, discovery_complete, source); @@ -275,14 +282,6 @@ int source_connect(struct btd_service *service) { struct source *source = btd_service_get_user_data(service); - if (!source->session) - source->session = a2dp_avdtp_get(btd_service_get_device(service)); - - if (!source->session) { - DBG("Unable to get a session"); - return -EIO; - } - if (source->connect_id > 0 || source->disconnect_id > 0) return -EBUSY; -- 2.21.0