Test and implement mpris.Volume property

This commit is contained in:
Stein Magnus Jodal 2011-06-11 00:01:42 +02:00
parent 3df3527c73
commit 84ac7b3e6a
2 changed files with 55 additions and 2 deletions

View File

@ -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)

View File

@ -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)