[gnome-music/wip/jfelder/mpris-coalesce-properties-changes] mpris: Do not send a signal for unchanged properties
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/mpris-coalesce-properties-changes] mpris: Do not send a signal for unchanged properties
- Date: Wed, 5 Jun 2019 14:41:01 +0000 (UTC)
commit b495763d86b878248fc2029f809dc830e77711cf
Author: Jean Felder <jfelder src gnome org>
Date: Thu Apr 4 17:33:15 2019 +0200
mpris: Do not send a signal for unchanged properties
According to MPRIS specifications a signal should only not be sent
when a property value has changed.
Closes: #43
gnomemusic/mpris.py | 83 ++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 56 insertions(+), 27 deletions(-)
---
diff --git a/gnomemusic/mpris.py b/gnomemusic/mpris.py
index d82e2f6a..5999e5d1 100644
--- a/gnomemusic/mpris.py
+++ b/gnomemusic/mpris.py
@@ -255,6 +255,12 @@ class MediaPlayer2Service(Server):
self._player_previous_type = None
self._path_list = []
self._metadata_list = []
+ self._previous_can_go_next = False
+ self._previous_can_go_previous = False
+ self._previous_can_play = False
+ self._previous_is_shuffled = None
+ self._previous_loop_status = ""
+ self._previous_mpris_playlist = self._get_active_playlist()
self._previous_playback_status = "Stopped"
@log
@@ -444,20 +450,35 @@ class MediaPlayer2Service(Server):
@log
def _on_current_song_changed(self, player):
+ # In repeat song mode, no metadata has changed if the
+ # player was already started
+ if self.player.props.repeat_mode == RepeatMode.SONG:
+ self.Seeked(0)
+ if self._previous_can_play is True:
+ return
+
self._update_songs_list()
+ properties = {}
+ properties["Metadata"] = GLib.Variant("a{sv}", self._get_metadata())
+
has_next = self.player.props.has_next
+ if has_next != self._previous_can_go_next:
+ properties["CanGoNext"] = GLib.Variant("b", has_next)
+ self._previous_can_go_next = has_next
+
has_previous = self.player.props.has_previous
- self.PropertiesChanged(MediaPlayer2Service.MEDIA_PLAYER2_PLAYER_IFACE,
- {
- 'Metadata': GLib.Variant('a{sv}', self._get_metadata()),
- 'CanGoNext': GLib.Variant('b', has_next),
- 'CanGoPrevious': GLib.Variant(
- 'b', has_previous),
- 'CanPlay': GLib.Variant('b', True),
- 'CanPause': GLib.Variant('b', True),
- },
- [])
+ if has_previous != self._previous_can_go_previous:
+ properties["CanGoPrevious"] = GLib.Variant("b", has_previous)
+ self._previous_can_go_previous = has_previous
+
+ if self._previous_can_play is not True:
+ properties["CanPause"] = GLib.Variant("b", has_previous)
+ properties["CanPlay"] = GLib.Variant("b", has_previous)
+ self._previous_can_play = True
+
+ self.PropertiesChanged(
+ MediaPlayer2Service.MEDIA_PLAYER2_PLAYER_IFACE, properties, [])
@log
def _on_player_state_changed(self, klass, args):
@@ -475,16 +496,23 @@ class MediaPlayer2Service(Server):
@log
def _on_repeat_mode_changed(self, player, param):
self._update_songs_list()
- has_next = self.player.props.has_next
- has_previous = self.player.props.has_previous
- self.PropertiesChanged(MediaPlayer2Service.MEDIA_PLAYER2_PLAYER_IFACE,
- {
- 'CanGoNext': GLib.Variant('b', has_next),
- 'CanGoPrevious': GLib.Variant('b', has_previous),
- 'LoopStatus': GLib.Variant('s', self._get_loop_status()),
- 'Shuffle': GLib.Variant('b', self.player.props.repeat_mode ==
RepeatMode.SHUFFLE),
- },
- [])
+
+ properties = {}
+
+ is_shuffled = self.player.props.repeat_mode == RepeatMode.SHUFFLE
+ if is_shuffled != self._previous_is_shuffled:
+ properties["Shuffle"] = GLib.Variant("b", is_shuffled)
+ self._previous_is_shuffled = is_shuffled
+
+ loop_status = self._get_loop_status()
+ if loop_status != self._previous_loop_status:
+ properties["LoopStatus"] = GLib.Variant("s", loop_status)
+ self._previous_loop_status = loop_status
+
+ if not properties:
+ return
+ self.PropertiesChanged(
+ MediaPlayer2Service.MEDIA_PLAYER2_PLAYER_IFACE, properties, [])
@log
def _on_seek_finished(self, player, position_second):
@@ -494,14 +522,15 @@ class MediaPlayer2Service(Server):
def _on_player_playlist_changed(self, klass):
self._update_songs_list()
- if (self.player.get_playlist_type() == PlayerPlaylist.Type.PLAYLIST
- or self._player_previous_type == PlayerPlaylist.Type.PLAYLIST):
- variant = GLib.Variant('(b(oss))', self._get_active_playlist())
- self.PropertiesChanged(
- MediaPlayer2Service.MEDIA_PLAYER2_PLAYLISTS_IFACE,
- {'ActivePlaylist': variant, }, [])
+ mpris_playlist = self._get_active_playlist()
+ if mpris_playlist == self._previous_mpris_playlist:
+ return
- self._player_previous_type = klass.get_playlist_type()
+ self._previous_mpris_playlist = mpris_playlist
+ properties = {
+ "ActivePlaylist": GLib.Variant("(b(oss))", mpris_playlist)}
+ self.PropertiesChanged(
+ MediaPlayer2Service.MEDIA_PLAYER2_PLAYLISTS_IFACE, properties, [])
@log
def _reload_playlists(self):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]