[pulseaudio-discuss] [PATCH] volume: The volume is calculated by rounding.

lishengyu lishengyu at uniontech.com
Tue Jan 11 07:15:52 UTC 2022


When calculating the volume, we're going to take the integer part.
This may cause the left/right balance continued to change in one
direction when the volume was adjusted. So we adjusted to a rounded
way, accepting fine tuning of the left and right channels, but
remaining stable within the desired balance range.

Signed-off-by: lishengyu <lishengyu at uniontech.com>
---
 src/pulse/volume.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index fc6ac8d28..58e014dff 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -771,6 +771,7 @@ pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, flo
 
 pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max) {
     unsigned c;
+    uint64_t scale;
     pa_volume_t t = 0;
 
     pa_assert(v);
@@ -783,8 +784,10 @@ pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max) {
     if (t <= PA_VOLUME_MUTED)
         return pa_cvolume_set(v, v->channels, max);
 
-    for (c = 0; c < v->channels; c++)
-        v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) max) / (uint64_t) t);
+    for (c = 0; c < v->channels; c++) {
+        scale = (uint64_t) round((double) ((uint64_t) v->values[c] * (uint64_t) max) / (uint64_t) t);
+        v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(scale);
+    }
 
     return v;
 }
-- 
2.20.1





More information about the pulseaudio-discuss mailing list