Test and implement mpris.Volume property
This commit is contained in:
parent
3df3527c73
commit
84ac7b3e6a
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user