commit c6b4ee6293ac7e9e143de75010f8749190db604a
parent 8ed5dcfdaf4c6c5a697619fa3a77455ba4c93932
Author: Christos Margiolis <christos@margiolis.net>
Date: Sun, 20 Mar 2022 18:10:20 +0200
mixer(8): add shorthand syntax for setting the volume
Diffstat:
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c
@@ -30,6 +30,10 @@
#include <string.h>
#include <unistd.h>
+#define C_VOL 0
+#define C_MUT 1
+#define C_SRC 2
+
static void usage(void) __dead2;
static void initctls(struct mixer *);
static void printall(struct mixer *, int);
@@ -59,7 +63,7 @@ main(int argc, char *argv[])
struct mixer *m;
mix_ctl_t *cp;
char *name = NULL, buf[NAME_MAX];
- char *p, *bufp, *devstr, *ctlstr, *valstr = NULL;
+ char *p, *q, *devstr, *ctlstr, *valstr = NULL;
int dunit, i, n, pall = 1;
int aflag = 0, dflag = 0, oflag = 0, sflag = 0;
int ch;
@@ -129,10 +133,10 @@ main(int argc, char *argv[])
parse:
while (argc > 0) {
- if ((p = bufp = strdup(*argv)) == NULL)
+ if ((p = strdup(*argv)) == NULL)
err(1, "strdup(%s)", *argv);
/* Split the string into device, control and value. */
- devstr = strsep(&p, ".");
+ devstr = strsep(&p, ".=");
if ((m->dev = mixer_get_dev_byname(m, devstr)) == NULL) {
warnx("%s: no such device", devstr);
goto next;
@@ -142,6 +146,15 @@ parse:
printdev(m, 1);
pall = 0;
goto next;
+ } else {
+ for (q = p; *q >= '0' && *q <= '9'; q++)
+ ; /* nothing */
+ /* Input: `dev=N` -> shorthand for `dev.volume=N`. */
+ if (*q == '\0') {
+ cp = mixer_get_ctl(m->dev, C_VOL);
+ cp->mod(cp->parent_dev, p);
+ goto next;
+ }
}
ctlstr = strsep(&p, "=");
if ((cp = mixer_get_ctl_byname(m->dev, ctlstr)) == NULL) {
@@ -186,9 +199,6 @@ initctls(struct mixer *m)
struct mix_dev *dp;
int rc = 0;
-#define C_VOL 0
-#define C_MUT 1
-#define C_SRC 2
TAILQ_FOREACH(dp, &m->devs, devs) {
rc += mixer_add_ctl(dp, C_VOL, "volume", mod_volume, print_volume);
rc += mixer_add_ctl(dp, C_MUT, "mute", mod_mute, print_mute);