audio: Give the BassPlayer a playing property
To set either Gst.State.PLAYING or Gst.State.PAUSED on the playbin. I also add two signals for playback-start and playback-paused that the PlayPause button can use. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
c2c6ac7890
commit
a4464cd7d9
|
@ -11,11 +11,22 @@ class BassPlayer(GObject.GObject):
|
|||
self.playbin.set_state(Gst.State.READY)
|
||||
|
||||
self.bus.add_signal_watch()
|
||||
self.bus.connect("message::state-changed", self.state_changed)
|
||||
|
||||
@GObject.Property
|
||||
def bus(self):
|
||||
return self.playbin.get_bus()
|
||||
|
||||
@GObject.Property
|
||||
def playing(self):
|
||||
(ret, state, pending) = self.playbin.get_state(Gst.CLOCK_TIME_NONE)
|
||||
return state == Gst.State.PLAYING
|
||||
|
||||
@playing.setter
|
||||
def playing(self, playing):
|
||||
state = Gst.State.PLAYING if playing else Gst.State.PAUSED
|
||||
self.playbin.set_state(state)
|
||||
|
||||
@GObject.Property
|
||||
def uri(self):
|
||||
return self.playbin.get_property("uri")
|
||||
|
@ -26,3 +37,19 @@ class BassPlayer(GObject.GObject):
|
|||
self.playbin.set_property("uri", uri)
|
||||
else:
|
||||
self.playbin.set_state(Gst.State.READY)
|
||||
|
||||
def state_changed(self, bus, message):
|
||||
if message.src == self.playbin:
|
||||
(old, new, pending) = message.parse_state_changed()
|
||||
if new == Gst.State.PLAYING:
|
||||
self.emit("playback-start")
|
||||
else:
|
||||
self.emit("playback-paused")
|
||||
|
||||
@GObject.Signal
|
||||
def playback_start(self):
|
||||
pass
|
||||
|
||||
@GObject.Signal
|
||||
def playback_paused(self):
|
||||
pass
|
||||
|
|
|
@ -29,14 +29,17 @@ class NextButton(ControlButton):
|
|||
class PlayPauseButton(ControlButton):
|
||||
def __init__(self, player):
|
||||
ControlButton.__init__(self, player, "media-playback-start")
|
||||
self.player.connect("state-changed", self.on_state_changed)
|
||||
self.player.connect("playback-start", self.playback_start)
|
||||
self.player.connect("playback-paused", self.playback_paused)
|
||||
|
||||
def do_clicked(self):
|
||||
self.player.playpause()
|
||||
|
||||
def on_state_changed(self, player, old, new, pending):
|
||||
icon = "pause" if new == Gst.State.PLAYING else "start"
|
||||
self.set_icon_name(f"media-playback-{icon}")
|
||||
def playback_start(self, player):
|
||||
self.set_icon_name("media-playback-pause")
|
||||
|
||||
def playback_paused(self, player):
|
||||
self.set_icon_name("media-playback-start")
|
||||
|
||||
|
||||
class ControlScaleBox(scale.ScaleButtonBox):
|
||||
|
|
|
@ -16,7 +16,6 @@ class Player(bass.BassPlayer):
|
|||
self.Autopause = scale.AutoPauseScale()
|
||||
|
||||
self.bus.connect("message::eos", self.next)
|
||||
self.bus.connect("message::state-changed", self.on_state_changed)
|
||||
self.bus.connect("message::tag", self.on_tag)
|
||||
|
||||
self.Artwork = artwork.Artwork()
|
||||
|
@ -64,7 +63,6 @@ class Player(bass.BassPlayer):
|
|||
|
||||
def on_state_changed(self, bus, message):
|
||||
(old, new, pending) = message.parse_state_changed()
|
||||
self.emit("state-changed", old, new, pending)
|
||||
|
||||
def on_tag(self, bus, message):
|
||||
taglist = message.parse_tag()
|
||||
|
@ -74,17 +72,9 @@ class Player(bass.BassPlayer):
|
|||
else:
|
||||
self.Artwork.reset()
|
||||
|
||||
def pause(self, *args):
|
||||
self.playbin.set_state(Gst.State.PAUSED)
|
||||
|
||||
def play(self, *args):
|
||||
self.playbin.set_state(Gst.State.PLAYING)
|
||||
|
||||
def playpause(self, *args):
|
||||
if self.get_state() == Gst.State.PLAYING:
|
||||
self.pause()
|
||||
else:
|
||||
self.play()
|
||||
def play(self): self.playing = True
|
||||
def pause(self): self.playing = False
|
||||
def playpause(self, *args): self.playing = not self.playing
|
||||
|
||||
def play_track(self, track):
|
||||
if track == self.track:
|
||||
|
@ -110,10 +100,6 @@ class Player(bass.BassPlayer):
|
|||
def set_volume(self, volume):
|
||||
self.playbin.set_property("volume", volume)
|
||||
|
||||
@GObject.Signal(arg_types=(Gst.State, Gst.State, Gst.State))
|
||||
def state_changed(self, old, new, pending):
|
||||
pass
|
||||
|
||||
@GObject.Signal(arg_types=(tagdb.track.Track, tagdb.track.Track))
|
||||
def track_changed(self, prev, new):
|
||||
pass
|
||||
|
|
|
@ -10,6 +10,9 @@ test_track = test_album / "01 - Test Track.ogg"
|
|||
test_uri = test_track.absolute().as_uri()
|
||||
|
||||
class TestBassPlayer(unittest.TestCase):
|
||||
def on_playback_start(self, player): self.playing = True
|
||||
def on_playback_paused(self, player): self.playing = False
|
||||
|
||||
def test_bass_player_init(self):
|
||||
base = bass.BassPlayer()
|
||||
self.assertIsInstance(base, GObject.GObject)
|
||||
|
@ -23,6 +26,23 @@ class TestBassPlayer(unittest.TestCase):
|
|||
base = bass.BassPlayer()
|
||||
self.assertIsInstance(base.bus, Gst.Bus)
|
||||
|
||||
def test_bass_player_playing(self):
|
||||
base = bass.BassPlayer()
|
||||
base.connect("playback-start", self.on_playback_start)
|
||||
base.connect("playback-paused", self.on_playback_paused)
|
||||
base.set_property("uri", test_uri)
|
||||
self.assertFalse(base.get_property("playing"))
|
||||
|
||||
base.set_property("playing", True)
|
||||
(ret, state, pending) = base.playbin.get_state(Gst.CLOCK_TIME_NONE)
|
||||
self.assertEqual(state, Gst.State.PLAYING)
|
||||
self.assertTrue(base.get_property("playing"))
|
||||
|
||||
base.set_property("playing", False)
|
||||
(ret, state, pending) = base.playbin.get_state(Gst.CLOCK_TIME_NONE)
|
||||
self.assertEqual(state, Gst.State.PAUSED)
|
||||
self.assertFalse(base.get_property("playing"))
|
||||
|
||||
def test_bass_player_uri(self):
|
||||
base = bass.BassPlayer()
|
||||
|
||||
|
|
|
@ -14,16 +14,23 @@ class FakePlayer(GObject.GObject):
|
|||
self.play = False
|
||||
self.vol = 1.0
|
||||
|
||||
@GObject.Property
|
||||
def playing(self): return self.play
|
||||
@playing.setter
|
||||
def playing(self, newval):
|
||||
self.play = newval
|
||||
self.emit("playback-start" if newval else "playback-paused")
|
||||
|
||||
def previous(self): self.prev = True
|
||||
def next(self): self.nxt = True
|
||||
def get_volume(self): return self.vol
|
||||
def playpause(self):
|
||||
states = { True : Gst.State.PLAYING, False : Gst.State.PAUSED }
|
||||
self.play = not self.play
|
||||
self.emit("state-changed", Gst.State.NULL, states[self.play], Gst.State.NULL)
|
||||
self.playing = not self.playing
|
||||
|
||||
@GObject.Signal(arg_types=(Gst.State, Gst.State, Gst.State))
|
||||
def state_changed(self, old, new, pending): pass
|
||||
@GObject.Signal
|
||||
def playback_start(self): pass
|
||||
@GObject.Signal
|
||||
def playback_paused(self): pass
|
||||
|
||||
|
||||
class TestControlButton(unittest.TestCase):
|
||||
|
|
|
@ -39,9 +39,6 @@ class TestPlayer(unittest.TestCase):
|
|||
def on_track_changed(self, player, prev, new):
|
||||
self.changed = (prev, new)
|
||||
|
||||
def on_state_changed(self, player, old, new, pending):
|
||||
self.state_changed = (old, new, pending)
|
||||
|
||||
def test_player_init(self):
|
||||
play = player.Player()
|
||||
self.assertIsInstance(play, bass.BassPlayer)
|
||||
|
@ -71,7 +68,6 @@ class TestPlayer(unittest.TestCase):
|
|||
|
||||
def test_player_play_pause(self):
|
||||
play = player.Player()
|
||||
play.connect("state-changed", self.on_state_changed)
|
||||
|
||||
play.load_track(self.track)
|
||||
self.assertEqual(play.track, self.track)
|
||||
|
@ -93,7 +89,6 @@ class TestPlayer(unittest.TestCase):
|
|||
self.assertEqual(play.get_state(), Gst.State.PAUSED)
|
||||
|
||||
while main_context.iteration(may_block=False): pass
|
||||
self.assertIsNotNone(self.state_changed)
|
||||
|
||||
def test_player_next_previous(self):
|
||||
play = player.Player()
|
||||
|
|
Loading…
Reference in New Issue