Added Denon mixer support
This commit is contained in:
parent
baa10f7c91
commit
e96751aa46
27
mopidy/mixers/denon.py
Normal file
27
mopidy/mixers/denon.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
from serial import Serial
|
||||||
|
|
||||||
|
from mopidy.mixers import BaseMixer
|
||||||
|
from mopidy.settings import MIXER_PORT
|
||||||
|
|
||||||
|
|
||||||
|
class DenonMixer(BaseMixer):
|
||||||
|
def __init__(self):
|
||||||
|
self._device = Serial(port=MIXER_PORT)
|
||||||
|
self._levels = ['99']+["%(#)02d"% {'#': v} for v in range(0,99)]
|
||||||
|
self._volume = None
|
||||||
|
|
||||||
|
def _get_volume(self):
|
||||||
|
# The Denon spec doesnt seem to document
|
||||||
|
# how to query the volume, so we keep the
|
||||||
|
# state internally
|
||||||
|
return self._volume
|
||||||
|
|
||||||
|
def _set_volume(self, volume):
|
||||||
|
# Clamp according to Denon-spec
|
||||||
|
if not volume:
|
||||||
|
volume = 0
|
||||||
|
elif volume > 99:
|
||||||
|
volume = 99
|
||||||
|
|
||||||
|
self._volume = volume
|
||||||
|
self._device.write('MV%s\r'% self._levels[volume])
|
||||||
@ -38,12 +38,28 @@ CONSOLE_LOG_FORMAT = u'%(levelname)-8s %(asctime)s [%(threadName)s] %(name)s\n
|
|||||||
#: Default on other operating systems::
|
#: Default on other operating systems::
|
||||||
#:
|
#:
|
||||||
#: MIXER = u'mopidy.mixers.dummy.DummyMixer'
|
#: MIXER = u'mopidy.mixers.dummy.DummyMixer'
|
||||||
|
#:
|
||||||
|
#: *Using external mixers*
|
||||||
|
#:
|
||||||
|
#: Using external mixers depends on the pyserial-library,
|
||||||
|
#: so make sure you have it installed. It also adds one
|
||||||
|
#: more setting, MIXER_PORT. This must point to the device
|
||||||
|
#: port like /dev/tty1 or similar.
|
||||||
|
#:
|
||||||
|
#: Available external Mixers::
|
||||||
|
#:
|
||||||
|
#:
|
||||||
|
#: MIXER = u'mopidy.mixers.denon.DenonMixer'
|
||||||
|
#: MIXER_PORT = u'/dev/tty0' # Verify this manually
|
||||||
|
#:
|
||||||
MIXER = u'mopidy.mixers.dummy.DummyMixer'
|
MIXER = u'mopidy.mixers.dummy.DummyMixer'
|
||||||
if sys.platform == 'linux2':
|
if sys.platform == 'linux2':
|
||||||
MIXER = u'mopidy.mixers.alsa.AlsaMixer'
|
MIXER = u'mopidy.mixers.alsa.AlsaMixer'
|
||||||
elif sys.platform == 'darwin':
|
elif sys.platform == 'darwin':
|
||||||
MIXER = u'mopidy.mixers.osa.OsaMixer'
|
MIXER = u'mopidy.mixers.osa.OsaMixer'
|
||||||
|
|
||||||
|
MIXER_PORT=None
|
||||||
|
|
||||||
#: Which address Mopidy should bind to. Examples:
|
#: Which address Mopidy should bind to. Examples:
|
||||||
#:
|
#:
|
||||||
#: ``localhost``
|
#: ``localhost``
|
||||||
|
|||||||
@ -10,6 +10,7 @@ def main():
|
|||||||
os.path.abspath(os.path.join(os.path.dirname(__file__), '../')))
|
os.path.abspath(os.path.join(os.path.dirname(__file__), '../')))
|
||||||
r = CoverageTestRunner()
|
r = CoverageTestRunner()
|
||||||
r.add_pair('mopidy/mixers/dummy.py', 'tests/mixers/dummytest.py')
|
r.add_pair('mopidy/mixers/dummy.py', 'tests/mixers/dummytest.py')
|
||||||
|
r.add_pair('mopidy/mixers/denon.py', 'tests/mixers/denontest.py')
|
||||||
r.add_pair('mopidy/models.py', 'tests/modelstest.py')
|
r.add_pair('mopidy/models.py', 'tests/modelstest.py')
|
||||||
r.add_pair('mopidy/mpd/handler.py', 'tests/mpd/handlertest.py')
|
r.add_pair('mopidy/mpd/handler.py', 'tests/mpd/handlertest.py')
|
||||||
r.run()
|
r.run()
|
||||||
|
|||||||
31
tests/mixers/denontest.py
Normal file
31
tests/mixers/denontest.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import unittest
|
||||||
|
import os
|
||||||
|
|
||||||
|
from mopidy.mixers.denon import DenonMixer
|
||||||
|
|
||||||
|
class DenonMixerTest(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.m = DenonMixer()
|
||||||
|
self.m._device = os.tmpfile() # "Mock" :-)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.m._device.close()
|
||||||
|
|
||||||
|
def test_volume_is_None_initially(self):
|
||||||
|
self.assertEqual(self.m.volume, None)
|
||||||
|
|
||||||
|
def test_volume_set_to_min(self):
|
||||||
|
self.m.volume = 0
|
||||||
|
self.assertEqual(self.m.volume, 0)
|
||||||
|
|
||||||
|
def test_volume_set_to_max(self):
|
||||||
|
self.m.volume = 100
|
||||||
|
self.assertEqual(self.m.volume, 99)
|
||||||
|
|
||||||
|
def test_volume_set_to_below_min_results_in_min(self):
|
||||||
|
self.m.volume = -10
|
||||||
|
self.assertEqual(self.m.volume, 0)
|
||||||
|
|
||||||
|
def test_volume_set_to_above_max_results_in_max(self):
|
||||||
|
self.m.volume = 110
|
||||||
|
self.assertEqual(self.m.volume, 99)
|
||||||
Loading…
Reference in New Issue
Block a user