diff --git a/src/pcm_utils.h b/src/pcm_utils.h index 1668bbf0c..069fb9f53 100644 --- a/src/pcm_utils.h +++ b/src/pcm_utils.h @@ -36,6 +36,16 @@ struct pcm_convert_state { int error; }; +/** + * Converts a float value (0.0 = silence, 1.0 = 100% volume) to an + * integer volume value (1000 = 100%). + */ +static inline int +pcm_float_to_volume(float volume) +{ + return volume * 1000.0 + 0.5; +} + void pcm_volume(char *buffer, int bufferSize, const struct audio_format *format, int volume); diff --git a/src/volume.c b/src/volume.c index 8e27dae38..8d497ed44 100644 --- a/src/volume.c +++ b/src/volume.c @@ -22,6 +22,7 @@ #include "player_control.h" #include "utils.h" #include "idle.h" +#include "pcm_utils.h" #include "os_compat.h" #include "../config.h" @@ -483,8 +484,8 @@ static int changeSoftwareVolume(int change, int rel) else if (new <= 0) new = 0; else - new = - 1000.0 * (exp(new / 25.0) - 1) / (54.5981500331F - 1) + 0.5; + new = pcm_float_to_volume((exp(new / 25.0) - 1) / + (54.5981500331F - 1)); setPlayerSoftwareVolume(new);