code: plan9front

Download patch

ref: 892008af7ca37124d61f3833f800675f6aa77f6b
parent: ccb06791e3ddde584127de0e4aa3ad1c0ea4ae14
author: qwx <qwx@sciops.net>
date: Sat Sep 17 23:55:33 EDT 2022

games/dmid: don't buffer output

fixes streaming, doesn't really affect performance elsewhere

--- a/sys/src/games/dmid.c
+++ b/sys/src/games/dmid.c
@@ -85,8 +85,7 @@
 double freq[128];
 int mfmt, ntrk, div = 1, tempo, opl2, stream;
 uvlong T;
-Channel *echan;
-Biobuf *ib, *ob;
+Biobuf *ib;
 
 void *
 emalloc(ulong n)
@@ -174,7 +173,7 @@
 	*p++ = v;
 	*p++ = dt;
 	*p++ = dt >> 8;
-	Bwrite(ob, u, p-u);
+	write(1, u, p-u);
 }
 
 void
@@ -440,7 +439,7 @@
 void
 tproc(void *)
 {
-	vlong t, Δt;
+	uvlong t, Δt;
 	uchar u[4];
 	Trk x;
 
@@ -447,11 +446,6 @@
 	x.e = u + sizeof u;
 	t = nsec();
 	for(;;){
-		if(nbrecv(echan, u) > 0){
-			u[0] = 0;
-			x.p = u;
-			ev(&x);
-		}
 		putcmd(0, 0, 1);
 		t += 10000000 / (Rate / 100);
 		Δt = (t - nsec()) / 1000000;
@@ -541,7 +535,7 @@
 	uchar u[4];
 	Chan *c;
 	Opl *o;
-	Trk *x, *minx;
+	Trk xs, *x, *minx;
 
 	i = "/mnt/wad/genmidi";
 	ARGBEGIN{
@@ -552,7 +546,6 @@
 	}ARGEND
 	readinst(i);
 	readmid(*argv);
-	ob = bfdopen(1, OWRITE);
 	f = pow(2, 1./12);
 	for(n=0; n<nelem(freq); n++)
 		freq[n] = 440 * pow(f, n - 69);
@@ -570,12 +563,14 @@
 	if(stream){
 		if(proccreate(tproc, nil, mainstacksize) < 0)
 			sysfatal("proccreate: %r");
-		if((echan = chancreate(sizeof u, 0)) == nil)
-			sysfatal("chancreate: %r");
+		xs.p = u;
+		xs.e = u + sizeof u;
 		for(;;){
 			if((n = Bread(ib, u, sizeof u)) != sizeof u)
 				break;
-			send(echan, u);
+			u[0] = 0;
+			xs.p = u;
+			ev(&xs);
 		}
 		threadexitsall(n < 0 ? "read: %r" : nil);
 	}