From ee448d4dd3947d9578c9b535887cc060bbc69696 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 18 Dec 2012 10:27:59 +0100 Subject: [PATCH 1/4] audio: Make get_volume able to return all levels This fixes an issue where applications which changes volume by 1 level at a time could fail to change volume if track.max_volume is less than 100. E.g. get volume could return 44 after volume was set to 43, then the application would just try to set it to 43 again. --- mopidy/audio/actor.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 7de98075..ca115ba1 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -43,6 +43,7 @@ class Audio(pykka.ThreadingActor): self._mixer_track = None self._software_mixing = False self._appsrc = None + self._volume_set = -1 self._notify_source_signal_id = None self._about_to_finish_id = None @@ -388,10 +389,18 @@ class Audio(pykka.ThreadingActor): volumes = self._mixer.get_volume(self._mixer_track) avg_volume = float(sum(volumes)) / len(volumes) - new_scale = (0, 100) - old_scale = ( + internal_scale = (0, 100) + mixer_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) - return self._rescale(avg_volume, old=old_scale, new=new_scale) + + volume_set_scaled = self._rescale( + self._volume_set, old=internal_scale, new=mixer_scale) + + if self._volume_set > 0 and volume_set_scaled == avg_volume: + return self._volume_set + else: + return self._rescale( + avg_volume, old=mixer_scale, new=internal_scale) def set_volume(self, volume): """ @@ -408,6 +417,8 @@ class Audio(pykka.ThreadingActor): if self._mixer is None: return False + self._volume_set = volume + old_scale = (0, 100) new_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) From d3e3bef2c0d4040ee865b024284cdcb3a2880fad Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 18 Dec 2012 10:29:41 +0100 Subject: [PATCH 2/4] audio: Rename scales in set_volume for consistency --- mopidy/audio/actor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index ca115ba1..d91022ca 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -419,11 +419,11 @@ class Audio(pykka.ThreadingActor): self._volume_set = volume - old_scale = (0, 100) - new_scale = ( + internal_scale = (0, 100) + mixer_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) - volume = self._rescale(volume, old=old_scale, new=new_scale) + volume = self._rescale(volume, old=internal_scale, new=mixer_scale) volumes = (volume,) * self._mixer_track.num_channels self._mixer.set_volume(self._mixer_track, volumes) From fcda4696bc2b7d13c3e0867de99a8dea068c185f Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 18 Dec 2012 18:18:29 +0100 Subject: [PATCH 3/4] audio: Use None instead of -1 for undefined volume --- mopidy/audio/actor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index d91022ca..0df8fb2b 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -43,7 +43,7 @@ class Audio(pykka.ThreadingActor): self._mixer_track = None self._software_mixing = False self._appsrc = None - self._volume_set = -1 + self._volume_set = None self._notify_source_signal_id = None self._about_to_finish_id = None @@ -396,7 +396,7 @@ class Audio(pykka.ThreadingActor): volume_set_scaled = self._rescale( self._volume_set, old=internal_scale, new=mixer_scale) - if self._volume_set > 0 and volume_set_scaled == avg_volume: + if self._volume_set is not None and volume_set_scaled == avg_volume: return self._volume_set else: return self._rescale( From 200e4d2536484b1063a82aa6a4505f7f33cc0960 Mon Sep 17 00:00:00 2001 From: Trygve Aaberge Date: Tue, 18 Dec 2012 19:00:46 +0100 Subject: [PATCH 4/4] audio: Don't try to rescale volume_set if it's None --- mopidy/audio/actor.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 0df8fb2b..3910ee80 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -393,10 +393,8 @@ class Audio(pykka.ThreadingActor): mixer_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) - volume_set_scaled = self._rescale( - self._volume_set, old=internal_scale, new=mixer_scale) - - if self._volume_set is not None and volume_set_scaled == avg_volume: + if self._volume_set is not None and self._rescale(self._volume_set, + old=internal_scale, new=mixer_scale) == avg_volume: return self._volume_set else: return self._rescale(