bluez 端点不适用于音频源
bluez endpoints not working for an audio source
我正在尝试使用 A2DP 从 Raspbian 向蓝牙扬声器播放音频。
通过查看 bluez 源代码中的 test/simple-endpoint
,似乎 运行 在没有参数的情况下使用 0000110A-0000-1000-8000-00805F9B34FB
的 A2DP_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
获取的。这似乎有点老套,我不确定这种传输是否适合我以这种方式访问。我希望通过 MediaEndpoint1
的 SetConfiguration
.
访问传输
我在 Rasbian Stretch 上使用 bluez 5.43 观察到了这种行为。我也尝试更新到最新的 bluez 5.50 并看到了相同的行为。
将 bluez 用作音频源的预期方式是什么?
我在调试模式下通过 运行 bluetoothd
解决了问题,并发现 SetConfiguration
/SetConfiguration
是在先前注册的具有路径的端点上调用的/A2DP/SBC/Source/1
个。在线搜索这条路径让我发现它与 bluealsa
相关联,它在系统启动时注册端点,然后接收媒体端点回调而不是我的端点。终止 bluealsa
后,我的音频源端点便能够按预期接收媒体端点回调。
我正在尝试使用 A2DP 从 Raspbian 向蓝牙扬声器播放音频。
通过查看 bluez 源代码中的 test/simple-endpoint
,似乎 运行 在没有参数的情况下使用 0000110A-0000-1000-8000-00805F9B34FB
的 A2DP_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
获取的。这似乎有点老套,我不确定这种传输是否适合我以这种方式访问。我希望通过 MediaEndpoint1
的 SetConfiguration
.
我在 Rasbian Stretch 上使用 bluez 5.43 观察到了这种行为。我也尝试更新到最新的 bluez 5.50 并看到了相同的行为。
将 bluez 用作音频源的预期方式是什么?
我在调试模式下通过 运行 bluetoothd
解决了问题,并发现 SetConfiguration
/SetConfiguration
是在先前注册的具有路径的端点上调用的/A2DP/SBC/Source/1
个。在线搜索这条路径让我发现它与 bluealsa
相关联,它在系统启动时注册端点,然后接收媒体端点回调而不是我的端点。终止 bluealsa
后,我的音频源端点便能够按预期接收媒体端点回调。