Положение дорожки BlueZ MediaPlayer не синхронизировано с телефоном - PullRequest
1 голос
/ 21 апреля 2019

Я связал свой телефон 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?

...