shithub: pplay

Download patch

ref: 919472023aab7d2181a1e39d15af5e4457dde42f
parent: c8f028cd961e69e9af52b66175897ca5f26e3839
author: qwx <qwx@sciops.net>
date: Sat Apr 12 08:01:17 EDT 2025

draw: fix not redrawing samples when an rproc returns

refactor to ensure only one proc messes with the drawing

--- a/cmd.c
+++ b/cmd.c
@@ -157,7 +157,7 @@
 	dot.to = dot.from + cd.totalsz;
 	qunlock(&lsync);
 	reader = -1;
-	refresh(Drawall);
+	refresh(Rall);
 	threadexits(nil);
 }
 
--- a/dat.h
+++ b/dat.h
@@ -38,9 +38,13 @@
 extern QLock lsync;
 
 enum{
-	Drawcur = 1<<0,
-	Drawrender = 1<<1,
-	Drawall = (1<<2) - 1,
+	Rcur = 1<<0,
+	Rrender = 1<<1,
+	Rsamp = 1<<2,
+	Rview = 1<<3,
+	Rreset = 1<<4,
+	Rredraw = Rrender | Rsamp | Rreset,
+	Rall = 0x7fffffff,
 };
 
 extern int stereo, chan;
--- a/draw.c
+++ b/draw.c
@@ -213,12 +213,62 @@
 	statr.max.x = p.x;
 }
 
+static void
+resetdraw(void)
+{
+	Rectangle viewr;
+
+	viewr = rectsubpt(screen->r, screen->r.min);
+	statr = screen->r;
+	if(stereo){
+		statr.min.y += (Dy(screen->r) - font->height) / 2 + 1;
+		statr.max.y = statr.min.y + font->height;
+	}else
+		statr.min.y = screen->r.max.y - font->height;
+	freeimage(view);
+	view = eallocimage(viewr, 0, DNofill);
+	bgscalyl = (viewr.max.y - font->height) / (1 * (stereo ? 4 : 2));
+	bgscalyr = viewr.max.y - bgscalyl;
+	bgscalf = 32767. / bgscalyl;
+}
+
+static void
+resetview(int all)
+{
+	usize span;
+
+	lockdisplay(display);
+	T = (vlong)(ddot.totalsz / zoom / Dx(screen->r)) & ~3;
+	if(T < Sampsz)
+		T = Sampsz;
+	span = Dx(screen->r) * T;
+	viewmax = ddot.totalsz - span;
+	if(views > viewmax)
+		views = viewmax;
+	viewe = views + span;
+	if(all)
+		resetdraw();
+	unlockdisplay(display);
+}
+
 void
 paint(int what)
 {
+	Dot d;
+
 	ddot = dot;
+	if(what & Rreset)
+		resetview(1);
+	else if(what & Rview)
+		resetview(0);
 	lockdisplay(display);
-	if((what & Drawrender) != 0 || stalerender || working){
+	if(what & Rsamp){
+		d = ddot;
+		d.from = d.cur = views;
+		d.to = viewe;
+		nbsend(sampc, &d);
+	}
+	if(what & Rrender || stalerender || working){
 		if(!working)
 			stalerender = 0;
 		render();
@@ -304,65 +354,11 @@
 		*r++ = rmax;
 	}
 	working--;
-	refresh(Drawrender);
+	refresh(Rrender);
 	goto again;
 }
 
-static void
-resetdraw(void)
-{
-	Rectangle viewr;
-
-	viewr = rectsubpt(screen->r, screen->r.min);
-	statr = screen->r;
-	if(stereo){
-		statr.min.y += (Dy(screen->r) - font->height) / 2 + 1;
-		statr.max.y = statr.min.y + font->height;
-	}else
-		statr.min.y = screen->r.max.y - font->height;
-	freeimage(view);
-	view = eallocimage(viewr, 0, DNofill);
-	bgscalyl = (viewr.max.y - font->height) / (1 * (stereo ? 4 : 2));
-	bgscalyr = viewr.max.y - bgscalyl;
-	bgscalf = 32767. / bgscalyl;
-}
-
-static void
-resetview(int all)
-{
-	usize span;
-
-	lockdisplay(display);
-	T = (vlong)(ddot.totalsz / zoom / Dx(screen->r)) & ~3;
-	if(T < Sampsz)
-		T = Sampsz;
-	span = Dx(screen->r) * T;
-	viewmax = ddot.totalsz - span;
-	if(views > viewmax)
-		views = viewmax;
-	viewe = views + span;
-	if(all)
-		resetdraw();
-	unlockdisplay(display);
-}
-
 void
-redraw(int all)
-{
-	Dot d;
-
-	ddot = dot;
-	resetview(all);
-	if(paused)
-		refresh(Drawall);
-		
-	d = ddot;
-	d.from = d.cur = views;
-	d.to = viewe;
-	nbsend(sampc, &d);
-}
-
-void
 setzoom(int Δz, int x)
 {
 	double z, span, Δx;
@@ -384,7 +380,7 @@
 	span *= Dx(screen->r);
 	Δx = ((double)x / Dx(screen->r)) * span / T;
 	if(!setpan(Δx))
-		redraw(0);
+		refresh(Rview);
 }
 
 int
@@ -403,7 +399,7 @@
 	views = from;
 	viewe = to;
 	zoom = (double)ddot.totalsz / (to - from);
-	redraw(0);
+	refresh(Rview);
 	return 0;
 }
 
