Added reading of volume from Denon devices that support it, and reopen socket if needed
This commit is contained in:
parent
e96751aa46
commit
867c8fbc50
@ -6,14 +6,19 @@ from mopidy.settings import MIXER_PORT
|
||||
|
||||
class DenonMixer(BaseMixer):
|
||||
def __init__(self):
|
||||
self._device = Serial(port=MIXER_PORT)
|
||||
self._device = Serial(port=MIXER_PORT, timeout=0.2)
|
||||
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
|
||||
try:
|
||||
self._device.write('MV?\r')
|
||||
vol = self._device.read(2)
|
||||
if vol:
|
||||
return self._levels.index(int(vol))
|
||||
except:
|
||||
pass # No support for volume query on device
|
||||
|
||||
return self._volume
|
||||
|
||||
def _set_volume(self, volume):
|
||||
@ -23,5 +28,7 @@ class DenonMixer(BaseMixer):
|
||||
elif volume > 99:
|
||||
volume = 99
|
||||
|
||||
self._volume = volume
|
||||
if not self._device.isOpen():
|
||||
self._device.open()
|
||||
self._device.write('MV%s\r'% self._levels[volume])
|
||||
self._volume = volume
|
||||
|
||||
@ -3,13 +3,24 @@ import os
|
||||
|
||||
from mopidy.mixers.denon import DenonMixer
|
||||
|
||||
class DenonMixerDeviceMock(object):
|
||||
def __init__(self):
|
||||
self._open = True
|
||||
self.ret_val = bytes('00')
|
||||
|
||||
def write(self, x):
|
||||
pass
|
||||
def read(self, x):
|
||||
return self.ret_val
|
||||
def isOpen(self):
|
||||
return self._open
|
||||
def open(self):
|
||||
self._open = True
|
||||
|
||||
class DenonMixerTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.m = DenonMixer()
|
||||
self.m._device = os.tmpfile() # "Mock" :-)
|
||||
|
||||
def tearDown(self):
|
||||
self.m._device.close()
|
||||
self.m._device = DenonMixerDeviceMock()
|
||||
|
||||
def test_volume_is_None_initially(self):
|
||||
self.assertEqual(self.m.volume, None)
|
||||
@ -29,3 +40,8 @@ class DenonMixerTest(unittest.TestCase):
|
||||
def test_volume_set_to_above_max_results_in_max(self):
|
||||
self.m.volume = 110
|
||||
self.assertEqual(self.m.volume, 99)
|
||||
|
||||
def test_reopen_device(self):
|
||||
self.m._device._open = False
|
||||
self.m.volume = 10
|
||||
self.assertTrue(self.m._device._open)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user