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.
This commit is contained in:
Trygve Aaberge 2012-12-18 10:27:59 +01:00
parent 6008a53027
commit ee448d4dd3

View File

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