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 <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-09-19 11:48:38 -04:00
parent e38ce61cf7
commit 6fc0fb6b26
4 changed files with 58 additions and 11 deletions

View File

@ -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):

13
audio/selector.py Normal file
View File

@ -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()

View File

@ -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]) )

11
audio/test_selector.py Normal file
View File

@ -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())