From 84ac7b3e6ac68fe7adcc1531a357dd526c763d5d Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sat, 11 Jun 2011 00:01:42 +0200 Subject: [PATCH] Test and implement mpris.Volume property --- mopidy/frontends/mpris.py | 28 ++++++++++++++++-- .../frontends/mpris/player_interface_test.py | 29 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/mopidy/frontends/mpris.py b/mopidy/frontends/mpris.py index 95ce9bcd..1ac9f097 100644 --- a/mopidy/frontends/mpris.py +++ b/mopidy/frontends/mpris.py @@ -15,6 +15,7 @@ from pykka.registry import ActorRegistry from mopidy.backends.base import Backend from mopidy.backends.base.playback import PlaybackController from mopidy.frontends.base import BaseFrontend +from mopidy.mixers.base import BaseMixer logger = logging.getLogger('mopidy.frontends.mpris') @@ -90,6 +91,7 @@ class MprisObject(dbus.service.Object): def __init__(self): self._backend = None + self._mixer = None self.properties = { ROOT_IFACE: self._get_root_iface_properties(), PLAYER_IFACE: self._get_player_iface_properties(), @@ -121,8 +123,7 @@ class MprisObject(dbus.service.Object): 'Metadata': ({ 'mpris:trackid': '', # TODO Use (cpid, track.uri) }, None), - # TODO Get/set volume - 'Volume': (1.0, None), + 'Volume': (self.get_Volume, self.set_Volume), # TODO Get backend.playback.time_position 'Position': (0, None), 'MinimumRate': (1.0, None), @@ -155,6 +156,14 @@ class MprisObject(dbus.service.Object): self._backend = backend_refs[0].proxy() return self._backend + @property + def mixer(self): + if self._mixer is None: + mixer_refs = ActorRegistry.get_by_class(BaseMixer) + assert len(mixer_refs) == 1, 'Expected exactly one running mixer.' + self._mixer = mixer_refs[0].proxy() + return self._mixer + ### Properties interface @@ -359,3 +368,18 @@ class MprisObject(dbus.service.Object): self.backend.playback.shuffle = True else: self.backend.playback.shuffle = False + + def get_Volume(self): + volume = self.mixer.volume.get() + if volume is not None: + return volume / 100.0 + + def set_Volume(self, value): + if value is None: + return + elif value < 0: + self.mixer.volume = 0 + elif value > 1: + self.mixer.volume = 100 + elif 0 <= value <= 1: + self.mixer.volume = int(value * 100) diff --git a/tests/frontends/mpris/player_interface_test.py b/tests/frontends/mpris/player_interface_test.py index 7e434017..5d84b6d8 100644 --- a/tests/frontends/mpris/player_interface_test.py +++ b/tests/frontends/mpris/player_interface_test.py @@ -4,6 +4,7 @@ import unittest from mopidy.backends.dummy import DummyBackend from mopidy.backends.base.playback import PlaybackController from mopidy.frontends import mpris +from mopidy.mixers.dummy import DummyMixer from mopidy.models import Track PLAYING = PlaybackController.PLAYING @@ -13,12 +14,14 @@ STOPPED = PlaybackController.STOPPED class PlayerInterfaceTest(unittest.TestCase): def setUp(self): mpris.MprisObject._connect_to_dbus = mock.Mock() + self.mixer = DummyMixer.start().proxy() self.backend = DummyBackend.start().proxy() self.mpris = mpris.MprisObject() self.mpris._backend = self.backend def tearDown(self): self.backend.stop() + self.mixer.stop() def test_get_playback_status_is_playing_when_playing(self): self.backend.playback.state = PLAYING @@ -107,6 +110,32 @@ class PlayerInterfaceTest(unittest.TestCase): result = self.mpris.Set(mpris.PLAYER_IFACE, 'Shuffle', False) self.assertFalse(self.backend.playback.shuffle.get()) + def test_get_volume_should_return_volume_between_zero_and_one(self): + self.mixer.volume = 0 + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Volume') + self.assertEquals(result, 0) + + self.mixer.volume = 50 + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Volume') + self.assertEquals(result, 0.5) + + self.mixer.volume = 100 + result = self.mpris.Get(mpris.PLAYER_IFACE, 'Volume') + self.assertEquals(result, 1) + + def test_set_volume_to_one_should_set_mixer_volume_to_100(self): + self.mpris.Set(mpris.PLAYER_IFACE, 'Volume', 1.0) + self.assertEquals(self.mixer.volume.get(), 100) + + def test_set_volume_to_anything_above_one_should_set_mixer_volume_to_100(self): + self.mpris.Set(mpris.PLAYER_IFACE, 'Volume', 2.0) + self.assertEquals(self.mixer.volume.get(), 100) + + def test_set_volume_to_anything_not_a_number_does_not_change_volume(self): + self.mixer.volume = 10 + self.mpris.Set(mpris.PLAYER_IFACE, 'Volume', None) + self.assertEquals(self.mixer.volume.get(), 10) + def test_get_minimum_rate_is_one_or_less(self): result = self.mpris.Get(mpris.PLAYER_IFACE, 'MinimumRate') self.assert_(result <= 1.0)