From 5c2e4bb016ab4c33260b1ae69b5c42541ba3c619 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 30 Aug 2021 16:27:33 -0400 Subject: [PATCH] audio: Convert the Player into a GObject And give it "state-changed" and "track-changed" signals. Signed-off-by: Anna Schumaker --- audio/player.py | 16 +++++++++++++--- audio/test_player.py | 19 +++++++++++++++---- playlist/__init__.py | 4 ++-- playlist/model.py | 4 ++-- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/audio/player.py b/audio/player.py index 48f5727..ad41175 100644 --- a/audio/player.py +++ b/audio/player.py @@ -5,11 +5,13 @@ from . import nowplaying from . import seeker from lib import publisher from lib import settings +from gi.repository import GObject from gi.repository import Gst, GLib import tagdb -class Player: +class Player(GObject.GObject): def __init__(self): + GObject.GObject.__init__(self) self.video = Gst.ElementFactory.make("fakesink") self.playbin = Gst.ElementFactory.make("playbin") self.playbin.set_property("video-sink", self.video) @@ -35,7 +37,6 @@ class Player: self.Controls.sizegroup.add_widget(self.Seeker.scale) GLib.timeout_add(250, self.update_progress) - self.TrackChanged = publisher.Publisher() self.track = tagdb.Tracks[settings.get_int("audio.trackid")] self.load_set_state(self.track, Gst.State.PAUSED) if self.track: @@ -59,7 +60,7 @@ class Player: settings.set("audio.trackid", track.trackid) uri = track.filepath().absolute().as_uri() self.playbin.set_property("uri", uri) - self.TrackChanged.publish(prev, self.track) + self.emit("track-changed", prev, self.track) def load_set_state(self, track, state): self.playbin.set_state(Gst.State.READY) @@ -79,6 +80,7 @@ class Player: def on_state_changed(self, bus, message): (old, new, pending) = message.parse_state_changed() self.Controls.set_state(new) + self.emit("state-changed", old, new, pending) def on_tag(self, bus, message): taglist = message.parse_tag() @@ -135,3 +137,11 @@ class Player: def volume_changed(self, *args): self.playbin.set_property("volume", self.Controls.menu.volume.get_value()) + + @GObject.Signal(arg_types=(Gst.State, Gst.State, Gst.State)) + def state_changed(self, old, new, pending): + pass + + @GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track)) + def track_changed(self, prev, new): + pass diff --git a/audio/test_player.py b/audio/test_player.py index 081a928..1f7db90 100644 --- a/audio/test_player.py +++ b/audio/test_player.py @@ -6,11 +6,14 @@ from . import player from . import seeker from lib import publisher from lib import settings +from gi.repository import GObject +from gi.repository import GLib from gi.repository import Gst import pathlib import tagdb import unittest +main_context = GLib.main_context_default() test_album = pathlib.Path("./data/Test Album/") test_track = test_album / "01 - Test Track.ogg" @@ -23,6 +26,7 @@ class TestPlayer(unittest.TestCase): def setUp(self): self.changed = None + self.state_changed = None settings.reset() self.library = tagdb.Library.store[test_album] self.track = [ t for t in self.library.tracks if t.tracknumber == 1 ][0] @@ -30,11 +34,15 @@ class TestPlayer(unittest.TestCase): def tearDownClass(): tagdb.reset() - def on_track_changed(self, prev, new): + def on_track_changed(self, player, prev, new): self.changed = (prev, new) + def on_state_changed(self, player, old, new, pending): + self.state_changed = (old, new, pending) + def test_player_init(self): play = player.Player() + self.assertIsInstance(play, GObject.GObject) self.assertIsInstance(play.video, Gst.Element) self.assertIsInstance(play.playbin, Gst.Element) self.assertIsInstance(play.bus, Gst.Bus) @@ -42,7 +50,6 @@ class TestPlayer(unittest.TestCase): self.assertIsInstance(play.NowPlaying, nowplaying.NowPlaying) self.assertIsInstance(play.Artwork, artwork.Artwork) self.assertIsInstance(play.Seeker, seeker.Seeker) - self.assertIsInstance(play.TrackChanged, publisher.Publisher) self.assertIsNone(play.track) self.assertEqual(play.playbin.get_property("video-sink"), play.video) @@ -51,7 +58,7 @@ class TestPlayer(unittest.TestCase): def test_player_load_track(self): play = player.Player() uri = test_track.absolute().as_uri() - play.TrackChanged.register(self.on_track_changed) + play.connect("track-changed", self.on_track_changed) self.assertEqual(play.playbin.get_property("uri"), None) @@ -70,6 +77,7 @@ class TestPlayer(unittest.TestCase): def test_player_play_pause(self): play = player.Player() + play.connect("state-changed", self.on_state_changed) play.load_track(self.track) self.assertEqual(play.track, self.track) @@ -90,9 +98,12 @@ class TestPlayer(unittest.TestCase): play.pause() self.assertEqual(play.get_state(), Gst.State.PAUSED) + while main_context.iteration(may_block=False): pass + self.assertIsNotNone(self.state_changed) + def test_player_next_previous(self): play = player.Player() - play.TrackChanged.register(self.on_track_changed) + play.connect("track-changed", self.on_track_changed) play.next() self.assertEqual(play.track.trackid, 0) diff --git a/playlist/__init__.py b/playlist/__init__.py index 77d55c3..48634fb 100644 --- a/playlist/__init__.py +++ b/playlist/__init__.py @@ -59,9 +59,9 @@ def scroll_to_current(*args): scroll_to_track(audio.Player.track) Model.Controls.jump.connect("clicked", scroll_to_current) -def on_tracks_changed(prev, new): +def on_tracks_changed(player, prev, new): scroll_to_track(new) -audio.Player.TrackChanged.register(on_tracks_changed) +audio.Player.connect("track-changed", on_tracks_changed) Box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) diff --git a/playlist/model.py b/playlist/model.py index 4458234..fc880c4 100644 --- a/playlist/model.py +++ b/playlist/model.py @@ -12,7 +12,7 @@ class TagModel(GObject.GObject, Gio.ListModel): self.bus = bus.Bus(1) self.items = [ ] self.__set_tag__(tag) - audio.Player.TrackChanged.register(self.on_tracks_changed) + audio.Player.connect("track-changed", self.on_tracks_changed) def __set_tag__(self, tag): self.tag = tag @@ -65,7 +65,7 @@ class TagModel(GObject.GObject, Gio.ListModel): def track_removed(self, tag, track, pos): self.bus.board(self.do_track_removed, tag, track, pos) - def on_tracks_changed(self, prev, new): + def on_tracks_changed(self, player, prev, new): if prev in self.items: self.items_changed(self.items.index(prev), 1, 1) if new in self.items: