Must use one way to specify volumes consistently, e.g. +3dB +3dB, mixing different ways is not allowed, such as 40% 1000 Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net> --- src/utils/pactl.c | 57 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/utils/pactl.c b/src/utils/pactl.c index 8d5e197..c46794d 100644 --- a/src/utils/pactl.c +++ b/src/utils/pactl.c @@ -1458,6 +1458,26 @@ static int parse_volume(const char *vol_spec, pa_volume_t *vol, enum volume_flag return 0; } +static int parse_volumes(char *args[], int n) { + unsigned i; + + volume.channels = n; + for (i = 0; i < volume.channels; i++) { + enum volume_flags flags; + + if (parse_volume(args[i], &volume.values[i], &flags) < 0) + return -1; + + if (i > 0 && flags != volume_flags) { + pa_log(_("Inconsistent volume specification\n")); + return -1; + } else + volume_flags = flags; + } + + return 0; +} + static enum mute_flags parse_mute(const char *mute_text) { int b; @@ -1814,7 +1834,6 @@ int main(int argc, char *argv[]) { source_name = pa_xstrdup(argv[optind+1]); } else if (pa_streq(argv[optind], "set-sink-volume")) { - unsigned i; action = SET_SINK_VOLUME; if (argc < optind+3) { @@ -1824,16 +1843,10 @@ int main(int argc, char *argv[]) { sink_name = pa_xstrdup(argv[optind+1]); - volume.channels = argc-3; - - for (i = 0; i < volume.channels; i++) { - if (parse_volume(argv[optind+2+i], - &volume.values[i], &volume_flags) < 0) - goto quit; - } + if (parse_volumes(argv+optind+2, argc-3) < 0) + goto quit; } else if (pa_streq(argv[optind], "set-source-volume")) { - unsigned i; action = SET_SOURCE_VOLUME; if (argc < optind+3) { @@ -1843,15 +1856,10 @@ int main(int argc, char *argv[]) { source_name = pa_xstrdup(argv[optind+1]); - volume.channels = argc-3; - - for (i = 0; i < volume.channels; i++) { - if (parse_volume(argv[optind+2+i], &volume.values[i], &volume_flags) < 0) - goto quit; - } + if (parse_volumes(argv+optind+2, argc-3) < 0) + goto quit; } else if (pa_streq(argv[optind], "set-sink-input-volume")) { - unsigned i; action = SET_SINK_INPUT_VOLUME; if (argc < optind+3) { @@ -1864,15 +1872,10 @@ int main(int argc, char *argv[]) { goto quit; } - volume.channels = argc-3; - - for (i = 0; i < volume.channels; i++) { - if (parse_volume(argv[optind+2+i], &volume.values[i], &volume_flags) < 0) - goto quit; - } + if (parse_volumes(argv+optind+2, argc-3) < 0) + goto quit; } else if (pa_streq(argv[optind], "set-source-output-volume")) { - unsigned i; action = SET_SOURCE_OUTPUT_VOLUME; if (argc < optind+3) { @@ -1885,12 +1888,8 @@ int main(int argc, char *argv[]) { goto quit; } - volume.channels = argc-3; - - for (i = 0; i < volume.channels; i++) { - if (parse_volume(argv[optind+2+i], &volume.values[i], &volume_flags) < 0) - goto quit; - } + if (parse_volumes(argv+optind+2, argc-3) < 0) + goto quit; } else if (pa_streq(argv[optind], "set-sink-mute")) { action = SET_SINK_MUTE; -- 1.8.3.2