From 0269686453a5035518106a5e1aa5243684b3d20c Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Fri, 24 Feb 2012 23:50:45 +0100 Subject: [PATCH] Fix volume response when capping volume --- docs/changes.rst | 6 ++++++ mopidy/mixers/base.py | 19 ++++++++++++++++--- tests/mixers/dummy_test.py | 7 ++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/changes.rst b/docs/changes.rst index 20ad3169..d955978d 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -32,6 +32,12 @@ v0.7.0 (in development) - Fix crash on mismatching quotation in ``list`` MPD queries. (Fixes: :issue:`137`) +- Volume is now reported to be the same as the volume was set to, also when + internal rounding have been done due to + :attr:`mopidy.settings.MIXER_MAX_VOLUME` has been set to cap the volume. This + should make it possible to manage capped volume from clients that only + increase volume with one step at a time, like ncmpcpp does. + v0.6.1 (2011-12-28) =================== diff --git a/mopidy/mixers/base.py b/mopidy/mixers/base.py index 8798076a..48df5325 100644 --- a/mopidy/mixers/base.py +++ b/mopidy/mixers/base.py @@ -21,19 +21,32 @@ class BaseMixer(object): Integer in range [0, 100]. :class:`None` if unknown. Values below 0 is equal to 0. Values above 100 is equal to 100. """ + if not hasattr(self, '_user_volume'): + self._user_volume = 0 volume = self.get_volume() if volume is None: return None - return int(volume / self.amplification_factor) + elif not self.amplification_factor < 1: + return volume + else: + user_volume = int(volume / self.amplification_factor) + if (user_volume - 1) <= self._user_volume <= (user_volume + 1): + return self._user_volume + else: + return user_volume @volume.setter def volume(self, volume): - volume = int(int(volume) * self.amplification_factor) + if not hasattr(self, '_user_volume'): + self._user_volume = 0 + volume = int(volume) if volume < 0: volume = 0 elif volume > 100: volume = 100 - self.set_volume(volume) + self._user_volume = volume + real_volume = int(volume * self.amplification_factor) + self.set_volume(real_volume) self._trigger_volume_changed() def get_volume(self): diff --git a/tests/mixers/dummy_test.py b/tests/mixers/dummy_test.py index 8ae8623c..f9418d7a 100644 --- a/tests/mixers/dummy_test.py +++ b/tests/mixers/dummy_test.py @@ -4,7 +4,7 @@ from tests import unittest from tests.mixers.base_test import BaseMixerTest -class DenonMixerTest(BaseMixerTest, unittest.TestCase): +class DummyMixerTest(BaseMixerTest, unittest.TestCase): mixer_class = DummyMixer def test_set_volume_is_capped(self): @@ -16,3 +16,8 @@ class DenonMixerTest(BaseMixerTest, unittest.TestCase): self.mixer.amplification_factor = 0.5 self.mixer._volume = 50 self.assertEquals(self.mixer.volume, 100) + + def test_get_volume_get_the_same_number_as_was_set(self): + self.mixer.amplification_factor = 0.5 + self.mixer.volume = 13 + self.assertEquals(self.mixer.volume, 13)