Bluez(蓝牙)是否在连接时没有发送DBUS method_call SelectConfiguration?如果是这样,我怎么抓住它?

时间:2014-03-21 17:09:37

标签: dbus alsa bluez a2dp

更新 :尚未解决,但是解决方案的一部分。见下文。

我正尝试通过蓝牙将我的iPod或其他智能设备连接到我的笔记本电脑(Kubuntu 13.10),并将a2dp编码的音乐流式传输到蓝牙音箱。没关系,为什么我不直接连接它们。我在设备实际配对然后同时连接时遇到了很多麻烦,但现在我能够做到这一点。有一百万个帖子描述了通过更改.asoundrc,/ etc / bluetooth / audio.conf以及通过PulseAudio控制器加载环回模块来连接BT耳机的不同方法。但是,我永远无法让PulseAudio始终加载源和接收器,所以我抓住了这个想法并开始关注James B的这篇伟大帖子:http://jamesbond3142.no-ip.org/blog/?viewCat=Bluetooth

我编译了代码。它使用BlueZ的(较新的?)DBus API。按照他的指示,我能够将音乐传输到a2dp“服务器”或其中,但没有声音。在代码中,他等待两个DBUS method_calls,SelectConfiguration和SetConfiguration以获得“传输”,我认为它是一个句柄或文件描述符,用于描述音频应该去往/来自哪里。但是,从不调用这些事件的处理程序。我设置dbus-monitor使用本指南在系统总线上监听这些呼叫:https://wiki.ubuntu.com/DebuggingDBus。但是,方法调用不显示。然后,我再次尝试在系统总线上监听任何方法调用,并且有一些在dbus-monitor中没有显示,我知道这些调用正被调用。 (即RegisterEndpoint)

我看到来自org.bluez的信号,但没有方法调用。当在详细模式下运行bluetoothd时,我在连接设备时得到类似的东西:

bluetoothd [12118]:audio / a2dp.c:setup_ref()0x7f9e8ffbdac0:ref = 2 bluetoothd [12118]:audio / avdtp.c:avdtp_set_configuration()0x7f9e8ffd03f0:int_seid = 1,acp_seid = 1 bluetoothd [12118]:audio / a2dp.c:setup_unref()0x7f9e8ffbdac0:ref = 1 bluetoothd [12118]:audio / avdtp.c:session_cb() bluetoothd [12118]:audio / avdtp.c:avdtp_parse_resp()SET_CONFIGURATION请求成功 bluetoothd [12118]:audio / a2dp.c:setconf_cfm()源0x7f9e8ffa4600:Set_Configuration_Cfm bluetoothd [12118]:audio / avdtp.c:avdtp_sep_set_state()流状态已更改:IDLE - > CONFIGURED bluetoothd [12118]:audio / avdtp.c:session_cb() bluetoothd [12118]:audio / avdtp.c:avdtp_parse_resp()OPEN请求成功

但在另一篇文章中,我看到有人有这个:

bluetoothd [8315]:audio / a2dp.c:setup_ref()0x7f1f8300b000:ref = 2 bluetoothd [8315]:audio / avdtp.c:avdtp_set_configuration()0x7f1f83012250:int_seid = 2,acp_seid = 1 bluetoothd [8315]:audio / a2dp.c:setup_unref()0x7f1f8300b000:ref = 1 bluetoothd [8315]:audio / avdtp.c:session_cb() bluetoothd [8315]:audio / avdtp.c:avdtp_parse_resp()SET_CONFIGURATION请求成功 bluetoothd [8315]:audio / a2dp.c:setconf_cfm()Sink 0x7f1f82fc3210:Set_Configuration_Cfm bluetoothd [8315]:audio / media.c:media_endpoint_async_call()调用SetConfiguration:name =:1.65 path = / MediaEndpoint / A2DPSink

bluetoothd [8315]:audio / avdtp.c:avdtp_sep_set_state()流状态已更改:IDLE - > CONFIGURED bluetoothd [8315]:audio / avdtp.c:session_cb() bluetoothd [8315]:audio / avdtp.c:avdtp_parse_resp()OPEN请求成功

此时我有两个理论: 1)当我的设备连接时,BlueZ没有将其发送到我正在观看的总线 2)我没有正确观察(还需要使用dbus_bus_add_match()添加method_calls吗?)

我觉得很难相信第二个,因为詹姆斯B的代码为他工作,我没有修改它。我正在使用bluez版本4.101。 (和他一样,我认为) 很难找到BlueZ调用这些方法的确切条件。

当我启动程序时,我的系统日志会出现类似的内容:

bluetoothd [8519]:端点注册:sender =:1.166 path = / MediaEndpoint / A2DPSource

并在程序退出时取消注册。

我想不出现在要添加的其他细节,但如果我提供的不够,我很高兴。提前谢谢。

更新 的 有点尴尬,但我今天绞尽脑汁想知道LINUX SYSTEM为什么不能获得文件句柄...嗯...所以我将 sudo 附加到程序调用中(James B的a2dp-alsa)程序)它工作。至少对于输入设备。输出(BT扬声器)仍然没有,但我会尽快想出来并在此处发布结果。

我在哪里领取我的菜鸟徽章? :(

1 个答案:

答案 0 :(得分:1)

我没有继续使用BlueZ 4.我升级到BlueZ 5和PulseAudio 5,它们比以前的版本更好地工作。之后,我终于可以使用pactl loopback模块了。 (有关详细信息,请参阅this post。)