mixer/software: keep attribute "volume" in the 0..100 range

The attribute must be 0..100 and not 0..1024.  Previously, the code
was inconsistent.
This commit is contained in:
Max Kellermann 2014-05-12 12:46:14 +02:00
parent fd1b04932a
commit 073e9d06ec
1 changed files with 19 additions and 7 deletions

View File

@ -49,6 +49,9 @@ class SoftwareMixer final : public Mixer {
*/
bool owns_filter;
/**
* The current volume in percent (0..100).
*/
unsigned volume;
public:
@ -93,19 +96,28 @@ software_mixer_init(gcc_unused EventLoop &event_loop,
return new SoftwareMixer(listener);
}
gcc_const
static unsigned
PercentVolumeToSoftwareVolume(unsigned volume)
{
assert(volume <= 100);
if (volume >= 100)
return PCM_VOLUME_1;
else if (volume > 0)
return pcm_float_to_volume((exp(volume / 25.0) - 1) /
(54.5981500331F - 1));
else
return 0;
}
bool
SoftwareMixer::SetVolume(unsigned new_volume, gcc_unused Error &error)
{
assert(new_volume <= 100);
if (new_volume >= 100)
new_volume = PCM_VOLUME_1;
else if (new_volume > 0)
new_volume = pcm_float_to_volume((exp(new_volume / 25.0) - 1) /
(54.5981500331F - 1));
volume = new_volume;
volume_filter_set(filter, new_volume);
volume_filter_set(filter, PercentVolumeToSoftwareVolume(new_volume));
return true;
}