diff options
author | Kyle Evans <kevans@FreeBSD.org> | 2022-04-30 03:12:56 +0000 |
---|---|---|
committer | Kyle Evans <kevans@FreeBSD.org> | 2022-06-18 03:50:58 +0000 |
commit | 4014365e421991814703249d4748d6dcac6686b6 (patch) | |
tree | 39860d028dd177c5a355679b38de6c9d4c61075c /usr.sbin/mixer | |
parent | 11bd40d04af59daa7ae7feea0518081a35f07053 (diff) | |
download | src-4014365e421991814703249d4748d6dcac6686b6.tar.gz src-4014365e421991814703249d4748d6dcac6686b6.zip |
mixer: remove volume backwards compat, add % interpretation
The current situation is fairly confusing, where an integer is interpreted
as a percent until you slap a decimal on it and magically it becomes an
absolute value.
Let's have a flag day in 14.0 and remove this shim entirely. Setting with
percent can still be useful, so allow a trailing '%' to indicate as such.
As a side effect, we tighten down the format allowed in the volume a little
bit by ensuring there's no trailing garbage after the value once it's
separated into left and right components.
Reviewed by: christos, hselasky, pauamma_gundo.com (manpages)
Relnotes: yes
Differential Revision: https://reviews.freebsd.org/D35101
Diffstat (limited to 'usr.sbin/mixer')
-rw-r--r-- | usr.sbin/mixer/mixer.8 | 19 | ||||
-rw-r--r-- | usr.sbin/mixer/mixer.c | 23 |
2 files changed, 27 insertions, 15 deletions
diff --git a/usr.sbin/mixer/mixer.8 b/usr.sbin/mixer/mixer.8 index 284750538f7e..9a76cbe41f65 100644 --- a/usr.sbin/mixer/mixer.8 +++ b/usr.sbin/mixer/mixer.8 @@ -21,7 +21,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 20, 2022 +.Dd April 29, 2022 .Dt MIXER 8 .Os .Sh NAME @@ -112,8 +112,8 @@ with one of the available devices): .It Sy Name Ta Sy Value .It Ar dev Cm .volume Ta Xo .Ar vol | -.Oo Cm \&+ | Cm \&- Oc Ar lvol -.Oo Cm \&: Oo Cm \&+ | Cm \&- Oc Ar rvol Oc +.Oo Cm \&+ | Cm \&- Oc Ar lvol Oo % Oc +.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 .recsrc Ta Cm ^ | + | - | = @@ -128,16 +128,21 @@ The optional and/or .Ar rvol values have to be specified. -The values have to be normalized 32-bit floats, from 0.0 to 1.0 inclusively. -If no -.Ql \&. -character is present, the value is treated like a percentage, for backwards compatibility. +The values should typically be decimal numbers between 0 and 1 with at most 2 +digits after the decimal point. +A trailing percent sign indicates that the value should be treated as a +percentage of 1.0, rather than an absolute value. +Thus, 70% means the same as 0.7. If the left or right volume values are prefixed with .Cm + or .Cm - , the value following will be used as a relative adjustment, modifying the current settings by the amount specified. +Note that relative percentages are still relative to 1.0, not to the current +value. +If the volume is currently 0.40 and an adjustment of +20% is specified, then +thet final volume will be set to 0.60. .Pp Volume can also be set using the shorthand .Ar dev Ns Cm =value . diff --git a/usr.sbin/mixer/mixer.c b/usr.sbin/mixer/mixer.c index c0a9ec25c6fa..e216efe3313c 100644 --- a/usr.sbin/mixer/mixer.c +++ b/usr.sbin/mixer/mixer.c @@ -341,7 +341,7 @@ mod_volume(struct mix_dev *d, void *p) mix_ctl_t *cp; mix_volume_t v; const char *val; - char lstr[8], rstr[8]; + char *endp, lstr[8], rstr[8]; float lprev, rprev, lrel, rrel; int n; @@ -356,25 +356,32 @@ mod_volume(struct mix_dev *d, void *p) lrel = rrel = 0; if (n > 0) { if (*lstr == '+' || *lstr == '-') - lrel = rrel = 1; - v.left = strtof(lstr, NULL); + lrel = 1; + v.left = strtof(lstr, &endp); + if (*endp != '\0' && (*endp != '%' || *(endp + 1) != '\0')) { + warnx("invalid volume value: %s", lstr); + return (-1); + } - /* be backwards compatible */ - if (strstr(lstr, ".") == NULL) + if (*endp == '%') v.left /= 100.0f; } if (n > 1) { if (*rstr == '+' || *rstr == '-') rrel = 1; - v.right = strtof(rstr, NULL); + v.right = strtof(rstr, &endp); + if (*endp != '\0' && (*endp != '%' || *(endp + 1) != '\0')) { + warnx("invalid volume value: %s", rstr); + return (-1); + } - /* be backwards compatible */ - if (strstr(rstr, ".") == NULL) + if (*endp == '%') v.right /= 100.0f; } switch (n) { case 1: v.right = v.left; /* FALLTHROUGH */ + rrel = lrel; case 2: if (lrel) v.left += m->dev->vol.left; |