Bluez (bluetoothd) 在连接时是否未发送 DBUS method_call SelectConfiguration?如果是,我该如何捕获它?

Bluez (bluetoothd) 在连接时是否未发送 DBUS method_call SelectConfiguration?如果是,我该如何捕获它?

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

我正尝试通过蓝牙将我的 iPod 或其他智能设备连接到我的笔记本电脑 (Kubuntu 13.10),并将 a2dp 编码的音乐传输到蓝牙扬声器。别介意我为什么不直接连接它们。我很难让设备真正配对然后同时连接,但现在我可以做到了。有无数的帖子描述了通过更改、.asoundrc并通过 PulseAudio 的控制器/etc/bluetooth/audio.conf加载loopback模块来连接 BT 耳机的不同方法。然而,我永远无法让 PulseAudio 始终如一地加载源和接收器,所以我放弃了这个想法,开始关注 James B 的这篇精彩帖子:用于 ALSA 的 Bluez A2DP AudioSink

我编译了代码。它使用 BlueZ 的(较新的?)DBus API。按照他的指示,我能够将音乐传输到 a2dp“服务器”或从中传输出来,但没有声音。在代码中,他等待两个 DBUS method_calls,SelectConfigurationSetConfiguration获取“传输”,我认为这是一个句柄或文件描述符,描述音频应该从哪里去/从哪里去。但是,这些事件的处理程序从未被调用。我dbus-monitor使用本指南设置了在系统总线上监听这些调用调试DBus。但是,方法调用没有显示。然后,我尝试监听系统总线上的任何方法调用,有些方法没有显示在 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 request succeeded
bluetoothd[12118]: audio/a2dp.c:setconf_cfm() Source 0x7f9e8ffa4600: Set_Configuration_Cfm
bluetoothd[12118]: audio/avdtp.c:avdtp_sep_set_state() stream state changed: IDLE -> CONFIGURED
bluetoothd[12118]: audio/avdtp.c:session_cb()
bluetoothd[12118]: audio/avdtp.c:avdtp_parse_resp() OPEN request
succeeded

但在另一篇文章中我看到有人有这样的情况:

bluetoothd[8315]: audio/a2dp.c:setup_ref() 0x7f1f8300b000: ref=2 <br/>
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 request succeeded
bluetoothd[8315]: audio/a2dp.c:setconf_cfm() Sink 0x7f1f82fc3210: Set_Configuration_Cfm
**
bluetoothd[8315]: audio/media.c:media_endpoint_async_call() Calling SetConfiguration: name = :1.65 path = /MediaEndpoint/A2DPSink
**
bluetoothd[8315]: audio/avdtp.c:avdtp_sep_set_state() stream state changed: IDLE -> CONFIGURED
bluetoothd[8315]: audio/avdtp.c:session_cb()
bluetoothd[8315]: audio/avdtp.c:avdtp_parse_resp() OPEN request succeeded

目前我有两个理论:

  1. 当我的设备连接时,BlueZ 不会将其发送到我正在观察的总线。
  2. 我观察得不正确(method_calls 也需要添加吗dbus_bus_add_match ()?)

我很难相信第二个,因为 James B 的代码对他有用,而我没有修改它。我使用的是 bluez 版本 4.101。(我想和他一样)很难找到 BlueZ 调用这些方法的确切条件。

当我启动该程序时,我的系统日志显示如下内容:

bluetoothd[8519]: Endpoint registered: sender=:1.166 path=/MediaEndpoint/A2DPSource

当程序退出时也会取消注册。

我暂时想不出其他细节可以补充,但如果我提供的还不够多,我很乐意补充。提前致谢

更新:有点尴尬,但今天我绞尽脑汁想为什么 LINUX SYSTEM 无法获得文件句柄...嗯...所以我将 sudo 附加到程序调用(James B 的 a2dp-alsa 程序)并且它起作用了。至少对于输入设备来说是这样。对于输出(BT 扬声器)仍然没有任何结果,但我会尽快弄清楚并在此处发布结果。

相关内容