Floods DBus with mpris notifications
See for example this log output from gajim
21/09/20 17:05:06 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:06 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:06 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'CanPlay': <true>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'PlaybackStatus': <'Playing'>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'PlaybackStatus': <'Playing'>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'CanPlay': <true>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'CanPlay': <true>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'PlaybackStatus': <'Playing'>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
21/09/20 17:05:07 (I) gajim.c.dbus.music_track Signal received: org.freedesktop.DBus.Properties - ('org.mpris.MediaPlayer2.Player', {'PlaybackStatus': <'Playing'>}, @as [])
21/09/20 17:05:07 (D) gajim.c.ged Raise event: music-track-changed
21/09/20 17:05:07 (D) gajim.c.ged Call handler _on_music_track_changed on <gajim.common.modules.user_tune.UserTune object at 0x7fe6856a5310>
This happens every couple of seconds, over and over again.
Part of the problem is that this happens on every GStreamer state-changed
message. The biggest part of the problem is solved by the following diff
diff --git a/src/audio/backend/gstreamer_backend.rs b/src/audio/backend/gstreamer_backend.rs
index c0c0745..463ef31 100644
--- a/src/audio/backend/gstreamer_backend.rs
+++ b/src/audio/backend/gstreamer_backend.rs
@@ -445,14 +445,16 @@ impl GstreamerBackend {
}
}
MessageView::StateChanged(sc) => {
- let playback_state = match sc.get_current() {
- gstreamer::State::Playing => PlaybackState::Playing,
- gstreamer::State::Paused => PlaybackState::Playing,
- gstreamer::State::Ready => PlaybackState::Playing,
- _ => PlaybackState::Stopped,
- };
-
- send!(sender, GstreamerMessage::PlaybackStateChanged(playback_state));
+ if message.get_src().as_ref() == Some(pipeline.upcast_ref::<gstreamer::Object>()) {
+ let playback_state = match sc.get_current() {
+ gstreamer::State::Playing => PlaybackState::Playing,
+ gstreamer::State::Paused => PlaybackState::Playing,
+ gstreamer::State::Ready => PlaybackState::Playing,
+ _ => PlaybackState::Stopped,
+ };
+
+ send!(sender, GstreamerMessage::PlaybackStateChanged(playback_state));
+ }
}
MessageView::Buffering(buffering) => {
let percent = buffering.get_percent();
Nonetheless this is not sufficient. There are still many useless notifications.
Instead, Shortwave should remember what it notified to mpris last and only ever notify if something has actually changed.