Added reading of volume from Denon devices that support it, and reopen socket if needed

This commit is contained in:
Kristian 2010-03-10 13:16:56 +01:00
parent e96751aa46
commit 867c8fbc50
2 changed files with 32 additions and 9 deletions

View File

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

View File

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