@@ -424,7 +420,7 @@
 	if(new == views)
 		return 0;
 	views = new;
-	redraw(0);
+	refresh(Rview);
 	return 1;
 }
 
@@ -449,7 +445,7 @@
 	ddot.off = -1;
 	dot = ddot;
 	stalerender = 1;
-	refresh(Drawrender);
+	refresh(Rrender);
 }
 
 int
@@ -463,7 +459,7 @@
 	ddot.off = ddot.cur = off;
 	dot = ddot;
 	stalerender = 1;
-	refresh(Drawrender);
+	refresh(Rrender);
 	return 0;
 }
 
@@ -509,7 +505,7 @@
 	if((drawc = chancreate(sizeof(int), 8)) == nil
 	|| (sampc = chancreate(sizeof(Dot), 2)) == nil)
 		sysfatal("chancreate: %r");
-	redraw(1);
 	if(proccreate(sampler, nil, mainstacksize) < 0)
 		sysfatal("proccreate: %r");
+	refresh(Rall);
 }
--- a/fns.h
+++ b/fns.h
@@ -24,7 +24,6 @@
 vlong	ss2view(int);
 vlong	view2ss(int);
 void	reset(int);
-void	redraw(int);
 void	paint(int);
 void	initdrw(int);
 void	advance(usize);
--- a/pplay.c
+++ b/pplay.c
@@ -86,7 +86,7 @@
 			}
 			memcpy(bp, b, n);
 			advance(n);
-			refresh(Drawcur);
+			refresh(Rcur);
 		}
 		if(write(afd, buf, sizeof buf) != sizeof buf){
 			fprint(2, "aproc write: %r\n");
@@ -194,7 +194,7 @@
 			if(getwindow(display, Refnone) < 0)
 				sysfatal("resize failed: %r");
 			unlockdisplay(display);
-			redraw(1);
+			refresh(Rreset);
 			break;
 		case Amouse:
 			m = mc->Mouse;
@@ -222,7 +222,7 @@
 			case '+': setzoom(1.0, mo.xy.x - screen->r.min.x); m.xy.x = mo.xy.x; break;
 			case '1': bound = Bstart; break;
 			case '2': bound = Bend; break;
-			case 'S': stereo ^= 1; redraw(1); break;
+			case 'S': stereo ^= 1; refresh(Rall); break;
 			case 'b': setjump(dot.from); break;
 			case 't': samptime ^= 1; break;
 			case 'z': zoominto(0, dot.totalsz); break;
@@ -233,14 +233,14 @@
 			case 'q': threadexitsall(nil);
 			default:
 				if((p = prompt(r)) == nil || strlen(p) == 0){
-					refresh(Drawrender);
+					refresh(Rrender);
 					break;
 				}
 				switch(cmd(p)){
 				case -1: fprint(2, "cmd \"%s\" failed: %r\n", p); break;
-				case 0: refresh(Drawall); break;
-				case 1: redraw(0); break;
-				case 2: redraw(1); break;
+				case 0: refresh(Rrender); break;
+				case 1: refresh(Rredraw); break;
+				case 2: refresh(Rall); break;
 				default: break;
 				}
 			}
--