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:
Anna Schumaker 2019-04-11 12:03:44 -04:00
parent e09a4ed6ae
commit 0985b2929b
2 changed files with 104 additions and 32 deletions

View File

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

View File

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