[pulseaudio-discuss] [PATCH] alsa-mixer: round, not truncate, in to_alsa_dB

Tanu Kaskinen tanuk at iki.fi
Wed Aug 30 18:18:53 UTC 2017


On Wed, 2017-08-30 at 11:09 +0300, Ian Ray wrote:
> to_alsa_dB() returns a result rounded to two decimal places (instead of
> using integer truncation) to avoid small errors when converting between
> dB and volume.
> 
> Consider playback at -22 dB (which is supported by ALSA) but results in
> the higher level of -21 dB plus software attenuation.
> 
>     pa_sw_volume_from_dB(-22) = 28172
>     pa_sw_volume_to_dB(28172) = -21.9997351
>     to_alsa_dB(-21.9997351)   = -2199
> 
>     ALSA value 106 = -2200
>     ALSA value 107 = -2100
>     ...
> 
>     rounding = +1  /* "accurate or first above" */
>     snd_mixer_selem_ask_playback_dB_vol(me, -2199, rounding, &alsa_val)
>     alsa_val = -2100
> 
> Signed-off-by: Ian Ray <ian.ray at ge.com>
> ---
>  src/modules/alsa/alsa-mixer.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
> index f59cad3..aeaf12c 100644
> --- a/src/modules/alsa/alsa-mixer.c
> +++ b/src/modules/alsa/alsa-mixer.c
> @@ -700,7 +700,7 @@ void pa_alsa_path_set_free(pa_alsa_path_set *ps) {
>  }
>  
>  static long to_alsa_dB(pa_volume_t v) {
> -    return (long) (pa_sw_volume_to_dB(v) * 100.0);
> +    return lround(pa_sw_volume_to_dB(v) * 100.0);
>  }
>  
>  static pa_volume_t from_alsa_dB(long v) {

Thanks! Applied to the "next" branch.

-- 
Tanu

https://www.patreon.com/tanuk


More information about the pulseaudio-discuss mailing list