code: plan9front

Download patch

ref: 8c6daa778a7a206b36569a9e01d38199b2b68229
parent: de62d32422e1fac45bc4834bc57cd9278b15bea9
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Tue Oct 26 11:08:35 EDT 2021

zuke: support other volume handles, update volume when /dev/audio is opened

--- a/sys/src/cmd/audio/zuke/zuke.c
+++ b/sys/src/cmd/audio/zuke/zuke.c
@@ -115,13 +115,83 @@
 static int Scrollheight;
 static int Coversz;
 
+static char *
+matchvname(char *s)
+{
+	char *names[] = {"master", "pcm out"};
+	int i;
+
+	for(i = 0; i < nelem(names); i++){
+		if(strncmp(s, names[i], strlen(names[i])) == 0)
+			return names[i];
+	}
+
+	return nil;
+}
+
 static void
+chvolume(int d)
+{
+	int f, l, r, ol, or;
+	char *s, *a[2], *n;
+	Biobuf b;
+
+	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]);
+			for(;;){
+				l += d;
+				r += d;
+				fprint(f, "%s %d %d\n", n, l, r);
+				Bseek(&b, 0, 0);
+				for(; (s = Brdline(&b, '\n')) != nil;){
+					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;
+					}
+				}
+			}
+		}
+	}
+
+end:
+	volume = (l+r)/2;
+	if(volume > 100)
+		volume = 100;
+	else if(volume < 0)
+		volume = 0;
+
+	Bterm(&b);
+	close(f);
+}
+
+static void
 audioon(void)
 {
 	lock(&audiolock);
-	if(audio < 0 && (audio = open("/dev/audio", OWRITE|OCEXEC)) < 0 && audioerr == 0){
-		fprint(2, "%r\n");
-		audioerr = 1;
+	if(audio < 0){
+		if((audio = open("/dev/audio", OWRITE|OCEXEC)) < 0 && audioerr == 0){
+			fprint(2, "%r\n");
+			audioerr = 1;
+		}else{
+			chvolume(0);
+		}
 	}
 	unlock(&audiolock);
 }
@@ -901,53 +971,6 @@
 		i = -1;
 		goto onemore;
 	}
-}
-
-static void
-chvolume(int d)
-{
-	int f, l, r, ol, or;
-	Biobuf b;
-	char *s, *a[4];
-
-	if((f = open("/dev/volume", ORDWR)) < 0)
-		return;
-	Binit(&b, f, OREAD);
-
-	l = r = 0;
-	for(; (s = Brdline(&b, '\n')) != nil;){
-		if(strncmp(s, "master", 6) == 0 && tokenize(s, a, 3) == 3){
-			l = ol = atoi(a[1]);
-			r = or = atoi(a[2]);
-			for(;;){
-				l += d;
-				r += d;
-				fprint(f, "master %d %d\n", l, r);
-				Bseek(&b, 0, 0);
-				for(; (s = Brdline(&b, '\n')) != nil;){
-					if(strncmp(s, "master", 6) == 0 && tokenize(s, a, 3) == 3){
-						if(atoi(a[1]) == l && atoi(a[2]) == r)
-							goto end;
-						if(atoi(a[1]) != ol && atoi(a[2]) != or)
-							goto end;
-						if(l < 0 || r < 0 || l > 100 || r > 100)
-							goto end;
-						break;
-					}
-				}
-			}
-		}
-	}
-
-end:
-	volume = (l+r)/2;
-	if(volume > 100)
-		volume = 100;
-	else if(volume < 0)
-		volume = 0;
-
-	Bterm(&b);
-	close(f);
 }
 
 static void