Re: 4014365e4219 - main - mixer: remove volume backwards compat, add % interpretation
- In reply to: Ravi Pokala : "Re: 4014365e4219 - main - mixer: remove volume backwards compat, add % interpretation"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 18 Jun 2022 21:07:41 UTC
On Sat, Jun 18, 2022 at 1:26 PM Ravi Pokala <rpokala@freebsd.org> wrote:
>
> H Kyle,
>
> | +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.
>
> What you're describing are *absolute* percentages, not relative. Please reword accordingly.
>
Recommendations welcome... it's a relative adjustment by an absolute
percentage. The first "relative percentage" occurrence is because one
is doing, e.g., +10% or -10%, so it seems more intuitive for that
instance to be qualified as 'relative' (because the end result is a
10% increase, not 10%).
> Also, "thet" => ("the" || "that").
>
Whoops.
> Thanks,
>
> Ravi (rpokala@)
>
> -----Original Message-----
> From: <owner-src-committers@freebsd.org> on behalf of Kyle Evans <kevans@FreeBSD.org>
> Date: 2022-06-17, Friday at 20:53
> To: <src-committers@FreeBSD.org>, <dev-commits-src-all@FreeBSD.org>, <dev-commits-src-main@FreeBSD.org>
> Subject: git: 4014365e4219 - main - mixer: remove volume backwards compat, add % interpretation
>
> The branch main has been updated by kevans:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=4014365e421991814703249d4748d6dcac6686b6
>
> commit 4014365e421991814703249d4748d6dcac6686b6
> Author: Kyle Evans <kevans@FreeBSD.org>
> AuthorDate: 2022-04-30 03:12:56 +0000
> Commit: Kyle Evans <kevans@FreeBSD.org>
> CommitDate: 2022-06-18 03:50:58 +0000
>
> 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
> ---
> sbin/devd/apple.conf | 4 ++--
> sbin/devd/asus.conf | 8 ++++----
> share/man/man4/acpi_ibm.4 | 2 +-
> usr.bin/fortune/datfiles/freebsd-tips | 2 +-
> usr.bin/usbhidaction/usbhidaction.1 | 14 +++++++-------
> usr.sbin/mixer/mixer.8 | 19 ++++++++++++-------
> usr.sbin/mixer/mixer.c | 23 +++++++++++++++--------
> 7 files changed, 42 insertions(+), 30 deletions(-)
>
> diff --git a/sbin/devd/apple.conf b/sbin/devd/apple.conf
> index 0729a9c86e7a..0a9143f7b5a5 100644
> --- a/sbin/devd/apple.conf
> +++ b/sbin/devd/apple.conf
> @@ -52,7 +52,7 @@ notify 0 {
> match "subsystem" "keys";
> match "type" "volume";
> match "notify" "down";
> - action "mixer vol.volume=-10";
> + action "mixer vol.volume=-10%";
> };
>
> notify 0 {
> @@ -60,7 +60,7 @@ notify 0 {
> match "subsystem" "keys";
> match "type" "volume";
> match "notify" "up";
> - action "mixer vol.volume=+10";
> + action "mixer vol.volume=+10%";
> };
>
> # Eject key
> diff --git a/sbin/devd/asus.conf b/sbin/devd/asus.conf
> index eed369f6ca4d..0074e7a7c55f 100644
> --- a/sbin/devd/asus.conf
> +++ b/sbin/devd/asus.conf
> @@ -14,14 +14,14 @@ notify 0 {
> match "system" "ACPI";
> match "subsystem" "ASUS";
> match "notify" "0x31";
> - action "mixer vol.volume=-10";
> + action "mixer vol.volume=-10%";
> };
>
> notify 0 {
> match "system" "ACPI";
> match "subsystem" "ASUS";
> match "notify" "0x30";
> - action "mixer vol.volume=+10";
> + action "mixer vol.volume=+10%";
> };
>
> # The next blocks enable volume hotkeys that can be found on the Asus EeePC
> @@ -36,14 +36,14 @@ notify 0 {
> match "system" "ACPI";
> match "subsystem" "ASUS-Eee";
> match "notify" "0x14";
> - action "mixer vol.volume=-10";
> + action "mixer vol.volume=-10%";
> };
>
> notify 0 {
> match "system" "ACPI";
> match "subsystem" "ASUS-Eee";
> match "notify" "0x15";
> - action "mixer vol.volume=+10";
> + action "mixer vol.volume=+10%";
> };
>
> # Enable user hotkeys that can be found on the Asus EeePC
> diff --git a/share/man/man4/acpi_ibm.4 b/share/man/man4/acpi_ibm.4
> index 290c7d3b29c1..434a1a7cba2c 100644
> --- a/share/man/man4/acpi_ibm.4
> +++ b/share/man/man4/acpi_ibm.4
> @@ -455,7 +455,7 @@ case ${NOTIFY} in
> fi
> if [ $LEVEL -eq 1 ]; then
> sysctl dev.acpi_ibm.0.mic_led=0
> - mixer rec.volume=30
> + mixer rec.volume=30%
> fi
> ;;
> *)
> diff --git a/usr.bin/fortune/datfiles/freebsd-tips b/usr.bin/fortune/datfiles/freebsd-tips
> index e8fa84e02489..930110a0c3fe 100644
> --- a/usr.bin/fortune/datfiles/freebsd-tips
> +++ b/usr.bin/fortune/datfiles/freebsd-tips
> @@ -339,7 +339,7 @@ If you have sudo(8) installed and permissions to use it, type
> ``<ESC>w ! sudo tee %'' to force a write.
> %
> You can adjust the volume of various parts of the sound system in your
> -computer by typing 'mixer <type>.volume=<volume>'. To get a list of what
> +computer by typing 'mixer <type>.volume=<volume>%'. To get a list of what
> you can adjust, just type 'mixer'.
> %
> You can automatically download and install binary packages by doing
> diff --git a/usr.bin/usbhidaction/usbhidaction.1 b/usr.bin/usbhidaction/usbhidaction.1
> index f50af8fff1ad..54d114925714 100644
> --- a/usr.bin/usbhidaction/usbhidaction.1
> +++ b/usr.bin/usbhidaction/usbhidaction.1
> @@ -139,11 +139,11 @@ The following configuration file can be used to control a pair
> of Philips USB speakers with the HID controls on the speakers.
> .Bd -literal -offset indent
> # Configuration for various Philips USB speakers
> -Consumer:Volume_Increment 1 0 mixer -f $1 vol.volume=+1
> -Consumer:Volume_Decrement 1 0 mixer -f $1 vol.volume=-1
> +Consumer:Volume_Increment 1 0 mixer -f $1 vol.volume=+1%
> +Consumer:Volume_Decrement 1 0 mixer -f $1 vol.volume=-1%
> Consumer:Mute 1 0 mixer -f $1 vol.mute=^
> -Consumer:Channel_Top.Microsoft:Base_Up 1 0 mixer -f $1 bass.volume=+1
> -Consumer:Channel_Top.Microsoft:Base_Down 1 0 mixer -f $1 bass.volume=-1
> +Consumer:Channel_Top.Microsoft:Base_Up 1 0 mixer -f $1 bass.volume=+1%
> +Consumer:Channel_Top.Microsoft:Base_Down 1 0 mixer -f $1 bass.volume=-1%
> .Ed
> .Pp
> A sample invocation using this configuration would be
> @@ -153,9 +153,9 @@ A sample invocation using this configuration would be
> The following example controls the mixer volume using a Logitech Wingman.
> Notice the debounce of 1 for buttons and 5 for the slider.
> .Bd -literal -offset indent
> -Button:Button_1 1 1 mixer vol.volume=+10
> -Button:Button_2 1 1 mixer vol.volume=-10
> -Generic_Desktop:Z * 5 mixer vol.volume=`echo $V | awk '{print int($$1/255*100)}'`
> +Button:Button_1 1 1 mixer vol.volume=+10%
> +Button:Button_2 1 1 mixer vol.volume=-10%
> +Generic_Desktop:Z * 5 mixer vol.volume=`echo $V | awk '{printf("%.02f", $$1/255)}'`
> .Ed
> .Sh SEE ALSO
> .Xr usbhidctl 1 ,
> 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;
>
>