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:
parent
e38ce61cf7
commit
6fc0fb6b26
|
@ -4,12 +4,14 @@ import tagdb
|
||||||
from gi.repository import GObject
|
from gi.repository import GObject
|
||||||
from . import bass
|
from . import bass
|
||||||
from . import scale
|
from . import scale
|
||||||
|
from . import selector
|
||||||
|
|
||||||
|
|
||||||
class Player(bass.BassPlayer):
|
class Player(bass.BassPlayer):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
bass.BassPlayer.__init__(self)
|
bass.BassPlayer.__init__(self)
|
||||||
self.Autopause = scale.AutoPauseScale()
|
self.Autopause = scale.AutoPauseScale()
|
||||||
|
self.Selector = selector.TagdbSelector()
|
||||||
|
|
||||||
self.emit("track-changed", None,
|
self.emit("track-changed", None,
|
||||||
tagdb.Tracks[lib.settings.get_int("audio.trackid")])
|
tagdb.Tracks[lib.settings.get_int("audio.trackid")])
|
||||||
|
@ -19,7 +21,7 @@ class Player(bass.BassPlayer):
|
||||||
|
|
||||||
def do_about_to_finish(self):
|
def do_about_to_finish(self):
|
||||||
if self.Autopause.get_value() != 0:
|
if self.Autopause.get_value() != 0:
|
||||||
(track, cont) = tagdb.Stack.next()
|
track = self.Selector.next()
|
||||||
self.emit("track-changed", self.track, track)
|
self.emit("track-changed", self.track, track)
|
||||||
self.Autopause.decrement()
|
self.Autopause.decrement()
|
||||||
|
|
||||||
|
@ -32,15 +34,14 @@ class Player(bass.BassPlayer):
|
||||||
self.playing = (self.Autopause.decrement() != -1)
|
self.playing = (self.Autopause.decrement() != -1)
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
(track, cont) = tagdb.Stack.next()
|
self.load_track(self.Selector.next())
|
||||||
self.load_track(track)
|
|
||||||
|
|
||||||
def play(self): self.playing = True
|
def play(self): self.playing = True
|
||||||
def pause(self): self.playing = False
|
def pause(self): self.playing = False
|
||||||
def playpause(self): self.playing = not self.playing
|
def playpause(self): self.playing = not self.playing
|
||||||
|
|
||||||
def previous(self):
|
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))
|
@GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track))
|
||||||
def track_changed(self, prev, new):
|
def track_changed(self, prev, new):
|
||||||
|
|
|
@ -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()
|
|
@ -8,6 +8,7 @@ from gi.repository import Gst
|
||||||
from . import bass
|
from . import bass
|
||||||
from . import player
|
from . import player
|
||||||
from . import scale
|
from . import scale
|
||||||
|
from . import selector
|
||||||
|
|
||||||
main_context = GLib.main_context_default()
|
main_context = GLib.main_context_default()
|
||||||
test_album = pathlib.Path("./data/Test Album/")
|
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()
|
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):
|
class TestPlayer(unittest.TestCase):
|
||||||
def setUpClass():
|
def setUpClass():
|
||||||
tagdb.reset()
|
tagdb.reset()
|
||||||
|
@ -38,6 +57,7 @@ class TestPlayer(unittest.TestCase):
|
||||||
self.assertIsInstance(play, bass.BassPlayer)
|
self.assertIsInstance(play, bass.BassPlayer)
|
||||||
self.assertIsInstance(play.bus, Gst.Bus)
|
self.assertIsInstance(play.bus, Gst.Bus)
|
||||||
self.assertIsInstance(play.Autopause, scale.AutoPauseScale)
|
self.assertIsInstance(play.Autopause, scale.AutoPauseScale)
|
||||||
|
self.assertIsInstance(play.Selector, selector.Selector)
|
||||||
self.assertIsNone(play.track)
|
self.assertIsNone(play.track)
|
||||||
|
|
||||||
def test_player_load_track(self):
|
def test_player_load_track(self):
|
||||||
|
@ -79,17 +99,19 @@ class TestPlayer(unittest.TestCase):
|
||||||
self.assertFalse(play.playing)
|
self.assertFalse(play.playing)
|
||||||
|
|
||||||
def test_player_next_previous(self):
|
def test_player_next_previous(self):
|
||||||
|
select = FakeSelector(self.library)
|
||||||
play = player.Player()
|
play = player.Player()
|
||||||
play.connect("track-changed", self.on_track_changed)
|
play.connect("track-changed", self.on_track_changed)
|
||||||
|
play.Selector = select
|
||||||
play.next()
|
|
||||||
self.assertEqual(play.track.trackid, 0)
|
|
||||||
self.assertEqual(self.changed, (None, tagdb.Tracks[0]) )
|
|
||||||
|
|
||||||
play.next()
|
play.next()
|
||||||
self.assertEqual(play.track.trackid, 1)
|
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()
|
play.previous()
|
||||||
self.assertEqual(play.track.trackid, 0)
|
self.assertEqual(play.track.trackid, 1)
|
||||||
self.assertEqual(self.changed, (tagdb.Tracks[1], tagdb.Tracks[0]) )
|
self.assertEqual(self.changed, (tagdb.Tracks[11], tagdb.Tracks[1]) )
|
||||||
|
|
|
@ -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())
|
Loading…
Reference in New Issue