ref: a84f3ef5815f44ab6a610e8e174eb8ec0f03d6cc
parent: 4b7e72689dd10c604ad5c25f0d52ffc38ee8efa6
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Oct 28 10:59:46 EDT 2021
zuke: simplify volume control logic
--- a/sys/src/cmd/audio/zuke/zuke.c
+++ b/sys/src/cmd/audio/zuke/zuke.c
@@ -116,14 +116,17 @@
static int Coversz;
static char *
-matchvname(char *s)
+matchvname(char **s)
{
char *names[] = {"master", "pcm out"};
- int i;
+ int i, l;
for(i = 0; i < nelem(names); i++){
- if(strncmp(s, names[i], strlen(names[i])) == 0)
+ l = strlen(names[i]);
+ if(strncmp(*s, names[i], l) == 0){
+ *s += l;
return names[i];
+ }
}
return nil;
@@ -132,53 +135,39 @@
static void
chvolume(int d)
{
- int f, l, r, ol, or;
- char *s, *a[2], *n;
+ int f, x, ox, want, try;
+ char *s, *e;
Biobuf b;
+ char *n;
if((f = open("/dev/volume", ORDWR)) < 0)
return;
Binit(&b, f, OREAD);
- l = r = 0;
- for(; (s = Brdline(&b, '\n')) != nil;){
- memset(a, 0, sizeof(a));
- if((n = matchvname(s)) != nil && tokenize(s+strlen(n), a, 2) >= 1){
- if(a[1] == nil)
- a[1] = a[0];
- l = ol = atoi(a[0]);
- r = or = atoi(a[1]);
- if(d == 0)
+ want = x = -1;
+ ox = 0;
+ for(try = 0; try < 10; try++){
+ for(n = nil; (s = Brdline(&b, '\n')) != nil;){
+ if((n = matchvname(&s)) != nil && (ox = strtol(s, &e, 10)) >= 0 && s != e)
break;
- for(;;){
- l += d;
- r += d;
- fprint(f, "%s %d %d\n", n, l, r);
- Bseek(&b, 0, 0);
- for(; (s = Brdline(&b, '\n')) != nil;){
- memset(a, 0, sizeof(a));
- if((n = matchvname(s)) != nil && tokenize(s+strlen(n), a, 2) >= 1){
- if(a[1] == nil)
- a[1] = a[0];
- if(atoi(a[0]) == l && atoi(a[1]) == r)
- goto end;
- if(atoi(a[0]) != ol && atoi(a[1]) != or)
- goto end;
- if(l < 0 || r < 0 || l > 100 || r > 100)
- goto end;
- break;
- }
- }
- }
+ n = nil;
}
+
+ if(want < 0){
+ want = CLAMP(ox+d, 0, 100);
+ x = ox;
+ }
+ if(n == nil || (d > 0 && ox >= want) || (d < 0 && ox <= want))
+ break;
+ x = CLAMP(x+d, 0, 100);
+ if(fprint(f, "%s %d\n", n, x) < 0)
+ break;
+ /* go to eof and back */
+ while(Brdline(&b, '\n') != nil);
+ Bseek(&b, 0, 0);
}
-end:
- volume = (l+r)/2;
- if(volume > 100)
- volume = 100;
- else if(volume < 0)
- volume = 0;
+ volume = CLAMP(ox, 0, 100);
Bterm(&b);
close(f);