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
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss