From 6fc0fb6b26298b00a0fdbb965fa661c1c79b98c0 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sun, 19 Sep 2021 11:48:38 -0400 Subject: [PATCH] audio: Create a new Selector object This is used to query for the next or previous track. The Playlist layer will implement our playlist stack as one of these objects, and set it on the Player Signed-off-by: Anna Schumaker --- audio/player.py | 9 +++++---- audio/selector.py | 13 +++++++++++++ audio/test_player.py | 36 +++++++++++++++++++++++++++++------- audio/test_selector.py | 11 +++++++++++ 4 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 audio/selector.py create mode 100644 audio/test_selector.py diff --git a/audio/player.py b/audio/player.py index ad4a2a5..ba54658 100644 --- a/audio/player.py +++ b/audio/player.py @@ -4,12 +4,14 @@ import tagdb from gi.repository import GObject from . import bass from . import scale +from . import selector class Player(bass.BassPlayer): def __init__(self): bass.BassPlayer.__init__(self) self.Autopause = scale.AutoPauseScale() + self.Selector = selector.TagdbSelector() self.emit("track-changed", None, tagdb.Tracks[lib.settings.get_int("audio.trackid")]) @@ -19,7 +21,7 @@ class Player(bass.BassPlayer): def do_about_to_finish(self): if self.Autopause.get_value() != 0: - (track, cont) = tagdb.Stack.next() + track = self.Selector.next() self.emit("track-changed", self.track, track) self.Autopause.decrement() @@ -32,15 +34,14 @@ class Player(bass.BassPlayer): self.playing = (self.Autopause.decrement() != -1) def next(self): - (track, cont) = tagdb.Stack.next() - self.load_track(track) + self.load_track(self.Selector.next()) def play(self): self.playing = True def pause(self): self.playing = False def playpause(self): self.playing = not self.playing def previous(self): - self.load_track(tagdb.Stack.previous()) + self.load_track(self.Selector.previous()) @GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track)) def track_changed(self, prev, new): diff --git a/audio/selector.py b/audio/selector.py new file mode 100644 index 0000000..919a4f5 --- /dev/null +++ b/audio/selector.py @@ -0,0 +1,13 @@ +# Copyright 2021 (c) Anna Schumaker. +import tagdb +from gi.repository import GObject + +class Selector(GObject.GObject): + def __init__(self): GObject.GObject.__init__(self) + def next(self): return None + def previous(self): return None + + +class TagdbSelector(Selector): + def next(self): return tagdb.Stack.next()[0] + def previous(self): return tagdb.Stack.previous() diff --git a/audio/test_player.py b/audio/test_player.py index 3b91bd2..c10e87a 100644 --- a/audio/test_player.py +++ b/audio/test_player.py @@ -8,6 +8,7 @@ from gi.repository import Gst from . import bass from . import player from . import scale +from . import selector main_context = GLib.main_context_default() test_album = pathlib.Path("./data/Test Album/") @@ -15,6 +16,24 @@ test_track = test_album / "01 - Test Track.ogg" test_uri = test_track.absolute().as_uri() +class FakeSelector(selector.Selector): + def __init__(self, library): + selector.Selector.__init__(self) + t1 = [ t for t in library.tracks if t.tracknumber == 1 ][0] + t2 = [ t for t in library.tracks if t.tracknumber == 11 ][0] + self.tracks = [ t1, t2 ] + self.cur = -1 + + def next(self): + self.cur += 1 + return self.tracks[self.cur] + + def previous(self): + self.cur -= 1 + return self.tracks[self.cur] + + + class TestPlayer(unittest.TestCase): def setUpClass(): tagdb.reset() @@ -38,6 +57,7 @@ class TestPlayer(unittest.TestCase): self.assertIsInstance(play, bass.BassPlayer) self.assertIsInstance(play.bus, Gst.Bus) self.assertIsInstance(play.Autopause, scale.AutoPauseScale) + self.assertIsInstance(play.Selector, selector.Selector) self.assertIsNone(play.track) def test_player_load_track(self): @@ -79,17 +99,19 @@ class TestPlayer(unittest.TestCase): self.assertFalse(play.playing) def test_player_next_previous(self): + select = FakeSelector(self.library) play = player.Player() play.connect("track-changed", self.on_track_changed) - - play.next() - self.assertEqual(play.track.trackid, 0) - self.assertEqual(self.changed, (None, tagdb.Tracks[0]) ) + play.Selector = select play.next() self.assertEqual(play.track.trackid, 1) - self.assertEqual(self.changed, (tagdb.Tracks[0], tagdb.Tracks[1]) ) + self.assertEqual(self.changed, (None, tagdb.Tracks[1]) ) + + play.next() + self.assertEqual(play.track.trackid, 11) + self.assertEqual(self.changed, (tagdb.Tracks[1], tagdb.Tracks[11]) ) play.previous() - self.assertEqual(play.track.trackid, 0) - self.assertEqual(self.changed, (tagdb.Tracks[1], tagdb.Tracks[0]) ) + self.assertEqual(play.track.trackid, 1) + self.assertEqual(self.changed, (tagdb.Tracks[11], tagdb.Tracks[1]) ) diff --git a/audio/test_selector.py b/audio/test_selector.py new file mode 100644 index 0000000..3f77e99 --- /dev/null +++ b/audio/test_selector.py @@ -0,0 +1,11 @@ +# Copyright 2021 (c) Anna Schumaker. +import unittest +from gi.repository import GObject +from . import selector + +class TestAudioSelector(unittest.TestCase): + def test_audio_selector_init(self): + select = selector.Selector() + self.assertIsInstance(select, GObject.GObject) + self.assertIsNone(select.next()) + self.assertIsNone(select.previous())