mixer

FreeBSD OSS mixer library implementation and a complete rewrite of mixer(8)
git clone git://git.margiolis.net/mixer.git
Log | Files | Refs | README | LICENSE

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:
Musr.sbin/mixer/mixer.c | 22++++++++++++++++------
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);