git: da3d4469ef84 - main - mixer(8): Add shorthand syntax for setting the volume.

From: Hans Petter Selasky <hselasky_at_FreeBSD.org>
Date: Sun, 20 Mar 2022 16:33:49 UTC
The branch main has been updated by hselasky:

URL: https://cgit.FreeBSD.org/src/commit/?id=da3d4469ef841be44ac4b346a6b51668d608ed49

commit da3d4469ef841be44ac4b346a6b51668d608ed49
Author:     Hans Petter Selasky <hselasky@FreeBSD.org>
AuthorDate: 2022-03-20 16:28:08 +0000
Commit:     Hans Petter Selasky <hselasky@FreeBSD.org>
CommitDate: 2022-03-20 16:32:46 +0000

    mixer(8): Add shorthand syntax for setting the volume.
    
    dev.volume=X[.X] can now also be written as dev=X[.X] .
    
    Requested by:           hselasky@ and bsduck (FreeBSD forums)
    Submitted by:           christos@
    Differential Revision:  https://reviews.freebsd.org/D34612
    Sponsored by:           NVIDIA Networking
---
 usr.sbin/mixer/mixer.c | 28 ++++++++++++++++++----------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c
index a6f48f85ae43..f3a8d9aaa92a 100644
--- a/usr.sbin/mixer/mixer.c
+++ b/usr.sbin/mixer/mixer.c
@@ -24,12 +24,15 @@
 
 #include <err.h>
 #include <errno.h>
+#include <mixer.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
-#include <mixer.h>
+#define C_VOL 0
+#define C_MUT 1
+#define C_SRC 2
 
 static void usage(void) __dead2;
 static void initctls(struct mixer *);
@@ -60,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;
@@ -85,7 +88,7 @@ main(int argc, char *argv[])
 		case 's':
 			sflag = 1;
 			break;
-		case 'h': /* FALLTROUGH */
+		case 'h': /* FALLTHROUGH */
 		case '?':
 		default:
 			usage();
@@ -130,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;
@@ -143,6 +146,15 @@ parse:
 			printdev(m, 1);
 			pall = 0;
 			goto next;
+		} else {
+			for (q = p; (*q >= '0' && *q <= '9') || *q == '.'; 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) {
@@ -187,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);
@@ -284,8 +293,7 @@ printrecsrc(struct mixer *m, int oflag)
 			printf("%s", dp->name);
 			if (oflag)
 				printf(".%s=+%s",
-				    mixer_get_ctl(dp, C_SRC)->name,
-				    n ? " " : "");
+				    mixer_get_ctl(dp, C_SRC)->name, n ? " " : "");
 		}
 	}
 	printf("\n");