Skip to content

Commit 180ecab

Browse files
committed
wpctl: set-volume: improve the code, treat percentage as pactl does
10% should be written as 10%, not as 0.1% and 0.7 + 10% in pactl translates to the volume becoming 0.8, not 0.77
1 parent d6241f7 commit 180ecab

File tree

1 file changed

+24
-27
lines changed

1 file changed

+24
-27
lines changed

src/tools/wpctl.c

+24-27
Original file line numberDiff line numberDiff line change
@@ -850,35 +850,37 @@ set_default_run (WpCtl * self)
850850
static gboolean
851851
set_volume_parse_positional (gint argc, gchar ** argv, GError **error)
852852
{
853+
g_autoptr (GRegex) regex = NULL;
854+
g_autoptr (GMatchInfo) info = NULL;
855+
853856
if (argc < 4) {
854857
g_set_error_literal (error, wpctl_error_domain_quark(), 0,
855858
"ID and VOL[%][-/+] are required");
856859
return FALSE;
857860
}
858861

859-
GRegex *regex = g_regex_new ("^(\\d*\\.?\\d*)(%?)([-+]?)$", 0, 0, NULL);
860-
GMatchInfo *info = NULL;
862+
regex = g_regex_new ("^(\\d*\\.?\\d*)(%?)([-+]?)$", 0, 0, NULL);
861863

862864
if (g_regex_match(regex, argv[3], 0, &info)) {
863-
cmdline.set_volume.volume = strtof(g_match_info_fetch(info, 1), NULL);
865+
gchar *str = g_match_info_fetch (info, 1);
866+
cmdline.set_volume.volume = strtof (str, NULL);
864867
cmdline.set_volume.type = 'a';
868+
g_free (str);
865869

866-
if (g_strcmp0(g_match_info_fetch(info, 2), "%") == 0) {
867-
cmdline.set_volume.type = 'p';
868-
}
870+
str = g_match_info_fetch (info, 2);
871+
if (g_strcmp0 (str, "%") == 0)
872+
cmdline.set_volume.volume /= 100;
873+
g_free (str);
869874

870-
if (g_strcmp0(g_match_info_fetch(info, 3), "-") == 0) {
875+
str = g_match_info_fetch (info, 3);
876+
if (g_strcmp0 (str, "-") == 0) {
871877
cmdline.set_volume.volume = -(cmdline.set_volume.volume);
872-
if (cmdline.set_volume.type != 'p') {
873-
cmdline.set_volume.type = 's';
874-
}
875-
} else if (g_strcmp0(g_match_info_fetch(info, 3), "+") == 0 && cmdline.set_volume.type != 'p') {
878+
cmdline.set_volume.type = 's';
879+
} else if (g_strcmp0 (str, "+") == 0) {
876880
cmdline.set_volume.type = 's';
877881
}
878-
g_match_info_free (info);
879-
g_regex_unref (regex);
882+
g_free (str);
880883
} else {
881-
g_regex_unref (regex);
882884
g_set_error (error, wpctl_error_domain_quark(), 0,
883885
"Invalid volume argument. See wpctl set-volume --help");
884886
return FALSE;
@@ -918,22 +920,17 @@ do_set_volume (WpCtl * self, WpPipewireObject *proxy)
918920
id = atoi (str);
919921
}
920922

921-
g_signal_emit_by_name (mixer_api, "get-volume", id, &variant);
922-
if (!variant) {
923-
fprintf (stderr, "Node %d does not support volume\n", id);
923+
if (cmdline.set_volume.type == 's') {
924+
g_signal_emit_by_name (mixer_api, "get-volume", id, &variant);
925+
if (!variant) {
926+
fprintf (stderr, "Node %d does not support volume\n", id);
927+
g_clear_pointer (&variant, g_variant_unref);
928+
return FALSE;
929+
}
930+
g_variant_lookup (variant, "volume", "d", &curr_volume);
924931
g_clear_pointer (&variant, g_variant_unref);
925-
return FALSE;
926-
}
927-
g_variant_lookup (variant, "volume", "d", &curr_volume);
928-
g_clear_pointer (&variant, g_variant_unref);
929932

930-
if (cmdline.set_volume.type == 'a') {
931-
cmdline.set_volume.volume = cmdline.set_volume.volume;
932-
} else if (cmdline.set_volume.type == 's') {
933933
cmdline.set_volume.volume = (cmdline.set_volume.volume + curr_volume);
934-
} else if (cmdline.set_volume.type == 'p') {
935-
gfloat delta = (cmdline.set_volume.volume) * (curr_volume);
936-
cmdline.set_volume.volume = (curr_volume + delta);
937934
}
938935
if (cmdline.set_volume.volume < 0) {
939936
cmdline.set_volume.volume = 0.0;

0 commit comments

Comments
 (0)