[pulseaudio-discuss] module-bluetooth-device does not automatically select the a2dp profile when pulseaudio is loaded

Erwan Martin main at zewaren.net
Sat Feb 4 03:32:36 PST 2012


So, I'll answer my own question:

Here's what happens:
In src/modules/bluetooth/bluetooth-util.c:
1) found_device() calls org.bluez.Device.GetProperties.
2) get_properties_reply() parses the first properties, then calls 
parse_device_property().
3) parse_device_property() sees that the device has interface 
A2DP_SINK_UUID, so it calls org.bluez.AudioSink.GetProperties 
asynchronously.
4) get_properties_reply() calls its callback, load_module_for_device() 
(in src/modules/bluetooth/module-bluetooth-discover.c). This callback 
loads module-bluetooth-device, which creates the audio card.

The problem is that in my configuration, the answer to 
org.bluez.AudioSink.GetProperties does not come before 
load_module_for_device() is called. In that case, the device is 
instantiated with its properties half loaded (device->audio_state == 
connected but device->audio_sink_state == invalid_state), hence no 
profile is selected.

The fact that we are dealing with a concurrency issue was why I could 
not reproduce this with my other system.

I don't have any system where I can compile and test the latest version, 
so I don't know if this problem was fixed since 0.9.21.
Should I create a proper bug report?

Erwan Martin.

