From ad246706c679d96a472f4f2483df8ecdea6f7c85 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 16:28:27 +0300 Subject: [PATCH] Add paused_playing and resumed_playing events --- mopidy/backends/base/playback.py | 16 ++++++++++++++++ mopidy/listeners.py | 27 +++++++++++++++++++++++++++ tests/backends/events_test.py | 23 +++++++++++++++++++++++ tests/listeners_test.py | 6 ++++++ 4 files changed, 72 insertions(+) diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index d880cd61..5155418f 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -383,6 +383,7 @@ class PlaybackController(object): """Pause playback.""" if self.provider.pause(): self.state = self.PAUSED + self._trigger_paused_playing_event() def play(self, cp_track=None, on_error_step=1): """ @@ -441,6 +442,7 @@ class PlaybackController(object): """If paused, resume playing the current track.""" if self.state == self.PAUSED and self.provider.resume(): self.state = self.PLAYING + self._trigger_resumed_playing_event() def seek(self, time_position): """ @@ -484,6 +486,20 @@ class PlaybackController(object): if clear_current_track: self.current_cp_track = None + def _trigger_paused_playing_event(self): + if self.current_track is None: + return + for listener_ref in ActorRegistry.get_by_class(BackendListener): + listener_ref.proxy().paused_playing( + track=self.current_track, time_position=self.time_position) + + def _trigger_resumed_playing_event(self): + if self.current_track is None: + return + for listener_ref in ActorRegistry.get_by_class(BackendListener): + listener_ref.proxy().resumed_playing( + track=self.current_track, time_position=self.time_position) + def _trigger_started_playing_event(self): if self.current_track is None: return diff --git a/mopidy/listeners.py b/mopidy/listeners.py index dfc5c60b..263afd36 100644 --- a/mopidy/listeners.py +++ b/mopidy/listeners.py @@ -9,6 +9,33 @@ class BackendListener(object): interested in all events. """ + def paused_playing(self, track, time_position): + """ + Called whenever playback is paused. + + *MAY* be implemented by actor. + + :param track: the track that was playing when playback paused + :type track: :class:`mopidy.models.Track` + :param time_position: the time position in milliseconds + :type time_position: int + """ + pass + + def resumed_playing(self, track, time_position): + """ + Called whenever playback is resumed. + + *MAY* be implemented by actor. + + :param track: the track that was playing when playback resumed + :type track: :class:`mopidy.models.Track` + :param time_position: the time position in milliseconds + :type time_position: int + """ + pass + + def started_playing(self, track): """ Called whenever a new track starts playing. diff --git a/tests/backends/events_test.py b/tests/backends/events_test.py index 44529e90..c2e4d28a 100644 --- a/tests/backends/events_test.py +++ b/tests/backends/events_test.py @@ -11,6 +11,8 @@ from mopidy.models import Track class BackendEventsTest(unittest.TestCase): def setUp(self): self.events = { + 'paused_playing': threading.Event(), + 'resumed_playing': threading.Event(), 'started_playing': threading.Event(), 'stopped_playing': threading.Event(), } @@ -20,6 +22,21 @@ class BackendEventsTest(unittest.TestCase): def tearDown(self): ActorRegistry.stop_all() + def test_pause_sends_paused_playing_event(self): + self.backend.current_playlist.add([Track(uri='a')]) + self.backend.playback.play() + self.backend.playback.pause() + self.events['paused_playing'].wait(timeout=1) + self.assertTrue(self.events['paused_playing'].is_set()) + + def test_resume_sends_resumed_playing_event(self): + self.backend.current_playlist.add([Track(uri='a')]) + self.backend.playback.play() + self.backend.playback.pause() + self.backend.playback.resume() + self.events['resumed_playing'].wait(timeout=1) + self.assertTrue(self.events['resumed_playing'].is_set()) + def test_play_sends_started_playing_event(self): self.backend.current_playlist.add([Track(uri='a')]) self.backend.playback.play() @@ -38,6 +55,12 @@ class DummyBackendListener(ThreadingActor, BackendListener): def __init__(self, events): self.events = events + def paused_playing(self, track, time_position): + self.events['paused_playing'].set() + + def resumed_playing(self, track, time_position): + self.events['resumed_playing'].set() + def started_playing(self, track): self.events['started_playing'].set() diff --git a/tests/listeners_test.py b/tests/listeners_test.py index 761aff4f..b51202d3 100644 --- a/tests/listeners_test.py +++ b/tests/listeners_test.py @@ -7,6 +7,12 @@ class BackendListenerTest(unittest.TestCase): def setUp(self): self.listener = BackendListener() + def test_listener_has_default_impl_for_the_paused_playing_event(self): + self.listener.paused_playing(Track(), 0) + + def test_listener_has_default_impl_for_the_resumed_playing_event(self): + self.listener.resumed_playing(Track(), 0) + def test_listener_has_default_impl_for_the_started_playing_event(self): self.listener.started_playing(Track())