On 16.08.2015 13:40, Georg Chini wrote: > On 16.08.2015 13:26, Eytan Naim wrote: >> >> Hi Georg, >> >> It is asymmetric and I will explain. >> >> When a2dp connection is established, loopback_module is loaded- And >> that is before streaming has started, so streaming is in IDLE state. >> >> Later, when remote device pauses the streaming for small interval, it >> keeps the connection up, and I would expect PulseAudio state machine >> would go back to an IDLE state- without removal of loppback_module. >> >> Thanks. >> >> *From:*pulseaudio-discuss >> [mailto:pulseaudio-discuss-bounces at lists.freedesktop.org] *On Behalf >> Of *Georg Chini >> *Sent:* Sunday, August 16, 2015 2:02 PM >> *To:* General PulseAudio Discussion >> *Subject:* Re: [pulseaudio-discuss] pulseaudio a2dp disconnect problem >> >> On 16.08.2015 12:26, Eytan Naim wrote: >> >> Hi Tanu, >> >> Thanks for your advice and cooperation. >> >> As a result of the loopback_module asymmetric oddity, I compared >> "pacmd list" output command between two states (you can see >> attached files): >> >> 1.After connection establishment, and before streaming starts. >> >> 2.After streaming stops. >> >> If the application would run normally I would expect to find >> similar output. â?? but for some reason the Bluetooth card change >> its active_profile from a2dp_sink to off, so, I assumed this may >> be the problem. >> >> So after digging a little bit in the code, I found a condition in >> the ./src/modules/bluetooth/module-bluetooth-policy.c that >> include all profiles except mine(a2dp source). >> So I decided to apply the following hunk, to prevent the card >> changing its profile (it seemed reasonable for me, because all >> other profile are included in this condition). >> >> Do you know this Bluetooth code? Does it make sense? Is there >> anyone I can ask to confirm it? >> >> static pa_hook_result_t profile_available_hook_callback(pa_core >> *c, pa_card_profile *profile, void *userdata) { >> >> pa_card *card; >> >> const char *s; >> >> bool is_active_profile; >> >> pa_card_profile *selected_profile; >> >> pa_assert(c); >> >> pa_assert(profile); >> >> pa_assert_se((card = profile->card)); >> >> /* Only consider bluetooth cards */ >> >> s = pa_proplist_gets(card->proplist, PA_PROP_DEVICE_BUS); >> >> if (!s || !pa_streq(s, "bluetooth")) >> >> return PA_HOOK_OK; >> >> /* Do not automatically switch profiles for headsets, just in >> case */ >> >> /* TODO: remove a2dp and hsp when we remove BlueZ 4 support */ >> >> if (pa_streq(profile->name, "hsp") || pa_streq(profile->name, >> "a2dp") || pa_streq(profile->name, "a2dp_sink") || >> >> - pa_streq(profile->name, "a2dp_source") || >> pa_streq(profile->name, "headset_head_unit")) >> >> + pa_streq(profile->name, "headset_head_unit")) { >> >> return PA_HOOK_OK; >> >> â?¦ >> >> It seemed it worked J, but the freezing issue still there L. >> >> When an a2dp connection is lost, pa would freeze when trying to >> reconnect and reload the Bluetooth modules. >> >> gdb output: >> >> (gdb) thread apply all bt >> >> Thread 1 (process 1998): >> >> #0 arm_modulus (p=1031, m=123328564) at >> ./ldso/ldso/arm/dl-sysdep.h:29 >> >> #1 _dl_lookup_sysv_hash (type_class=<optimized out>, >> >> undef_name=<optimized out>, hash=123328564, symtab=0xb6d0f3ec, >> >> tpnt=0xb6fc5508) at ldso/ldso/dl-hash.c:255 >> >> #2 _dl_find_hash ( >> >> name=name at entry=0xbec1b5c0 >> "module_bluez5_device_LTX_pa__get_deprecated", >> >> scope=<optimized out>, mytpnt=mytpnt at entry=0x0, >> >> type_class=type_class at entry=-2147483648, >> sym_ref=sym_ref at entry=0xbec1b558) >> >> at ldso/ldso/dl-hash.c:339 >> >> #3 0xb6d86b1c in do_dlsym (caller_address=<optimized out>, >> >> name=0xbec1b5c0 "module_bluez5_device_LTX_pa__get_deprecated", >> >> vhandle=<optimized out>) at ldso/libdl/libdl.c:733 >> >> #4 dlsym (vhandle=<optimized out>, >> >> name=0xbec1b5c0 "module_bluez5_device_LTX_pa__get_deprecated") >> >> at ldso/libdl/libdl.c:765 >> >> #5 0x000116d8 in bind_now_find_sym (d=<optimized out>, >> m=<optimized out>, >> >> symbol=<optimized out>) at daemon/ltdl-bind-now.c:101 >> >> #6 0xb6e039b8 in lt_dlsym () from /usr/lib/libltdl.so.7 >> >> #7 0xb6f5b400 in pa_load_sym (handle=0x5e8f8, >> >> module=module at entry=0xb686247a "module-bluez5-device", >> >> symbol=0xb6fa3121 "pa__get_deprecated") at >> pulsecore/ltdl-helper.c:42 >> >> ---Type <return> to continue, or q <return> to quit--- >> >> #8 0xb6f5d128 in pa_module_load (c=0x24f00, >> >> name=0xb686247a "module-bluez5-device", >> >> argument=argument at entry=0x5e2b0 >> "path=/org/bluez/hci0/dev_98_D6_F7_34_98_E8") at >> pulsecore/module.c:151 >> >> #9 0xb6861ee0 in device_connection_changed_cb (y=<optimized >> out>, d=0x50bb8, >> >> u=0x38950) at modules/bluetooth/module-bluez5-discover.c:77 >> >> #10 0xb6f5b1a4 in pa_hook_fire (hook=0x37840, data=0x50bb8) >> >> at pulsecore/hook-list.c:104 >> >> #11 0xb684f8cc in endpoint_set_configuration (m=m at entry=0x50f10, >> >> userdata=userdata at entry=0x37830, conn=<optimized out>) >> >> at modules/bluetooth/bluez5-util.c:1313 >> >> #12 0xb684fcdc in endpoint_handler (c=<optimized out>, >> m=m at entry=0x50f10, >> >> userdata=userdata at entry=0x37830) at >> modules/bluetooth/bluez5-util.c:1517 >> >> #13 0xb6ddf800 in _dbus_object_tree_dispatch_and_unlock >> (tree=0x399e0, >> >> message=message at entry=0x50f10, >> found_object=found_object at entry=0xbec1b99c) >> >> at dbus-object-tree.c:1018 >> >> #14 0xb6dd1104 in dbus_connection_dispatch (connection=0x39c28) >> >> at dbus-connection.c:4718 >> >> #15 0xb6ec81b4 in dispatch_cb (ea=0x2124c, ev=0x35a20, >> userdata=0x407) >> >> at pulsecore/dbus-util.c:53 >> >> #16 0xb6f1a798 in dispatch_defer (m=<optimized out>) at >> pulse/mainloop.c:680 >> >> #17 pa_mainloop_dispatch (m=m at entry=0x21208) at pulse/mainloop.c:889 >> >> #18 0xb6f1ab98 in pa_mainloop_iterate (m=m at entry=0x21208, >> block=block at entry=1, >> >> ---Type <return> to continue, or q <return> to quit--- >> >> retval=retval at entry=0xbec1ba9c) at pulse/mainloop.c:929 >> >> #19 0xb6f1abfc in pa_mainloop_run (m=m at entry=0x21208, >> retval=0xbec1ba9c, >> >> retval at entry=0xbec1ba94) at pulse/mainloop.c:944 >> >> #20 0x0000d9ec in main (argc=<optimized out>, argv=<optimized out>) >> >> at daemon/main.c:1134 >> >> -----Original Message----- >> From: Tanu Kaskinen [mailto:tanuk at iki.fi] >> Sent: Friday, August 14, 2015 12:00 PM >> To: Eytan Naim; pulseaudio-discuss at lists.freedesktop.org >> <mailto:pulseaudio-discuss at lists.freedesktop.org> >> Subject: Re: [pulseaudio-discuss] pulseaudio a2dp disconnect problem >> >> On Thu, 2015-08-13 at 12:35 +0000, Eytan Naim wrote: >> >> > Hi Tanu, >> >> > >> >> > Thanks for the reply. >> >> > >> >> > I think that the loopback module shouldnâ??t be unloaded each time >> >> > steaming stops for the simple reason that it is loaded when >> connection >> >> > is established, and not when streaming starts. >> >> Yes, that's oddly asymmetric, and should perhaps be fixed. That >> said, as long as module-loopback gets loaded again when the >> streaming continues, the current logic shouldn't necessarily >> cause too much trouble. In your case module-loopback doesn't get >> loaded again, but that might be because pulseaudio gets stuck >> before that has a chance to happen. >> >> > I get all kind of PulseAudio problems, for example in the example >> >> > below, PulseAudio success to stream in the start, but after >> pausing >> >> > and playing again PulseAudio act differently. >> >> > >> >> > - It looks like PulseAudio has problem to handle changing >> connection >> >> > state or something. >> >> > >> >> > >> >> > >> >> > The below log was produced by the following steps: >> >> > >> >> > a) connection establishment >> >> > >> >> > b) streaming session >> >> > >> >> > c) stop from remote device >> >> > >> >> > d) unloading loopback module >> >> > >> >> > e) toggling streaming start/stop without PulseAudio suitable >> >> > response >> >> > >> >> > f) pacmd failure for long time (more then 3-4 minutes). â?? so >> >> > itâ??s probably not a dbus thing. >> >> > >> >> > >> >> > >> >> > Please notice that each time I try a test, something a little >> >> > different happens- but it always has to do with modules >> >> > unloading/PulseAudio doesnâ??t response >> >> Getting stuck is the most interesting problem here. Can you run >> pulseaudio in gdb, and when it gets stuck, stop and give command >> "thread apply all bt"? >> >> -- >> >> Tanu >> >> >> It is correct that the profile is set to "off" when a stream stops. >> The a2dp connection >> is torn down on the bluetooth end, so it would not make sense to keep >> the profile in >> pulesaudio. This is definitely not the cause of your problem. And >> actually I cannot >> see that it's asymmetric. The loopback module is loaded as soon as >> the profile is >> switched to a2dp and unloaded as soon as the profile changes to "off". >> BTW, you can avoid loading and unloading the loopback module >> automatically by >> loading module-bluetooth-policy with argument a2dp_source=0. But then >> you have >> to load the loopback manually and move it to the right source. Maybe >> it is a good idea >> to test that because the issue might also be caused by >> module-bluetooth-policy. >> >> The phone application I wrote handles insertion of loopback modues >> and does not >> rely on module-bluetuetooth policy for that. Up to now I have not >> seen a similar >> issue, the application reacts to switches between a2dp/hsp/off >> without problems. >> >> Georg >> >> > Hi, > my main point was that you should test it with a2dp_source=0 as > argument to module-bluetooth-policy, because I am using it that > way and it works without issues. It might help to narrow down the > problem. > I won't argue about the symmetry. > > Regards > Georg > I just tested it for my setup. When I connect my phone (Galaxy S6), it initially connects the HSP profile (probably because I am running ofono). When I start playing music it switches to a2dp and when I pause it goes to off. Resuming the stream works, it goes back to a2dp as expected. But I hit another issue: When I completely disconnect the phone and re-connect it and then try to play music again, pulseaudio crashes with following message: [pulseaudio] source.h: Assertion 'pa_object_refcnt(pa_object_cast(o)) > 0' failed at ./pulsecore/source.h:249, function pa_source_assert_ref(). Aborting. Regards Georg -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20150816/549700a5/attachment-0001.html>