On 30/1/2012 12:20 AM, Erwan Martin wrote:
> Hi list,
>
> I'm trying to use pulseaudio with a bluetooth a2dp connection  (with 
> module-bluetooth-device and module-bluetooth-discover; i.e. without 
> alsa).
>
> My problem is that the A2DP profile is not automatically selected for 
> the bluetooth card when pulseaudio is loaded when the a2dp connection 
> is already active.
> Here is the relevant log part:
>
> # pulsaudio -C -vvvv
> [...]
> D: module-bluetooth-discover.c: Loading module-bluetooth-device 
> address="DE:AD:BE:EF:00:00" 
> path="/org/bluez/1062/hci0/dev_DE:AD:BA:BE:00:00"
> I: module-card-restore.c: Restoring profile for card 
> bluez_card.DE:AD:BA:BE:00:00.
> I: card.c: Created 1 "bluez_card.DE:AD:BA:BE:00:00"
> W: module-bluetooth-device.c: Default profile not connected, selecting 
> off profile
> D: module-bluetooth-device.c: Connected to the bluetooth audio service
> I: module.c: Loaded "module-bluetooth-device" (index: #17; argument: 
> "address="DE:AD:BE:EF:00:00" 
> path="/org/bluez/1062/hci0/dev_DE:AD:BA:BE:00:00"").
>
> If I restart the bluetooth stack and create the a2dp connection after 
> pulseaudio is loaded (using dbus commands), then the profile gets 
> selected, the sink is created and the audio streams:
>
> D: bluetooth-util.c: dbus: interface=org.freedesktop.DBus, 
> path=/org/freedesktop/DBus, member=NameOwnerChanged
> D: bluetooth-util.c: Bluetooth daemon disappeared.
> D: module-bluetooth-discover.c: Unloading module for 
> /org/bluez/1643/hci0/dev_DE:AD:BA:BE:00:00
> D: module-console-kit.c: dbus: interface=org.freedesktop.DBus, 
> path=/org/freedesktop/DBus, member=NameOwnerChanged
> D: module-bluetooth-device.c: dbus: interface=org.freedesktop.DBus, 
> path=/org/freedesktop/DBus, member=NameOwnerChanged
> I: module.c: Unloading "module-bluetooth-device" (index: #17).
> I: card.c: Freed 1 "bluez_card.DE:AD:BA:BE:00:00"
> I: module.c: Unloaded "module-bluetooth-device" (index: #17).
> D: bluetooth-util.c: dbus: interface=org.freedesktop.DBus, 
> path=/org/freedesktop/DBus, member=NameOwnerChanged
> D: bluetooth-util.c: Bluetooth daemon appeared.
> D: module-console-kit.c: dbus: interface=org.freedesktop.DBus, 
> path=/org/freedesktop/DBus, member=NameOwnerChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.Manager, path=/, 
> member=AdapterAdded
> D: bluetooth-util.c: Adapter /org/bluez/1670/hci0 created
> D: module-console-kit.c: dbus: interface=org.bluez.Manager, path=/, 
> member=AdapterAdded
> D: bluetooth-util.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.Audio, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.Audio, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.Device, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.Device, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.Audio, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-bluetooth-discover.c: Loading module-bluetooth-device 
> address="DE:AD:BE:EF:00:00" 
> path="/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00"
> I: module-card-restore.c: Restoring profile for card 
> bluez_card.DE:AD:BA:BE:00:00.
> I: card.c: Created 2 "bluez_card.DE:AD:BA:BE:00:00"
> D: module-bluetooth-device.c: Connected to the bluetooth audio service
> D: module-bluetooth-device.c: Sending BT_REQUEST -> BT_GET_CAPABILITIES
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- BT_GET_CAPABILITIES
> D: module-bluetooth-device.c: Payload size is 39 6
> D: module-bluetooth-device.c: Sending BT_REQUEST -> BT_GET_CAPABILITIES
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- BT_GET_CAPABILITIES
> D: module-bluetooth-device.c: Payload size is 13 6
> D: module-bluetooth-device.c: Got device capabilities
> D: module-bluetooth-device.c: Sending BT_REQUEST -> BT_OPEN
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- BT_OPEN
> D: module-bluetooth-device.c: Sending BT_REQUEST -> BT_SET_CONFIGURATION
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- 
> BT_SET_CONFIGURATION
> I: module-bluetooth-device.c: SBC parameters:
> I: module-bluetooth-device.c:   allocation=0
> I: module-bluetooth-device.c:   subbands=1
> I: module-bluetooth-device.c:   blocks=3
> I: module-bluetooth-device.c:   bitpool=53
> D: module-bluetooth-device.c: Connection to the device configured
> D: module-bluetooth-device.c: Got the stream socket
> I: sink.c: Created sink 1 "bluez_sink.DE:AD:BA:BE:00:00" with sample 
> spec s16le 2ch 44100Hz and channel map front-left,front-right
> I: sink.c:     bluetooth.protocol = "a2dp"
> I: sink.c:     device.description = "DOESNOTMATTER"
> I: sink.c:     device.string = "DE:AD:BE:EF:00:00"
> I: sink.c:     device.api = "bluez"
> I: sink.c:     device.class = "sound"
> I: sink.c:     device.bus = "bluetooth"
> I: sink.c:     bluez.path = "/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00"
> I: sink.c:     bluez.class = "0x3e010c"
> I: sink.c:     bluez.name = "DOESNOTMATTER"
> I: sink.c:     device.icon_name = "audio-card-bluetooth"
> I: source.c: Created source 2 "bluez_sink.DE:AD:BA:BE:00:00.monitor" 
> with sample spec s16le 2ch 44100Hz and channel map front-left,front-right
> I: source.c:     device.description = "Monitor of DOESNOTMATTER"
> I: source.c:     device.class = "monitor"
> I: source.c:     device.string = "DE:AD:BE:EF:00:00"
> I: source.c:     device.api = "bluez"
> I: source.c:     device.bus = "bluetooth"
> I: source.c:     bluez.path = 
> "/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00"
> I: source.c:     bluez.class = "0x3e010c"
> I: source.c:     bluez.name = "DOESNOTMATTER"
> I: source.c:     device.icon_name = "audio-card-bluetooth"
> D: module-bluetooth-device.c: IO Thread starting up
> I: core-util.c: Successfully enabled SCHED_RR scheduling for thread, 
> with priority 4, which is lower than the requested 5.
> D: module-bluetooth-device.c: Sending BT_REQUEST -> BT_START_STREAM
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- BT_START_STREAM
> D: module-bluetooth-device.c: Trying to receive message from audio 
> service...
> D: module-bluetooth-device.c: Received BT_RESPONSE <- BT_NEW_STREAM
> D: module-bluetooth-device.c: Stream properly set up, we're ready to 
> roll!
> D: module-bluetooth-device.c: Using SBC encoder implementation: MMX
> D: module-suspend-on-idle.c: Sink bluez_sink.DE:AD:BA:BE:00:00 becomes 
> idle, timeout in 5 seconds.
> I: module.c: Loaded "module-bluetooth-device" (index: #18; argument: 
> "address="DE:AD:BE:EF:00:00" 
> path="/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00"").
> D: module-console-kit.c: dbus: interface=org.bluez.Audio, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-bluetooth-device.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: bluetooth-util.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-console-kit.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
> D: module-bluetooth-device.c: dbus: interface=org.bluez.AudioSink, 
> path=/org/bluez/1670/hci0/dev_DE:AD:BA:BE:00:00, member=PropertyChanged
>
> What bothers me is that I have a second computer with the same 
> configuration which is working right (a2dp is automatically selected 
> when pulseaudio is started).
>
> Any help would be greatly apreciated.
>
> $ uname -a
> Linux debian 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64 
> GNU/Linux
>
> $ dpkg -l | grep pulse
> ii  libpulse0                           0.9.21-3+squeeze1            
> PulseAudio client libraries
> ii  pulseaudio                          0.9.21-3+squeeze1            
> PulseAudio sound server
> ii  pulseaudio-module-bluetooth         0.9.21-3+squeeze1            
> Bluetooth module for PulseAudio sound server
>
> $ dpkg -l | grep bluez
> ii  bluez                               4.66-3                       
> Bluetooth tools and daemons
>
> Erwan Martin.
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
>



More information about the pulseaudio-discuss mailing list