[gnome-music/wip/mschraal/player-factor-out-gstreamer: 14/56] Factoring gst out
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/mschraal/player-factor-out-gstreamer: 14/56] Factoring gst out
- Date: Fri, 16 Feb 2018 10:39:08 +0000 (UTC)
commit 4a2da205d6ca4813f11ab42b00f78a749a376632
Author: Marinus Schraal <mschraal gnome org>
Date: Mon Feb 5 03:37:20 2018 +0100
Factoring gst out
gnomemusic/application.py | 2 +-
gnomemusic/player.py | 444 +++++++++++++++++++++++++++-------------------
2 files changed, 259 insertions(+), 187 deletions(-)
---
diff --git a/gnomemusic/application.py b/gnomemusic/application.py
index 00ec429..e06bbdd 100644
--- a/gnomemusic/application.py
+++ b/gnomemusic/application.py
@@ -111,7 +111,7 @@ class Application(Gtk.Application):
def do_activate(self):
if not self._window:
self._window = Window(self)
- MediaPlayer2Service(self)
+ # MediaPlayer2Service(self)
if self._settings.get_value('notifications'):
self._notifications = NotificationManager(self._window.player)
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index 5432377..2297f17 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -77,93 +77,59 @@ class DiscoveryStatus:
SUCCEEDED = 2
-class Player(GObject.GObject):
- nextTrack = None
- timeout = None
- _seconds_timeout = None
- shuffleHistory = deque(maxlen=10)
-
- __gsignals__ = {
- 'playing-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'playlist-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'playlist-item-changed': (GObject.SignalFlags.RUN_FIRST, None, (Gtk.TreeModel, Gtk.TreeIter)),
- 'current-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'playback-status-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'repeat-mode-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'volume-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'prev-next-invalidated': (GObject.SignalFlags.RUN_FIRST, None, ()),
- 'seeked': (GObject.SignalFlags.RUN_FIRST, None, (int,)),
- 'thumbnail-updated': (GObject.SignalFlags.RUN_FIRST, None, ()),
- }
-
- def __repr__(self):
- return '<Player>'
+class GstPlayer(GObject.GObject):
@log
- def __init__(self, parent_window):
+ def __init__(self, player):
super().__init__()
- self._parent_window = parent_window
- self.playlist = None
- self.playlistType = None
- self.playlistId = None
- self.playlistField = None
- self.currentTrack = None
- self.currentTrackUri = None
- self._missingPluginMessages = []
-
Gst.init(None)
- GstPbutils.pb_utils_init()
- self.discoverer = GstPbutils.Discoverer()
- self.discoverer.connect('discovered', self._on_discovered)
- self.discoverer.start()
- self._discovering_urls = {}
+ self._settings = Gio.Settings.new('org.gnome.Music')
- self.player = Gst.ElementFactory.make('playbin', 'player')
- self.bus = self.player.get_bus()
- self.bus.add_signal_watch()
- self.setup_replaygain()
+ self._super_player = player
- self._settings = Gio.Settings.new('org.gnome.Music')
- self._settings.connect('changed::repeat', self._on_repeat_setting_changed)
- self._settings.connect('changed::replaygain', self._on_replaygain_setting_changed)
- self.repeat = self._settings.get_enum('repeat')
- self.replaygain = self._settings.get_value('replaygain') is not None
- self.toggle_replaygain(self.replaygain)
+ self._player = Gst.ElementFactory.make('playbin', 'player')
+ self._bus = self._player.get_bus()
+ self._bus.add_signal_watch()
+ self._setup_replaygain()
- self.bus.connect('message::state-changed', self._on_bus_state_changed)
- self.bus.connect('message::error', self._onBusError)
- self.bus.connect('message::element', self._on_bus_element)
- self.bus.connect('message::eos', self._on_bus_eos)
- self._setup_view()
+ replaygain = self._settings.get_value('replaygain') is not None
+ self._toggle_replaygain(replaygain)
- self.playlist_insert_handler = 0
- self.playlist_delete_handler = 0
+ self._settings.connect(
+ 'changed::replaygain', self._on_replaygain_setting_changed)
- self._lastfm = LastFmScrobbler()
+ self._bus.connect('message::state-changed', self._on_bus_state_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)
@log
- def _on_replaygain_setting_changed(self, settings, value):
- self.replaygain = settings.get_value('replaygain') is not None
- self.toggle_replaygain(self.replaygain)
+ def _setup_replaygain(self):
+ """Set up replaygain
- @log
- def setup_replaygain(self):
- """
- Set up replaygain
See https://github.com/gnumdk/lollypop/commit/429383c3742e631b34937d8987d780edc52303c0
"""
self._rgfilter = Gst.ElementFactory.make("bin", "bin")
- self._rg_audioconvert1 = Gst.ElementFactory.make("audioconvert", "audioconvert")
- self._rg_audioconvert2 = Gst.ElementFactory.make("audioconvert", "audioconvert2")
+ self._rg_audioconvert1 = Gst.ElementFactory.make(
+ "audioconvert", "audioconvert")
+ self._rg_audioconvert2 = Gst.ElementFactory.make(
+ "audioconvert", "audioconvert2")
self._rgvolume = Gst.ElementFactory.make("rgvolume", "rgvolume")
self._rglimiter = Gst.ElementFactory.make("rglimiter", "rglimiter")
- self._rg_audiosink = Gst.ElementFactory.make("autoaudiosink", "autoaudiosink")
- if not self._rgfilter or not self._rg_audioconvert1 or not self._rg_audioconvert2 \
- or not self._rgvolume or not self._rglimiter or not self._rg_audiosink:
+ self._rg_audiosink = Gst.ElementFactory.make(
+ "autoaudiosink", "autoaudiosink")
+
+ if (not self._rgfilter
+ or not self._rg_audioconvert1
+ or not self._rg_audioconvert2
+ or not self._rgvolume
+ or not self._rglimiter
+ or not self._rg_audiosink):
logger.debug("Replay Gain is not available")
return
+
self._rgvolume.props.pre_amp = 0.0
self._rgfilter.add(self._rgvolume)
self._rgfilter.add(self._rg_audioconvert1)
@@ -174,61 +140,29 @@ class Player(GObject.GObject):
self._rgvolume.link(self._rg_audioconvert2)
self._rgvolume.link(self._rglimiter)
self._rg_audioconvert2.link(self._rg_audiosink)
- self._rgfilter.add_pad(Gst.GhostPad.new("sink", self._rg_audioconvert1.get_static_pad("sink")))
+ self._rgfilter.add_pad(Gst.GhostPad.new(
+ "sink", self._rg_audioconvert1.get_static_pad("sink")))
@log
- def toggle_replaygain(self, state=False):
+ def _toggle_replaygain(self, state=False):
if state and self._rgfilter:
- self.player.set_property("audio-sink", self._rgfilter)
+ self._player.set_property("audio-sink", self._rgfilter)
else:
- self.player.set_property("audio-sink", None)
-
- def discover_item(self, item, callback, data=None):
- url = item.get_url()
- if not url:
- logger.warn("The item %s doesn't have a URL set", item)
- return
-
- if not url.startswith("file://"):
- logger.debug("Skipping discovery of %s as not a local file", url)
- return
-
- obj = (callback, data)
-
- if url in self._discovering_urls:
- self._discovering_urls[url] += [obj]
- else:
- self._discovering_urls[url] = [obj]
- self.discoverer.discover_uri_async(url)
-
- def _on_discovered(self, discoverer, info, error):
- try:
- cbs = self._discovering_urls[info.get_uri()]
- del(self._discovering_urls[info.get_uri()])
-
- for callback, data in cbs:
- if data is not None:
- callback(info, error, data)
- else:
- callback(info, error)
- except KeyError:
- # Not something we're interested in
- return
+ self._player.set_property("audio-sink", None)
@log
- def _on_repeat_setting_changed(self, settings, value):
- self.repeat = settings.get_enum('repeat')
- self._sync_prev_next()
- self._sync_repeat_image()
- self._validate_next_track()
+ def _on_replaygain_setting_changed(self, settings, value):
+ replaygain = settings.get_value('replaygain') is not None
+ self._toggle_replaygain(replaygain)
@log
def _on_bus_state_changed(self, bus, message):
- # Note: not all state changes are signaled through here, in particular
- # transitions between Gst.State.READY and Gst.State.NULL are never async
- # and thus don't cause a message
- # In practice, self means only Gst.State.PLAYING and Gst.State.PAUSED are
- self._sync_playing()
+ # Note: not all state changes are signaled through here, in
+ # particular transitions between Gst.State.READY and
+ # Gst.State.NULL are never async and thus don't cause a
+ # message. In practice, self means only Gst.State.PLAYING and
+ # Gst.State.PAUSED are.
+ self._super_player._sync_playing()
@log
def _gst_plugins_base_check_version(self, major, minor, micro):
@@ -239,15 +173,15 @@ class Player(GObject.GObject):
(gst_major == major and gst_minor == minor and gst_micro + 1 == micro and gst_nano > 0))
@log
- def _start_plugin_installation(self, missing_plugin_messages, confirm_search):
+ def _start_plugin_installation(
+ self, missing_plugin_messages, confirm_search):
install_ctx = GstPbutils.InstallPluginsContext.new()
- if self._gst_plugins_base_check_version(1, 5, 0):
- install_ctx.set_desktop_id('org.gnome.Music.desktop')
- install_ctx.set_confirm_search(confirm_search)
+ install_ctx.set_desktop_id('org.gnome.Music.desktop')
+ install_ctx.set_confirm_search(confirm_search)
- startup_id = '_TIME%u' % Gtk.get_current_event_time()
- install_ctx.set_startup_notification_id(startup_id)
+ startup_id = '_TIME%u' % Gtk.get_current_event_time()
+ install_ctx.set_startup_notification_id(startup_id)
installer_details = []
for message in missing_plugin_messages:
@@ -259,10 +193,12 @@ class Player(GObject.GObject):
# actually finished. Do nothing for now.
pass
- GstPbutils.install_plugins_async(installer_details, install_ctx, on_install_done)
+ GstPbutils.install_plugins_async(
+ installer_details, install_ctx, on_install_done)
@log
- def _show_codec_confirmation_dialog(self, install_helper_name, missing_plugin_messages):
+ def _show_codec_confirmation_dialog(
+ self, install_helper_name, missing_plugin_messages):
dialog = MissingCodecsDialog(self._parent_window, install_helper_name)
def on_dialog_response(dialog, response_type):
@@ -289,21 +225,21 @@ class Player(GObject.GObject):
self._missingPluginMessages = []
if self._gst_plugins_base_check_version(1, 5, 0):
- proxy = Gio.DBusProxy.new_sync(Gio.bus_get_sync(Gio.BusType.SESSION, None),
- Gio.DBusProxyFlags.NONE,
- None,
- 'org.freedesktop.PackageKit',
- '/org/freedesktop/PackageKit',
- 'org.freedesktop.PackageKit.Modify2',
- None)
+ proxy = Gio.DBusProxy.new_sync(
+ Gio.bus_get_sync(Gio.BusType.SESSION, None),
+ Gio.DBusProxyFlags.NONE, None, 'org.freedesktop.PackageKit',
+ '/org/freedesktop/PackageKit',
+ 'org.freedesktop.PackageKit.Modify2', None)
prop = Gio.DBusProxy.get_cached_property(proxy, 'DisplayName')
if prop:
display_name = prop.get_string()
if display_name:
- self._show_codec_confirmation_dialog(display_name, missing_plugin_messages)
+ self._show_codec_confirmation_dialog(
+ display_name, missing_plugin_messages)
return
- # If the above failed, fall back to immediately starting the codec installation
+ # If the above failed, fall back to immediately starting the
+ # codec installation.
self._start_plugin_installation(missing_plugin_messages, True)
@log
@@ -320,17 +256,20 @@ class Player(GObject.GObject):
if GstPbutils.is_missing_plugin_message(message):
self._missingPluginMessages.append(message)
- def _onBusError(self, bus, message):
+ def _on_bus_error(self, bus, message):
if self._is_missing_plugin_message(message):
self.pause()
self._handle_missing_plugins()
return True
+ # FIXME: This shouldn't be here
media = self.get_current_media()
if media is not None:
if self.currentTrack and self.currentTrack.valid():
- currentTrack = self.playlist.get_iter(self.currentTrack.get_path())
- self.playlist.set_value(currentTrack, self.discovery_status_field, DiscoveryStatus.FAILED)
+ currentTrack = self.playlist.get_iter(
+ self.currentTrack.get_path())
+ self.playlist.set_value(
+ currentTrack, self.discovery_status_field, DiscoveryStatus.FAILED)
uri = media.get_url()
else:
uri = 'none'
@@ -346,6 +285,7 @@ class Player(GObject.GObject):
@log
def _on_bus_eos(self, bus, message):
+ # FIXME: This shouldn't be here
if self.nextTrack:
GLib.idle_add(self._on_glib_idle)
elif (self.repeat == RepeatType.NONE):
@@ -371,6 +311,157 @@ class Player(GObject.GObject):
self.progressScale.set_sensitive(False)
self.emit('playback-status-changed')
+ @log
+ def is_playing(self):
+ ok, state, pending = self._player.get_state(0)
+
+ if ok == Gst.StateChangeReturn.ASYNC:
+ return pending == Gst.State.PLAYING
+ elif ok == Gst.StateChangeReturn.SUCCESS:
+ return state == Gst.State.PLAYING
+ else:
+ return False
+
+ @log
+ def get_playback_status(self):
+ ok, state, pending = self._player.get_state(0)
+ if ok == Gst.StateChangeReturn.ASYNC:
+ state = pending
+ elif (ok != Gst.StateChangeReturn.SUCCESS):
+ return PlaybackStatus.STOPPED
+
+ if state == Gst.State.PLAYING:
+ return PlaybackStatus.PLAYING
+ elif state == Gst.State.PAUSED:
+ return PlaybackStatus.PAUSED
+ else:
+ return PlaybackStatus.STOPPED
+
+ @GObject.Property
+ @log
+ def state(self):
+ return self.get_playback_status()
+
+ @state.setter
+ @log
+ def state(self, playbackstate):
+ if playbackstate == PlaybackStatus.PAUSED:
+ self._player.set_state(Gst.State.Paused)
+ if playbackstate == PlaybackStatus.STOPPED:
+ self._player.set_state(Gst.State.NULL)
+ if playbackstate == PlaybackStatus.PLAYING:
+ self._player.set_state(Gst.State.PLAYING)
+
+ @GObject.Property
+ @log
+ def url(self):
+ return self._player.get_value('current-uri', 0)
+
+ @url.setter
+ @log
+ def url(self, url_):
+ self._player.set_property('uri', url_)
+
+ @log
+ def get_position(self):
+ return self._player.query_position(Gst.Format.TIME)[1] / 10**9
+
+
+class Player(GObject.GObject):
+ nextTrack = None
+ timeout = None
+ _seconds_timeout = None
+ shuffleHistory = deque(maxlen=10)
+
+ __gsignals__ = {
+ 'playing-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'playlist-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'playlist-item-changed': (GObject.SignalFlags.RUN_FIRST, None, (Gtk.TreeModel, Gtk.TreeIter)),
+ 'current-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'playback-status-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'repeat-mode-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'volume-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'prev-next-invalidated': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ 'seeked': (GObject.SignalFlags.RUN_FIRST, None, (int,)),
+ 'thumbnail-updated': (GObject.SignalFlags.RUN_FIRST, None, ()),
+ }
+
+ def __repr__(self):
+ return '<Player>'
+
+ @log
+ def __init__(self, parent_window):
+ super().__init__()
+
+ self._parent_window = parent_window
+ self.playlist = None
+ self.playlistType = None
+ self.playlistId = None
+ self.playlistField = None
+ self.currentTrack = None
+ self.currentTrackUri = None
+
+ self._missingPluginMessages = []
+
+ Gst.init(None)
+ GstPbutils.pb_utils_init()
+
+ self.discoverer = GstPbutils.Discoverer()
+ self.discoverer.connect('discovered', self._on_discovered)
+ self.discoverer.start()
+ self._discovering_urls = {}
+
+ self._settings = Gio.Settings.new('org.gnome.Music')
+ self._settings.connect('changed::repeat', self._on_repeat_setting_changed)
+ self.repeat = self._settings.get_enum('repeat')
+ self._setup_view()
+
+ self.playlist_insert_handler = 0
+ self.playlist_delete_handler = 0
+
+ self._player = GstPlayer(self)
+
+ self._lastfm = LastFmScrobbler()
+
+ def discover_item(self, item, callback, data=None):
+ url = item.get_url()
+ if not url:
+ logger.warn("The item %s doesn't have a URL set", item)
+ return
+
+ if not url.startswith("file://"):
+ logger.debug("Skipping discovery of %s as not a local file", url)
+ return
+
+ obj = (callback, data)
+
+ if url in self._discovering_urls:
+ self._discovering_urls[url] += [obj]
+ else:
+ self._discovering_urls[url] = [obj]
+ self.discoverer.discover_uri_async(url)
+
+ def _on_discovered(self, discoverer, info, error):
+ try:
+ cbs = self._discovering_urls[info.get_uri()]
+ del(self._discovering_urls[info.get_uri()])
+
+ for callback, data in cbs:
+ if data is not None:
+ callback(info, error, data)
+ else:
+ callback(info, error)
+ except KeyError:
+ # Not something we're interested in
+ return
+
+ @log
+ def _on_repeat_setting_changed(self, settings, value):
+ self.repeat = settings.get_enum('repeat')
+ self._sync_prev_next()
+ self._sync_repeat_image()
+ self._validate_next_track()
+
@log
def _on_glib_idle(self):
self.currentTrack = self.nextTrack
@@ -514,24 +605,13 @@ class Player(GObject.GObject):
else:
return True
- @log
- def _get_playing(self):
- ok, state, pending = self.player.get_state(0)
- # log('get playing(), [ok, state, pending] = [%s, %s, %s]'.format(ok, state, pending))
- if ok == Gst.StateChangeReturn.ASYNC:
- return pending == Gst.State.PLAYING
- elif ok == Gst.StateChangeReturn.SUCCESS:
- return state == Gst.State.PLAYING
- else:
- return False
-
@property
def playing(self):
- return self._get_playing()
+ return self._player.is_playing()
@log
def _sync_playing(self):
- if self._get_playing():
+ if self._player.is_playing():
image = self._pauseImage
tooltip = _("Pause")
else:
@@ -587,9 +667,9 @@ class Player(GObject.GObject):
self._time_stamp = int(time.time())
- url = media.get_url()
- if url != self.player.get_value('current-uri', 0):
- self.player.set_property('uri', url)
+ url_ = media.get_url()
+ if url_ != self._player.url:
+ self._player.url = url_
if self.currentTrack and self.currentTrack.valid():
currentTrack = self.playlist.get_iter(self.currentTrack.get_path())
@@ -617,16 +697,17 @@ class Player(GObject.GObject):
if track is None:
return
- _iter = self.playlist.get_iter(self.nextTrack.get_path())
- status = self.playlist.get_value(_iter, self.discovery_status_field)
- nextSong = self.playlist.get_value(_iter, self.playlistField)
- url = self.playlist.get_value(_iter, 5).get_url()
+ iter_ = self.playlist.get_iter(self.nextTrack.get_path())
+ status = self.playlist.get_value(iter_, self.discovery_status_field)
+ nextSong = self.playlist.get_value(iter_, self.playlistField)
+ url_ = self.playlist[iter_][5].get_url()
# Skip remote songs discovery
- if url.startswith('http://') or url.startswith('https://'):
+ if (url_.startswith('http://')
+ or url_.startswith('https://')):
return False
elif status == DiscoveryStatus.PENDING:
- self.discover_item(nextSong, self._on_next_item_validated, _iter)
+ self.discover_item(nextSong, self._on_next_item_validated, iter_)
elif status == DiscoveryStatus.FAILED:
GLib.idle_add(self._validate_next_track)
@@ -643,7 +724,7 @@ class Player(GObject.GObject):
media = None
- if self.player.get_state(1)[1] != Gst.State.PAUSED:
+ if self._player.state != PlaybackStatus.PAUSED:
self.stop()
media = self.get_current_media()
@@ -652,7 +733,8 @@ class Player(GObject.GObject):
self.load(media)
- self.player.set_state(Gst.State.PLAYING)
+ self._player.state = PlaybackStatus.PLAYING
+
self._update_position_callback()
if media:
self._lastfm.now_playing(media)
@@ -666,7 +748,7 @@ class Player(GObject.GObject):
def pause(self):
self._remove_timeout()
- self.player.set_state(Gst.State.PAUSED)
+ self._player.state = PlaybackStatus.PAUSED
self.emit('playback-status-changed')
self.emit('playing-changed')
@@ -674,7 +756,7 @@ class Player(GObject.GObject):
def stop(self):
self._remove_timeout()
- self.player.set_state(Gst.State.NULL)
+ self._player.state = PlaybackStatus.STOPPED
self.emit('playing-changed')
@log
@@ -701,7 +783,7 @@ class Player(GObject.GObject):
if self.prevBtn.get_sensitive() is False:
return
- position = self.get_position() / 1000000
+ position = self._player.get_position()
if position >= 5:
self._progress_scale_zero()
self.on_progress_scale_change_value(self.progressScale)
@@ -717,7 +799,7 @@ class Player(GObject.GObject):
@log
def play_pause(self):
- if self.player.get_state(1)[1] == Gst.State.PLAYING:
+ if self.player.state == Gst.State.PLAYING:
self.set_playing(False)
else:
self.set_playing(True)
@@ -869,7 +951,8 @@ class Player(GObject.GObject):
padding = self.progressScale.get_style_context().get_padding(
Gtk.StateFlags.NORMAL)
width -= padding.left + padding.right
- success, duration = self.player.query_duration(Gst.Format.TIME)
+ # FIXME
+ success, duration = self._player._player.query_duration(Gst.Format.TIME)
timeout_period = 1000
if success:
timeout_period = min(1000 * (duration / 10**9) // width, 1000)
@@ -899,7 +982,7 @@ class Player(GObject.GObject):
@log
def _on_play_btn_clicked(self, btn):
- if self._get_playing():
+ if self._player.is_playing():
self.pause()
else:
self.play()
@@ -920,7 +1003,7 @@ class Player(GObject.GObject):
@log
def _update_position_callback(self):
- position = self.player.query_position(Gst.Format.TIME)[1] / 1000000000
+ position = self._player.get_position()
if position > 0:
self.progressScale.set_value(position * 60)
self._update_timeout()
@@ -930,7 +1013,7 @@ class Player(GObject.GObject):
def _update_seconds_callback(self):
self._on_progress_value_changed(None)
- position = self.player.query_position(Gst.Format.TIME)[1] / 10**9
+ position = self._player.get_position()
if position > 0:
self.played_seconds += self.seconds_period / 1000
try:
@@ -970,7 +1053,8 @@ class Player(GObject.GObject):
def on_progress_scale_change_value(self, scroll):
seconds = scroll.get_value() / 60
if seconds != self.duration:
- self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, seconds *
1000000000)
+ # FIXME
+ self._player._player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
seconds * 1000000000)
try:
self.emit('seeked', seconds * 1000000)
except TypeError:
@@ -980,7 +1064,8 @@ class Player(GObject.GObject):
duration = self.player.query_duration(Gst.Format.TIME)
if duration:
# Rewind a second back before the track end
- self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
duration[1] - 1000000000)
+ # FIXME
+ self._player._player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH |
Gst.SeekFlags.KEY_UNIT, duration[1] - 1000000000)
try:
self.emit('seeked', (duration[1] - 1000000000) / 1000)
except TypeError:
@@ -1000,18 +1085,8 @@ class Player(GObject.GObject):
@log
def get_playback_status(self):
- ok, state, pending = self.player.get_state(0)
- if ok == Gst.StateChangeReturn.ASYNC:
- state = pending
- elif (ok != Gst.StateChangeReturn.SUCCESS):
- return PlaybackStatus.STOPPED
-
- if state == Gst.State.PLAYING:
- return PlaybackStatus.PLAYING
- elif state == Gst.State.PAUSED:
- return PlaybackStatus.PAUSED
- else:
- return PlaybackStatus.STOPPED
+ # FIXME: Just a proxy right now.
+ return self._player.get_playback_status()
@log
def get_repeat_mode(self):
@@ -1022,10 +1097,7 @@ class Player(GObject.GObject):
self.repeat = mode
self._sync_repeat_image()
- @log
- def get_position(self):
- return self.player.query_position(Gst.Format.TIME)[1] / 1000
-
+ # TODO: used by MPRIS
@log
def set_position(self, offset, start_if_ne=False, next_on_overflow=False):
if offset < 0:
@@ -1034,23 +1106,23 @@ class Player(GObject.GObject):
else:
return
- duration = self.player.query_duration(Gst.Format.TIME)
+ duration = self._player._player.query_duration(Gst.Format.TIME)
if duration is None:
return
if duration[1] >= offset * 1000:
- self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, offset *
1000)
+ self._player._player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
offset * 1000)
self.emit('seeked', offset)
elif next_on_overflow:
self.play_next()
@log
def get_volume(self):
- return self.player.get_volume(GstAudio.StreamVolumeFormat.LINEAR)
+ return self._player._player.get_volume(GstAudio.StreamVolumeFormat.LINEAR)
@log
def set_volume(self, rate):
- self.player.set_volume(GstAudio.StreamVolumeFormat.LINEAR, rate)
+ self._player._player.set_volume(GstAudio.StreamVolumeFormat.LINEAR, rate)
self.emit('volume-changed')
@log
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]