[gnome-music/wip/jfelder/async-duration: 44/44] gstplayer: Improve query duration handling




commit ee6442094c4c35c84d440faea56d09dde2cee19d
Author: Jean Felder <jfelder src gnome org>
Date:   Sun Mar 21 20:14:32 2021 +0100

    gstplayer: Improve query duration handling

 gnomemusic/gstplayer.py | 31 ++++++++++++++++++++-----------
 gnomemusic/player.py    |  4 ++--
 2 files changed, 22 insertions(+), 13 deletions(-)
---
diff --git a/gnomemusic/gstplayer.py b/gnomemusic/gstplayer.py
index 9d5915218..3a10ccd67 100644
--- a/gnomemusic/gstplayer.py
+++ b/gnomemusic/gstplayer.py
@@ -28,7 +28,7 @@ from gettext import gettext as _, ngettext
 import gi
 gi.require_version('Gst', '1.0')
 gi.require_version('GstPbutils', '1.0')
-from gi.repository import GLib, Gtk, Gio, GObject, Gst, GstPbutils
+from gi.repository import Gtk, Gio, GObject, Gst, GstPbutils
 
 
 class Playback(IntEnum):
@@ -64,6 +64,7 @@ class GstPlayer(GObject.GObject):
 
         self._application = application
         self._duration = -1.
+        self._known_duration = False
         self._log = application.props.log
         self._seek = False
         self._tick = 0
@@ -82,6 +83,8 @@ class GstPlayer(GObject.GObject):
             None, self._settings.get_value('replaygain'))
 
         self._bus.connect('message::async-done', self._on_async_done)
+        self._bus.connect(
+            "message::duration-changed", self._on_duration_changed)
         self._bus.connect('message::error', self._on_bus_error)
         self._bus.connect('message::element', self._on_bus_element)
         self._bus.connect('message::eos', self._on_bus_eos)
@@ -127,17 +130,27 @@ class GstPlayer(GObject.GObject):
         self.emit("about-to-finish")
 
     def _on_async_done(self, bus, message):
+        self._log.debug("async done")
         if self._seek:
             self._seek = False
             self.emit("seek-finished")
 
+        if not self._known_duration:
+            self._query_duration()
+
+    def _on_duration_changed(self, bus, message):
+        self._log.debug("duration changed")
+        self._query_duration()
+
     def _query_duration(self):
-        success, duration = self._player.query_duration(
+        self._known_duration, duration = self._player.query_duration(
             Gst.Format.TIME)
 
-        if success:
+        if self._known_duration:
             self.props.duration = duration / Gst.SECOND
+            self._log.debug("duration ok: {}".format(self.props.duration))
         else:
+            self._log.debug("DURATION NOT OK")
             self.props.duration = duration
 
     def _on_new_clock(self, bus, message):
@@ -154,14 +167,10 @@ class GstPlayer(GObject.GObject):
             self._missing_plugin_messages.append(message)
 
     def _on_bus_stream_start(self, bus, message):
-        def delayed_query():
-            self._query_duration()
-            self._tick = 0
-            self.emit("stream-start")
-
-        # Delay the signalling slightly or the new duration will not
-        # have been set yet.
-        GLib.timeout_add(1, delayed_query)
+        self._log.debug("stream start")
+        self._query_duration()
+        self._tick = 0
+        self.emit("stream-start")
 
     def _on_state_changed(self, bus, message):
         if message.src != self._player:
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index bdf85daf8..1d3692924 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -547,8 +547,8 @@ class Player(GObject.GObject):
             self.play()
 
     def _on_clock_tick(self, klass, tick):
-        self._log.debug("Clock tick {}, player at {} seconds".format(
-            tick, self._gst_player.props.position))
+        # self._log.debug("Clock tick {}, player at {} seconds".format(
+        #     tick, self._gst_player.props.position))
 
         current_song = self._playlist.props.current_song
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]