bluez 端点不适用于音频源

bluez endpoints not working for an audio source

我正在尝试使用 A2DP 从 Raspbian 向蓝牙扬声器播放音频。

通过查看 bluez 源代码中的 test/simple-endpoint,似乎 运行 在没有参数的情况下使用 0000110A-0000-1000-8000-00805F9B34FBA2DP_SOURCE_UUID 注册一个端点。但是,当使用 bluetoothctl 连接到蓝牙扬声器时,我没有看到任何端点的回调方法被调用 (SelectConfiguration/SetConfiguration)。我尝试了两种不同类型的蓝牙扬声器。

如果我在 "sbcsink" 模式下改为 运行 simple-endpoint,然后将我的 phone 连接到它,我确实看到端点的方法调用 (SelectConfiguration/SetConfiguration)。因此,端点似乎适用于 A2DP 接收器 uuid,但不适用于源。

通过遍历 dbus 管理的对象,我能够找到与蓝牙扬声器对应的 org.bluez.MediaTransport1

import dbus

bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('org.bluez', '/'), 'org.freedesktop.DBus.ObjectManager')
for path, ifaces in manager.GetManagedObjects().items():
    transport = ifaces.get('org.bluez.MediaTransport1')
    if transport is None:
        continue
    transport_obj = dbus.Interface(bus.get_object('org.bluez', path), 'org.bluez.MediaTransport1')
    (fd, read_mtu, write_mtu) = transport_obj.Acquire('w')
    taken_fd = fd.take()
    print(path, fd, taken_fd, read_mtu, write_mtu)

我可以写入传输的文件描述符 taken_fd,但我无法像我想的那样控制音频配置,如果传输是通过 org.bluez.MediaEndpoint1 获取的。这似乎有点老套,我不确定这种传输是否适合我以这种方式访问​​。我希望通过 MediaEndpoint1SetConfiguration.

访问传输

我在 Rasbian Stretch 上使用 bluez 5.43 观察到了这种行为。我也尝试更新到最新的 bluez 5.50 并看到了相同的行为。

将 bluez 用作音频源的预期方式是什么?

我在调试模式下通过 运行 bluetoothd 解决了问题,并发现 SetConfiguration/SetConfiguration 是在先前注册的具有路径的端点上调用的/A2DP/SBC/Source/1 个。在线搜索这条路径让我发现它与 bluealsa 相关联,它在系统启动时注册端点,然后接收媒体端点回调而不是我的端点。终止 bluealsa 后,我的音频源端点便能够按预期接收媒体端点回调。