Я связал свой телефон Android с Ubuntu 18.04.1 и воспроизводил музыку на телефоне (источник a2dp).Я могу слышать музыку в Ubuntu (приемник a2dp), отправлять команды на телефон (например, Play / Pause / Next и т. Д.), Используя dbus
и media api
из BlueZ, а также получать информацию о треке (Title, Duration, Position of track и т. Д.).)
Проблема: если я играю песню длительностью, скажем, 5 минут в настоящее время в 2:10, запрос dbus дает мне правильную позицию около 130000 мс, но если я вручную изменю позицию на телефоне, скажем, предположим, что 2: 30, запрос dbus по-прежнему показывает время около 130-140k мс, что означает, что он сам вычисляет позицию на основе последней синхронизации и не знает о каких-либо изменениях, сделанных с телефона.Однако, если я сделаю паузу и воспроизведу снова, позиция снова синхронизируется и показывает правильную позицию.
Запрос dbus:
dbus-send --print-reply --system --dest=org.bluez /org/bluez/hci0/dev_44_C3_46_7B_2D_C7/player0 org.freedesktop.DBus.Properties.Get string:"org.bluez.MediaPlayer1" string:"Position"
Я решил провести перекрестную проверку с Windows 10 a2dp sink player
,но там изменение положения трека с телефона немедленно отражается в окне плеера.Я пытался отслеживать сигналы dbus с помощью:
dbus-monitor --system "type='signal', sender='org.bluez'"
И это был вывод:
dbus-monitor: unable to enable new-style monitoring: org.freedesktop.DBus.Error.AccessDenied: "Rejected send message, 1 matched rules; type="method_call", sender=":1.246" (uid=1000 pid=8991 comm="dbus-monitor --system type='signal', sender='org.b" label="unconfined") interface="org.freedesktop.DBus.Monitoring" member="BecomeMonitor" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)". Falling back to eavesdropping.
signal time=1555847560.121045 sender=org.freedesktop.DBus -> destination=:1.246 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.246"
signal time=1555847570.624003 sender=:1.161 -> destination=(null destination) serial=32467 path=/org/bluez/hci0/dev_44_C3_46_7B_2D_C7/fd1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.MediaTransport1"
array [
dict entry(
string "State"
variant string "pending"
)
]
array [
]
signal time=1555847570.625959 sender=:1.161 -> destination=(null destination) serial=32469 path=/org/bluez/hci0/dev_44_C3_46_7B_2D_C7/fd1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.MediaTransport1"
array [
dict entry(
string "State"
variant string "active"
)
]
array [
]
signal time=1555847570.662250 sender=:1.161 -> destination=(null destination) serial=32470 path=/org/bluez/hci0/dev_44_C3_46_7B_2D_C7/player0; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.MediaPlayer1"
array [
dict entry(
string "Status"
variant string "playing"
)
]
array [
]
signal time=1555847570.723943 sender=:1.161 -> destination=(null destination) serial=32471 path=/org/bluez/hci0/dev_44_C3_46_7B_2D_C7/player0; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.MediaPlayer1"
array [
dict entry(
string "Position"
variant uint32 148405
)
]
array [
]
, который подтверждает, что сигнал PropertiesChanged
срабатывает только при таких действиях, как Play / Pause / Next /Предыдущие выполняются, а не при изменении положения на телефоне.
Могу ли я заставить BlueZ запускать сигнал PropertiesChanged
всякий раз, когда захочу, возможно, используя сам BlueZ api?