summaryrefslogtreecommitdiff
path: root/src/pulse/volume.c
diff options
context:
space:
mode:
authorGeorg Chini <georg@chini.tk>2017-04-29 10:12:01 +0200
committerGeorg Chini <georg@chini.tk>2017-04-29 10:12:01 +0200
commitbe1276d816171d9ce6c981581c22a297a61d62bc (patch)
tree68623c15e4436126d8b79a8dcd21121548c9c877 /src/pulse/volume.c
parentd985276c8b4c005171ea10d412e854bb956a092b (diff)
downloadpulseaudio-be1276d816171d9ce6c981581c22a297a61d62bc.tar.gz
volume: Print a warning when volume is clipped in pa_sw_volume_multiply/divide()
When the volume exceeds PA_VOLUME_MAX in pa_sw_volume_multiply() or pa_sw_volume_divide(), volume settings are insanely high and the user should be notified about it. This patch adds volume clamping to pa_sw_volume_divide() and prints a warning when the volume is clipped in both functions.
Diffstat (limited to 'src/pulse/volume.c')
-rw-r--r--src/pulse/volume.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index 1667b940c..1488028ba 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -199,16 +199,23 @@ pa_volume_t pa_cvolume_min_mask(const pa_cvolume *a, const pa_channel_map *cm, p
}
pa_volume_t pa_sw_volume_multiply(pa_volume_t a, pa_volume_t b) {
+ uint64_t result;
pa_return_val_if_fail(PA_VOLUME_IS_VALID(a), PA_VOLUME_INVALID);
pa_return_val_if_fail(PA_VOLUME_IS_VALID(b), PA_VOLUME_INVALID);
/* cbrt((a/PA_VOLUME_NORM)^3*(b/PA_VOLUME_NORM)^3)*PA_VOLUME_NORM = a*b/PA_VOLUME_NORM */
- return (pa_volume_t) PA_CLAMP_VOLUME((((uint64_t) a * (uint64_t) b + (uint64_t) PA_VOLUME_NORM / 2ULL) / (uint64_t) PA_VOLUME_NORM));
+ result = ((uint64_t) a * (uint64_t) b + (uint64_t) PA_VOLUME_NORM / 2ULL) / (uint64_t) PA_VOLUME_NORM;
+
+ if (result > (uint64_t)PA_VOLUME_MAX)
+ pa_log_warn("pa_sw_volume_multiply: Volume exceeds maximum allowed value and will be clipped. Please check your volume settings.");
+
+ return (pa_volume_t) PA_CLAMP_VOLUME(result);
}
pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) {
+ uint64_t result;
pa_return_val_if_fail(PA_VOLUME_IS_VALID(a), PA_VOLUME_INVALID);
pa_return_val_if_fail(PA_VOLUME_IS_VALID(b), PA_VOLUME_INVALID);
@@ -216,7 +223,12 @@ pa_volume_t pa_sw_volume_divide(pa_volume_t a, pa_volume_t b) {
if (b <= PA_VOLUME_MUTED)
return 0;
- return (pa_volume_t) (((uint64_t) a * (uint64_t) PA_VOLUME_NORM + (uint64_t) b / 2ULL) / (uint64_t) b);
+ result = ((uint64_t) a * (uint64_t) PA_VOLUME_NORM + (uint64_t) b / 2ULL) / (uint64_t) b;
+
+ if (result > (uint64_t)PA_VOLUME_MAX)
+ pa_log_warn("pa_sw_volume_divide: Volume exceeds maximum allowed value and will be clipped. Please check your volume settings.");
+
+ return (pa_volume_t) PA_CLAMP_VOLUME(result);
}
/* Amplitude, not power */