Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/mixer/mixer.c
Show First 20 Lines • Show All 335 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
mod_volume(struct mix_dev *d, void *p) | mod_volume(struct mix_dev *d, void *p) | ||||
{ | { | ||||
struct mixer *m; | struct mixer *m; | ||||
mix_ctl_t *cp; | mix_ctl_t *cp; | ||||
mix_volume_t v; | mix_volume_t v; | ||||
const char *val; | const char *val; | ||||
char lstr[8], rstr[8]; | char *endp, lstr[8], rstr[8]; | ||||
float lprev, rprev, lrel, rrel; | float lprev, rprev, lrel, rrel; | ||||
int n; | int n; | ||||
m = d->parent_mixer; | m = d->parent_mixer; | ||||
cp = mixer_get_ctl(m->dev, C_VOL); | cp = mixer_get_ctl(m->dev, C_VOL); | ||||
val = p; | val = p; | ||||
n = sscanf(val, "%7[^:]:%7s", lstr, rstr); | n = sscanf(val, "%7[^:]:%7s", lstr, rstr); | ||||
if (n == EOF) { | if (n == EOF) { | ||||
warnx("invalid volume value: %s", val); | warnx("invalid volume value: %s", val); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
lrel = rrel = 0; | lrel = rrel = 0; | ||||
if (n > 0) { | if (n > 0) { | ||||
if (*lstr == '+' || *lstr == '-') | if (*lstr == '+' || *lstr == '-') | ||||
lrel = rrel = 1; | lrel = rrel = 1; | ||||
kevans: It occurred to me that this is likely wrong, or that `rrel` needs to be reset later if `n > 1`. | |||||
v.left = strtof(lstr, NULL); | v.left = strtof(lstr, &endp); | ||||
if (*endp != '\0' && *endp != '%') { | |||||
warnx("invalid volume value: %s", lstr); | |||||
return (-1); | |||||
} | |||||
/* be backwards compatible */ | if (*endp == '%') | ||||
if (strstr(lstr, ".") == NULL) | |||||
v.left /= 100.0f; | v.left /= 100.0f; | ||||
} | } | ||||
if (n > 1) { | if (n > 1) { | ||||
if (*rstr == '+' || *rstr == '-') | if (*rstr == '+' || *rstr == '-') | ||||
rrel = 1; | rrel = 1; | ||||
v.right = strtof(rstr, NULL); | v.right = strtof(rstr, &endp); | ||||
if (*endp != '\0' && *endp != '%') { | |||||
warnx("invalid volume value: %s", rstr); | |||||
return (-1); | |||||
} | |||||
/* be backwards compatible */ | if (*endp == '%') | ||||
if (strstr(rstr, ".") == NULL) | |||||
v.right /= 100.0f; | v.right /= 100.0f; | ||||
} | } | ||||
switch (n) { | switch (n) { | ||||
case 1: | case 1: | ||||
v.right = v.left; /* FALLTHROUGH */ | v.right = v.left; /* FALLTHROUGH */ | ||||
case 2: | case 2: | ||||
if (lrel) | if (lrel) | ||||
v.left += m->dev->vol.left; | v.left += m->dev->vol.left; | ||||
▲ Show 20 Lines • Show All 133 Lines • Show Last 20 Lines |
It occurred to me that this is likely wrong, or that rrel needs to be reset later if n > 1. I suspect the right answer is that this should just set lrel = 1; and we should handle rrel = lrel down where we handle v.right = v.left (inside the switch)