From 867c8fbc507f53e2921a5217cdec48d38104fe3a Mon Sep 17 00:00:00 2001 From: Kristian Date: Wed, 10 Mar 2010 13:16:56 +0100 Subject: [PATCH] Added reading of volume from Denon devices that support it, and reopen socket if needed --- mopidy/mixers/denon.py | 17 ++++++++++++----- tests/mixers/denontest.py | 24 ++++++++++++++++++++---- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/mopidy/mixers/denon.py b/mopidy/mixers/denon.py index 2acfa619..78bb27a0 100644 --- a/mopidy/mixers/denon.py +++ b/mopidy/mixers/denon.py @@ -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 diff --git a/tests/mixers/denontest.py b/tests/mixers/denontest.py index a862e402..6256ac38 100644 --- a/tests/mixers/denontest.py +++ b/tests/mixers/denontest.py @@ -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)