From 213796305b89fa0e5de001006dbd741db0e83d36 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 16:22:28 +0300 Subject: [PATCH 1/4] Test that backend actually sends the events --- tests/backends/events_test.py | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 tests/backends/events_test.py diff --git a/tests/backends/events_test.py b/tests/backends/events_test.py new file mode 100644 index 00000000..c988244d --- /dev/null +++ b/tests/backends/events_test.py @@ -0,0 +1,45 @@ +import threading +import unittest + +from pykka.actor import ThreadingActor +from pykka.registry import ActorRegistry + +from mopidy.backends.dummy import DummyBackend +from mopidy.listeners import BackendListener +from mopidy.models import Track + +class BackendEventsTest(unittest.TestCase): + def setUp(self): + self.events = { + 'started_playing': threading.Event(), + 'stopped_playing': threading.Event(), + } + self.backend = DummyBackend.start().proxy() + self.listener = DummyBackendListener.start(self.events).proxy() + + def tearDown(self): + ActorRegistry.stop_all() + + def test_play_sends_started_playing_event(self): + self.backend.current_playlist.add([Track(uri='a')]) + self.backend.playback.play() + self.events['started_playing'].wait(timeout=1) + self.assertTrue(self.events['started_playing'].is_set()) + + def test_stop_sends_stopped_playing_event(self): + self.backend.current_playlist.add([Track(uri='a')]) + self.backend.playback.play() + self.backend.playback.stop() + self.events['stopped_playing'].wait(timeout=1) + self.assertTrue(self.events['stopped_playing'].is_set()) + + +class DummyBackendListener(ThreadingActor, BackendListener): + def __init__(self, events): + self.events = events + + def started_playing(self, track): + self.events['started_playing'].set() + + def stopped_playing(self, track, stop_position): + self.events['stopped_playing'].set() From b99a975a81232f37e1f678a50cb653739cb1de9f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 17:29:47 +0300 Subject: [PATCH 2/4] Remove obvious docs on internal methods --- mopidy/backends/base/playback.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index 07e286fa..9f2538f8 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -461,27 +461,13 @@ class PlaybackController(object): self.current_cp_track = None def _trigger_started_playing_event(self): - """ - Notifies implementors of :class:`mopidy.listeners.BackendListener` that - a track has started playing. - - For internal use only. Should be called by the backend directly after a - track has started playing. - """ if self.current_track is None: return for listener_ref in ActorRegistry.get_by_class(BackendListener): listener_ref.proxy().started_playing(track=self.current_track) def _trigger_stopped_playing_event(self): - """ - Notifies implementors of :class:`mopidy.listeners.BackendListener` that - a track has stopped playing. - - For internal use only. Should be called by the backend before a track - is stopped playing, e.g. at the next, previous, and stop actions and at - end-of-track. - """ + # TODO Test that this is called on next/prev/end-of-track if self.current_track is None: return for listener_ref in ActorRegistry.get_by_class(BackendListener): From 5c325b03a1763917d8466f5ddb5017cbba1f2010 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 17:30:26 +0300 Subject: [PATCH 3/4] Change stopped_playing event arg from stop_position to time_position --- mopidy/backends/base/playback.py | 2 +- mopidy/listeners.py | 6 +++--- tests/backends/events_test.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index 9f2538f8..53839891 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -472,7 +472,7 @@ class PlaybackController(object): return for listener_ref in ActorRegistry.get_by_class(BackendListener): listener_ref.proxy().stopped_playing( - track=self.current_track, stop_position=self.time_position) + track=self.current_track, time_position=self.time_position) class BasePlaybackProvider(object): diff --git a/mopidy/listeners.py b/mopidy/listeners.py index f6d1c67e..dfc5c60b 100644 --- a/mopidy/listeners.py +++ b/mopidy/listeners.py @@ -20,7 +20,7 @@ class BackendListener(object): """ pass - def stopped_playing(self, track, stop_position): + def stopped_playing(self, track, time_position): """ Called whenever playback is stopped. @@ -28,7 +28,7 @@ class BackendListener(object): :param track: the track that was played before playback stopped :type track: :class:`mopidy.models.Track` - :param stop_position: the time position when stopped in milliseconds - :type stop_position: int + :param time_position: the time position in milliseconds + :type time_position: int """ pass diff --git a/tests/backends/events_test.py b/tests/backends/events_test.py index c988244d..44529e90 100644 --- a/tests/backends/events_test.py +++ b/tests/backends/events_test.py @@ -41,5 +41,5 @@ class DummyBackendListener(ThreadingActor, BackendListener): def started_playing(self, track): self.events['started_playing'].set() - def stopped_playing(self, track, stop_position): + def stopped_playing(self, track, time_position): self.events['stopped_playing'].set() From 5c66f19d1a22e1c970093b1ca48840758c120921 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Wed, 29 Jun 2011 18:58:32 +0300 Subject: [PATCH 4/4] Avoid blocking when broadcasting events --- docs/changes.rst | 4 ++++ docs/installation/index.rst | 2 +- mopidy/backends/base/playback.py | 22 +++++++++++++++++----- requirements/core.txt | 2 +- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 2347ddb0..5d2ab57d 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -8,6 +8,10 @@ This change log is used to track all major changes to Mopidy. v0.6.0 (in development) ======================= +**Important changes** + +- Pykka 0.12.3 or greater is required. + **Changes** - Replace :attr:`mopidy.backends.base.Backend.uri_handlers` with diff --git a/docs/installation/index.rst b/docs/installation/index.rst index 5101cc84..198ac9e8 100644 --- a/docs/installation/index.rst +++ b/docs/installation/index.rst @@ -25,7 +25,7 @@ Otherwise, make sure you got the required dependencies installed. - Python >= 2.6, < 3 -- `Pykka `_ >= 0.12 +- `Pykka `_ >= 0.12.3 - GStreamer >= 0.10, with Python bindings. See :doc:`gstreamer`. diff --git a/mopidy/backends/base/playback.py b/mopidy/backends/base/playback.py index 53839891..088a5ad4 100644 --- a/mopidy/backends/base/playback.py +++ b/mopidy/backends/base/playback.py @@ -461,18 +461,30 @@ class PlaybackController(object): self.current_cp_track = None def _trigger_started_playing_event(self): + logger.debug(u'Triggering started playing event') if self.current_track is None: return - for listener_ref in ActorRegistry.get_by_class(BackendListener): - listener_ref.proxy().started_playing(track=self.current_track) + ActorRegistry.broadcast({ + 'command': 'pykka_call', + 'attr_path': ('started_playing',), + 'args': [], + 'kwargs': {'track': self.current_track}, + }, target_class=BackendListener) def _trigger_stopped_playing_event(self): # TODO Test that this is called on next/prev/end-of-track + logger.debug(u'Triggering stopped playing event') if self.current_track is None: return - for listener_ref in ActorRegistry.get_by_class(BackendListener): - listener_ref.proxy().stopped_playing( - track=self.current_track, time_position=self.time_position) + ActorRegistry.broadcast({ + 'command': 'pykka_call', + 'attr_path': ('stopped_playing',), + 'args': [], + 'kwargs': { + 'track': self.current_track, + 'time_position': self.time_position, + }, + }, target_class=BackendListener) class BasePlaybackProvider(object): diff --git a/requirements/core.txt b/requirements/core.txt index aaae84f8..8f9da622 100644 --- a/requirements/core.txt +++ b/requirements/core.txt @@ -1 +1 @@ -Pykka >= 0.12 +Pykka >= 0.12.3