summaryrefslogtreecommitdiff
path: root/media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch')
-rw-r--r--media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch b/media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch
new file mode 100644
index 000000000000..469aaa345102
--- /dev/null
+++ b/media-libs/libpulse/files/pulseaudio-16.0-fix-pactl-volume-command.patch
@@ -0,0 +1,55 @@
+https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/05c06afa58e30b7958e96766d1e917099c8a4041
+
+From 05c06afa58e30b7958e96766d1e917099c8a4041 Mon Sep 17 00:00:00 2001
+From: Sean Greenslade <sean@seangreenslade.com>
+Date: Sat, 4 Jun 2022 00:24:49 -0700
+Subject: [PATCH] pactl: fix parsing of percentages with decimal points
+
+The logic for detecting which type of volume was given incorrectly interpreted
+any value with a decimal as a VOL_LINEAR. It also could set multiple flags,
+which would put the flags variable into an indeterminate state. Additionally,
+the flags stack variable was uninitialized which could also lead to an
+indeterminate flag state.
+
+Percentages are now prioritized over all other types, and only one type flag
+can be set.
+---
+ src/utils/pactl.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/utils/pactl.c b/src/utils/pactl.c
+index 35163f277..2761ebaaf 100644
+--- a/src/utils/pactl.c
++++ b/src/utils/pactl.c
+@@ -2527,16 +2527,16 @@ static int parse_volume(const char *vol_spec, pa_volume_t *vol, enum volume_flag
+ vs = pa_xstrdup(vol_spec);
+
+ *vol_flags = (pa_startswith(vs, "+") || pa_startswith(vs, "-")) ? VOL_RELATIVE : VOL_ABSOLUTE;
+- if (strchr(vs, '.'))
+- *vol_flags |= VOL_LINEAR;
+ if (pa_endswith(vs, "%")) {
+ *vol_flags |= VOL_PERCENT;
+ vs[strlen(vs)-1] = 0;
+ }
+- if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
++ else if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
+ *vol_flags |= VOL_DECIBEL;
+ vs[strlen(vs)-2] = 0;
+ }
++ else if (strchr(vs, '.'))
++ *vol_flags |= VOL_LINEAR;
+
+ atod_input = vs;
+
+@@ -2597,7 +2597,7 @@ static int parse_volumes(char *args[], unsigned n) {
+
+ volume.channels = n;
+ for (i = 0; i < volume.channels; i++) {
+- enum volume_flags flags;
++ enum volume_flags flags = 0;
+
+ if (parse_volume(args[i], &volume.values[i], &flags) < 0)
+ return -1;
+--
+GitLab
+