rind: Enable automatic pausing
Users tell us how many tracks they would like to listen to, and then we pause when that is complete. I make sure we test the about-to-finish signal with this patch, since we hadn't been doing that up until now. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
e09a4ed6ae
commit
0985b2929b
24
rind/gst.py
24
rind/gst.py
|
@ -52,10 +52,12 @@ class EmmentalAudio:
|
|||
self.timeout_cb = GLib.timeout_add(100, self.update_progress)
|
||||
|
||||
def about_to_finish(self, playbin):
|
||||
track = curds.PlaylistManager.next()
|
||||
if track:
|
||||
self.playbin.set_property("uri", f"file://{track.path}")
|
||||
self.have_next = True
|
||||
if self.pause_count != 0 and self.have_next == False:
|
||||
track = curds.PlaylistManager.next()
|
||||
if track:
|
||||
self.playbin.set_property("uri", f"file://{track.path}")
|
||||
self.pause_dec()
|
||||
self.have_next = True
|
||||
|
||||
def disconnect(self):
|
||||
self.playbin.disconnect(self.finish_cb)
|
||||
|
@ -77,11 +79,11 @@ class EmmentalAudio:
|
|||
def get_property(self, name):
|
||||
return self.playbin.get_property(name)
|
||||
|
||||
def load(self, track):
|
||||
def load(self, track, state=Gst.State.PLAYING):
|
||||
if track:
|
||||
self.playbin.set_state(Gst.State.READY)
|
||||
self.playbin.set_property("uri", f"file://{track.path}")
|
||||
self.playbin.set_state(Gst.State.PLAYING)
|
||||
self.playbin.set_state(state)
|
||||
|
||||
def next(self, *args):
|
||||
if self.have_next == False:
|
||||
|
@ -102,6 +104,10 @@ class EmmentalAudio:
|
|||
if message.type == Gst.MessageType.ASYNC_DONE:
|
||||
state = message.src.get_state(Gst.Format.TIME)
|
||||
self.state_changed(message.src, state[1])
|
||||
elif message.type == Gst.MessageType.EOS:
|
||||
state = Gst.State.PAUSED if self.pause_dec() else Gst.State.PLAYING
|
||||
self.load(curds.PlaylistManager.next(), state)
|
||||
curds.notify.notify("eos")
|
||||
elif message.type == Gst.MessageType.STATE_CHANGED:
|
||||
(old, new, pending) = message.parse_state_changed()
|
||||
self.state_changed(message.src, new)
|
||||
|
@ -142,14 +148,20 @@ class EmmentalAudio:
|
|||
PauseUp.set_sensitive(self.pause_count < 99)
|
||||
|
||||
def pause_input(self, entry):
|
||||
text = entry.get_text()
|
||||
match = re.search("-?\d+", entry.get_text())
|
||||
if match:
|
||||
self.pause_count = max(-1, min(99, int(match.group(0))))
|
||||
elif re.search("Pause", text, re.I):
|
||||
self.pause()
|
||||
self.pause_count = -1
|
||||
self.pause_changed(self.playbin.get_state(Gst.Format.TIME)[1])
|
||||
|
||||
def pause_dec(self, *args):
|
||||
should_pause = self.pause_count == 0
|
||||
self.pause_count = max(-1, self.pause_count - 1)
|
||||
self.pause_changed(self.playbin.get_state(Gst.Format.TIME)[1])
|
||||
return should_pause
|
||||
|
||||
def pause_inc(self, *args):
|
||||
self.pause_count = min(99, self.pause_count + 1)
|
||||
|
|
112
rind/test_gst.py
112
rind/test_gst.py
|
@ -14,8 +14,10 @@ class TestGst(unittest.TestCase):
|
|||
curds.reset()
|
||||
|
||||
self.audio = gst.EmmentalAudio()
|
||||
self.eos = False
|
||||
self.state = None
|
||||
self.stream = False
|
||||
curds.notify.register("eos", self.on_eos)
|
||||
curds.notify.register("state-changed", self.on_state_changed)
|
||||
curds.notify.register("stream-start", self.on_stream_start)
|
||||
|
||||
|
@ -33,10 +35,22 @@ class TestGst(unittest.TestCase):
|
|||
def tearDownClass():
|
||||
curds.stop()
|
||||
|
||||
def main_loop_until(self, state):
|
||||
def main_loop_until(self, state, next=False, eos=False):
|
||||
self.eos = False
|
||||
self.stream = False
|
||||
self.state = None
|
||||
if eos == True or next == True:
|
||||
self.audio.seek(value=90)
|
||||
while eos and self.eos == False:
|
||||
gtk.main_loop()
|
||||
while next and self.stream == False:
|
||||
gtk.main_loop()
|
||||
while self.state != state:
|
||||
gtk.main_loop()
|
||||
|
||||
def on_eos(self):
|
||||
self.eos = True
|
||||
|
||||
def on_state_changed(self, state):
|
||||
self.state = state
|
||||
|
||||
|
@ -69,6 +83,10 @@ class TestGst(unittest.TestCase):
|
|||
self.assertEqual(gst.Title.get_text(), "Emmental")
|
||||
self.assertEqual(gst.Artist.get_text(), "The Cheesy Music Player")
|
||||
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertFalse(gst.PauseDown.is_sensitive())
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
|
||||
self.assertFalse(gst.PauseButton.is_visible())
|
||||
self.assertTrue( gst.PlayButton.is_visible())
|
||||
self.assertEqual(gst.Adjustment.get_value(), 0.0)
|
||||
|
@ -169,25 +187,16 @@ class TestGst(unittest.TestCase):
|
|||
self.assertEqual(curds.PlaylistManager.lookup("Collection").current, 2)
|
||||
|
||||
gst.PrevButton.clicked()
|
||||
self.main_loop_until(Gst.State.PLAYING)
|
||||
self.main_loop_until(Gst.State.PLAYING, next=True)
|
||||
self.assertEqual(curds.PlaylistManager.track, track2)
|
||||
self.assertEqual(curds.PlaylistManager.lookup("Collection").current, 2)
|
||||
self.assertEqual(curds.PlaylistManager.lookup("Previous").current, 1)
|
||||
|
||||
self.state = None
|
||||
self.audio.seek(value=90)
|
||||
self.main_loop_until(Gst.State.PLAYING)
|
||||
self.stream = False
|
||||
while self.stream == False: gtk.main_loop()
|
||||
self.main_loop_until(Gst.State.PLAYING)
|
||||
self.main_loop_until(Gst.State.PLAYING, next=True)
|
||||
self.assertEqual(curds.PlaylistManager.lookup("Collection").current, 3)
|
||||
self.assertNotEqual(curds.PlaylistManager.track, track2)
|
||||
|
||||
def test_gst_automatic_pause_up(self):
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertFalse(gst.PauseDown.is_sensitive())
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
|
||||
gst.PauseUp.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 0)
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
|
@ -200,24 +209,29 @@ class TestGst(unittest.TestCase):
|
|||
self.assertEqual(gst.PauseEntry.get_text(), "Next Track")
|
||||
|
||||
self.audio.pause_count = 98
|
||||
self.audio.pause_changed(self.audio.playbin.get_state(Gst.Format.TIME))
|
||||
|
||||
gst.PauseUp.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 99)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "99 Tracks")
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
self.assertFalse(gst.PauseUp.is_sensitive())
|
||||
|
||||
gst.PauseUp.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 99)
|
||||
|
||||
def test_gst_automatic_pause_down(self):
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertFalse(gst.PauseDown.is_sensitive())
|
||||
self.audio.pause_count = 99
|
||||
self.audio.pause_changed(self.audio.playbin.get_state(Gst.Format.TIME))
|
||||
|
||||
gst.PauseDown.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 98)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "98 Tracks")
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
|
||||
self.audio.pause_count = 2
|
||||
gst.PauseDown.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 1)
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "Next Track")
|
||||
self.audio.pause_count = 1
|
||||
self.audio.pause_changed(self.audio.playbin.get_state(Gst.Format.TIME))
|
||||
|
||||
gst.PauseDown.clicked()
|
||||
self.assertEqual(self.audio.pause_count, 0)
|
||||
|
@ -227,22 +241,18 @@ class TestGst(unittest.TestCase):
|
|||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "Paused")
|
||||
self.assertFalse( gst.PauseDown.is_sensitive())
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
|
||||
gst.PauseDown.clicked()
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
|
||||
def test_gst_automatic_pause_entry(self):
|
||||
gst.PauseEntry.set_text("-5")
|
||||
gst.PauseEntry.activate()
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "Paused")
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
self.assertFalse(gst.PauseDown.is_sensitive())
|
||||
|
||||
gst.PauseEntry.set_text("3")
|
||||
gst.PauseEntry.activate()
|
||||
self.assertEqual(self.audio.pause_count, 3)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "3 Tracks")
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
|
||||
gst.PauseEntry.set_text("100")
|
||||
gst.PauseEntry.activate()
|
||||
|
@ -251,6 +261,56 @@ class TestGst(unittest.TestCase):
|
|||
self.assertFalse(gst.PauseUp.is_sensitive())
|
||||
self.assertTrue( gst.PauseDown.is_sensitive())
|
||||
|
||||
gst.PauseEntry.set_text("-5")
|
||||
gst.PauseEntry.activate()
|
||||
self.assertEqual(self.audio.pause_count, -1)
|
||||
self.assertEqual(gst.PauseEntry.get_text(), "Paused")
|
||||
self.assertTrue( gst.PauseUp.is_sensitive())
|
||||
self.assertFalse(gst.PauseDown.is_sensitive())
|
||||
|
||||
def test_gst_about_to_finish(self):
|
||||
plist = curds.PlaylistManager.lookup("Collection")
|
||||
curds.PlaylistManager.lookup("Library").lookup(test_album, allocate=True)
|
||||
curds.playlist.library.join()
|
||||
|
||||
self.audio.next()
|
||||
self.main_loop_until(Gst.State.PLAYING)
|
||||
self.assertFalse(self.audio.have_next)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[0])
|
||||
|
||||
self.audio.pause_count = 2
|
||||
self.audio.about_to_finish(self.audio.playbin)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[1])
|
||||
self.assertTrue(self.audio.have_next)
|
||||
self.assertEqual(self.audio.pause_count, 1)
|
||||
|
||||
self.audio.about_to_finish(self.audio.playbin)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[1])
|
||||
self.assertTrue(self.audio.have_next)
|
||||
self.assertEqual(self.audio.pause_count, 1)
|
||||
|
||||
self.main_loop_until(Gst.State.PLAYING, next=True)
|
||||
self.assertFalse(self.audio.have_next)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[1])
|
||||
|
||||
self.audio.about_to_finish(self.audio.playbin)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[2])
|
||||
self.assertTrue(self.audio.have_next)
|
||||
self.assertEqual(self.audio.pause_count, 0)
|
||||
|
||||
self.audio.next()
|
||||
self.main_loop_until(Gst.State.PLAYING)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[2])
|
||||
self.assertFalse(self.audio.have_next)
|
||||
self.assertEqual(self.audio.pause_count, 0)
|
||||
|
||||
self.audio.about_to_finish(self.audio.playbin)
|
||||
self.assertEqual(curds.PlaylistManager.track, plist[2])
|
||||
self.assertFalse(self.audio.have_next)
|
||||
self.assertEqual(self.audio.pause_count, 0)
|
||||
|
||||
self.main_loop_until(Gst.State.PAUSED, next=True, eos=True)
|
||||
|
||||
def test_gst_seek(self):
|
||||
track = curds.Track.lookup(os.path.join(test_album, "10 - Test Track 10.ogg"))
|
||||
|
||||
|
|
Loading…
Reference in New Issue