diff --git a/mopidy/core/actor.py b/mopidy/core/actor.py index e8c600ed..61b5ec4a 100644 --- a/mopidy/core/actor.py +++ b/mopidy/core/actor.py @@ -5,7 +5,7 @@ import itertools import pykka -from mopidy import audio, backend +from mopidy import audio, backend, mixer from mopidy.audio import PlaybackState from mopidy.core.library import LibraryController from mopidy.core.listener import CoreListener @@ -15,7 +15,10 @@ from mopidy.core.tracklist import TracklistController from mopidy.utils import versioning -class Core(pykka.ThreadingActor, audio.AudioListener, backend.BackendListener): +class Core( + pykka.ThreadingActor, audio.AudioListener, backend.BackendListener, + mixer.MixerListener): + library = None """The library controller. An instance of :class:`mopidy.core.LibraryController`.""" @@ -81,6 +84,14 @@ class Core(pykka.ThreadingActor, audio.AudioListener, backend.BackendListener): # Forward event from backend to frontends CoreListener.send('playlists_loaded') + def volume_changed(self, volume): + # Forward event from mixer to frontends + CoreListener.send('volume_changed', volume=volume) + + def mute_changed(self, muted): + # Forward event from mixer to frontends + CoreListener.send('mute_changed', mute=muted) + class Backends(list): def __init__(self, backends): diff --git a/mopidy/core/listener.py b/mopidy/core/listener.py index f0bb1ea3..41c697a3 100644 --- a/mopidy/core/listener.py +++ b/mopidy/core/listener.py @@ -150,6 +150,7 @@ class CoreListener(listener.Listener): :param mute: the new mute state :type mute: boolean """ + # TODO Change 'mute' arg to 'muted' next time we break this API pass def seeked(self, time_position): diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 8988aa9e..bf645227 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -101,8 +101,6 @@ class PlaybackController(object): # For testing self._volume = volume - self._trigger_volume_changed(volume) - volume = property(get_volume, set_volume) """Volume as int in range [0..100] or :class:`None`""" @@ -121,8 +119,6 @@ class PlaybackController(object): # For testing self._mute = value - self._trigger_mute_changed(value) - mute = property(get_mute, set_mute) """Mute state as a :class:`True` if muted, :class:`False` otherwise""" @@ -351,14 +347,6 @@ class PlaybackController(object): 'playback_state_changed', old_state=old_state, new_state=new_state) - def _trigger_volume_changed(self, volume): - logger.debug('Triggering volume changed event') - listener.CoreListener.send('volume_changed', volume=volume) - - def _trigger_mute_changed(self, mute): - logger.debug('Triggering mute changed event') - listener.CoreListener.send('mute_changed', mute=mute) - def _trigger_seeked(self, time_position): logger.debug('Triggering seeked event') listener.CoreListener.send('seeked', time_position=time_position) diff --git a/tests/core/test_events.py b/tests/core/test_events.py index 87abd9f9..6ea6704a 100644 --- a/tests/core/test_events.py +++ b/tests/core/test_events.py @@ -20,11 +20,23 @@ class BackendEventsTest(unittest.TestCase): def tearDown(self): pykka.ActorRegistry.stop_all() - def test_backends_playlists_loaded_forwards_event_to_frontends(self, send): + def test_forwards_backend_playlists_loaded_event_to_frontends(self, send): self.core.playlists_loaded().get() self.assertEqual(send.call_args[0][0], 'playlists_loaded') + def test_forwards_mixer_volume_changed_event_to_frontends(self, send): + self.core.volume_changed(volume=60).get() + + self.assertEqual(send.call_args[0][0], 'volume_changed') + self.assertEqual(send.call_args[1]['volume'], 60) + + def test_forwards_mixer_mute_changed_event_to_frontends(self, send): + self.core.mute_changed(muted=True).get() + + self.assertEqual(send.call_args[0][0], 'mute_changed') + self.assertEqual(send.call_args[1]['mute'], True) + def test_tracklist_add_sends_tracklist_changed_event(self, send): send.reset_mock() diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index 09012139..ce6c8571 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -376,17 +376,16 @@ class CorePlaybackTest(unittest.TestCase): # TODO Test on_tracklist_change - # TODO Test volume + def test_volume(self): + self.assertEqual(self.core.playback.volume, None) - @mock.patch( - 'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener) - def test_set_volume_emits_volume_changed_event(self, listener_mock): - self.core.playback.set_volume(10) - listener_mock.reset_mock() + self.core.playback.volume = 30 - self.core.playback.set_volume(20) + self.assertEqual(self.core.playback.volume, 30) - listener_mock.send.assert_called_once_with('volume_changed', volume=20) + self.core.playback.volume = 70 + + self.assertEqual(self.core.playback.volume, 70) def test_mute(self): self.assertEqual(self.core.playback.mute, False)