Index: sbin/devd/apple.conf =================================================================== --- sbin/devd/apple.conf +++ sbin/devd/apple.conf @@ -52,7 +52,7 @@ 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 @@ match "subsystem" "keys"; match "type" "volume"; match "notify" "up"; - action "mixer vol.volume=+10"; + action "mixer vol.volume=+10%"; }; # Eject key Index: sbin/devd/asus.conf =================================================================== --- sbin/devd/asus.conf +++ sbin/devd/asus.conf @@ -14,14 +14,14 @@ 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 @@ 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 Index: share/man/man4/acpi_ibm.4 =================================================================== --- share/man/man4/acpi_ibm.4 +++ share/man/man4/acpi_ibm.4 @@ -455,7 +455,7 @@ fi if [ $LEVEL -eq 1 ]; then sysctl dev.acpi_ibm.0.mic_led=0 - mixer rec.volume=30 + mixer rec.volume=30% fi ;; *) Index: usr.bin/fortune/datfiles/freebsd-tips =================================================================== --- usr.bin/fortune/datfiles/freebsd-tips +++ usr.bin/fortune/datfiles/freebsd-tips @@ -339,7 +339,7 @@ ``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 .volume='. To get a list of what +computer by typing 'mixer .volume=%'. To get a list of what you can adjust, just type 'mixer'. % You can automatically download and install binary packages by doing Index: usr.bin/usbhidaction/usbhidaction.1 =================================================================== --- usr.bin/usbhidaction/usbhidaction.1 +++ usr.bin/usbhidaction/usbhidaction.1 @@ -139,11 +139,11 @@ 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 @@ 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 , Index: usr.sbin/mixer/mixer.8 =================================================================== --- usr.sbin/mixer/mixer.8 +++ 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 @@ .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 @@ 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 . Index: usr.sbin/mixer/mixer.c =================================================================== --- usr.sbin/mixer/mixer.c +++ usr.sbin/mixer/mixer.c @@ -341,7 +341,7 @@ 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 @@ 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;