From cc7479d7dc9b895c0a2f4d3805315437e03d0cf6 Mon Sep 17 00:00:00 2001 From: Christos Margiolis Date: Mon, 12 Feb 2024 12:59:22 +0200 Subject: [PATCH] mixer(8): Improve mute and recsrc controls The input options of "dev.mute" (+, -, ^) and "dev.recsrc" (+, -, ^, =) are quite cryptic. Allow the input to also be an actual description of what these options do. + -> add (recsrc) - -> remove (recsrc) ^ -> toggle (recsrc, mute) = -> set (recsrc) 0 -> off (mute) 1 -> on (mute) Also, deprecate the use of the symbol options in the EXAMPLES section of the man page, by using the new descriptive options. In the future, we might want to get rid of the symbol options altogether, but preserve backwards compatibility for now. Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Reviewed by: dev_submerge.ch, imp Differential Revision: https://reviews.freebsd.org/D43796 --- usr.sbin/mixer/mixer.8 | 33 +++++++++++++++------------ usr.sbin/mixer/mixer.c | 52 +++++++++++++++++++----------------------- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/usr.sbin/mixer/mixer.8 b/usr.sbin/mixer/mixer.8 index db0ec5f23a0c..75c6a81e3a55 100644 --- a/usr.sbin/mixer/mixer.8 +++ b/usr.sbin/mixer/mixer.8 @@ -114,7 +114,9 @@ with one of the available devices): .Oo Cm \&: Oo Cm \&+ | Cm \&- Oc Ar rvol Oo % Oc Oc .Xc .It Ar dev Cm .mute Ta Cm 0 | 1 | ^ +.It Ar dev Cm .mute Ta Cm off | on | toggle .It Ar dev Cm .recsrc Ta Cm ^ | + | - | = +.It Ar dev Cm .recsrc Ta Cm toggle | add | remove | set .El .Sm on .Pp @@ -150,14 +152,14 @@ The .Ar dev Ns Cm .mute control (un)mutes a device. The following values are available: -.Bl -tag -width = -offset indent -.It Cm 0 +.Bl -tag -width "xxxxxxxxxx" -offset indent +.It Cm 0 | off unmutes .Ar dev -.It Cm 1 +.It Cm 1 | on mutes .Ar dev -.It Cm ^ +.It Cm ^ | toggle toggles the mute of .Ar dev .El @@ -174,22 +176,23 @@ To modify the recording source you can use one of the following modifiers on a .Sy rec device: -.Bl -tag -width = -offset indent -.It Cm ^ +.Bl -tag -width "xxxxxxxxxx" -offset indent +.It Cm ^ | toggle toggles .Ar dev of possible recording devices -.It Cm + +.It Cm + | add adds .Ar dev to possible recording devices -.It Cm - +.It Cm - | remove removes .Ar dev from possible recording devices -.It Cm = -sets the recording device to +.It Cm = | set +makes .Ar dev +the only recording device. .El .Sh FILES .Bl -tag -width /dev/mixerN -compact @@ -250,16 +253,16 @@ $ mixer mic.volume=+0.10:-0.05 Toggle the mute for .Cm vol : .Bd -literal -offset indent -$ mixer vol.mute=^ +$ mixer vol.mute=toggle .Ed .Pp -Set +Add .Cm mic -and toggle +and remove .Cm line -recording sources: +from the recording devices: .Bd -literal -offset indent -$ mixer mic.recsrc=+ line.recsrc=^ +$ mixer mic.recsrc=add line.recsrc=remove .Ed .Pp Dump diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c index 0c0c37ccb2bc..83e97df19116 100644 --- a/usr.sbin/mixer/mixer.c +++ b/usr.sbin/mixer/mixer.c @@ -413,26 +413,24 @@ mod_mute(struct mix_dev *d, void *p) m = d->parent_mixer; cp = mixer_get_ctl(m->dev, C_MUT); val = p; - switch (*val) { - case '0': + if (strncmp(val, "off", strlen(val)) == 0 || *val == '0') opt = MIX_UNMUTE; - break; - case '1': + else if (strncmp(val, "on", strlen(val)) == 0 || *val == '1') opt = MIX_MUTE; - break; - case '^': + else if (strncmp(val, "toggle", strlen(val)) == 0 || *val == '^') opt = MIX_TOGGLEMUTE; - break; - default: - warnx("%c: no such modifier", *val); + else { + warnx("%s: no such modifier", val); return (-1); } n = MIX_ISMUTE(m, m->dev->devno); if (mixer_set_mute(m, opt) < 0) - warn("%s.%s=%c", m->dev->name, cp->name, *val); + warn("%s.%s=%s", m->dev->name, cp->name, val); else - printf("%s.%s: %d -> %d\n", - m->dev->name, cp->name, n, MIX_ISMUTE(m, m->dev->devno)); + printf("%s.%s: %s -> %s\n", + m->dev->name, cp->name, + n ? "on" : "off", + MIX_ISMUTE(m, m->dev->devno) ? "on" : "off"); return (0); } @@ -448,29 +446,26 @@ mod_recsrc(struct mix_dev *d, void *p) m = d->parent_mixer; cp = mixer_get_ctl(m->dev, C_SRC); val = p; - switch (*val) { - case '+': + if (strncmp(val, "add", strlen(val)) == 0 || *val == '+') opt = MIX_ADDRECSRC; - break; - case '-': + else if (strncmp(val, "remove", strlen(val)) == 0 || *val == '-') opt = MIX_REMOVERECSRC; - break; - case '=': + else if (strncmp(val, "set", strlen(val)) == 0 || *val == '=') opt = MIX_SETRECSRC; - break; - case '^': + else if (strncmp(val, "toggle", strlen(val)) == 0 || *val == '^') opt = MIX_TOGGLERECSRC; - break; - default: - warnx("%c: no such modifier", *val); + else { + warnx("%s: no such modifier", val); return (-1); } n = MIX_ISRECSRC(m, m->dev->devno); if (mixer_mod_recsrc(m, opt) < 0) - warn("%s.%s=%c", m->dev->name, cp->name, *val); + warn("%s.%s=%s", m->dev->name, cp->name, val); else - printf("%s.%s: %d -> %d\n", - m->dev->name, cp->name, n, MIX_ISRECSRC(m, m->dev->devno)); + printf("%s.%s: %s -> %s\n", + m->dev->name, cp->name, + n ? "add" : "remove", + MIX_ISRECSRC(m, m->dev->devno) ? "add" : "remove"); return (0); } @@ -493,7 +488,8 @@ print_mute(struct mix_dev *d, void *p) struct mixer *m = d->parent_mixer; const char *ctl_name = p; - printf("%s.%s=%d\n", m->dev->name, ctl_name, MIX_ISMUTE(m, m->dev->devno)); + printf("%s.%s=%s\n", m->dev->name, ctl_name, + MIX_ISMUTE(m, m->dev->devno) ? "on" : "off"); return (0); } @@ -506,7 +502,7 @@ print_recsrc(struct mix_dev *d, void *p) if (!MIX_ISRECSRC(m, m->dev->devno)) return (-1); - printf("%s.%s=+\n", m->dev->name, ctl_name); + printf("%s.%s=add\n", m->dev->name, ctl_name); return (0); }