shithub: pplay

Download patch

ref: 3af2b21e657b6013e7ed116831b591661c682813
parent: 7249d5febf377411ff6c1cf47ffaaa63954ca149
author: qwx <qwx@sciops.net>
date: Sun Dec 10 19:37:13 EST 2023

changes for actually supporting multitrack

--- a/cmd.c
+++ b/cmd.c
@@ -4,8 +4,8 @@
 #include "dat.h"
 #include "fns.h"
 
-usize ndots, ntracks;
-Dot *current, *dots;
+usize ntracks;
+Dot *current;
 Track *tracks;
 
 static int epfd[2];
@@ -241,6 +241,7 @@
 void
 quit(void)
 {
+	// FIXME: no, have yield/sleep/...
 	threadsetgrp(1);
 	threadkillgrp(0);
 	threadintgrp(0);
@@ -291,8 +292,8 @@
 	return x;
 }
 
-int
-advance(Dot *d, usize n)
+static void
+advanceone(Dot *d, usize n)
 {
 	usize m;
 
@@ -304,9 +305,17 @@
 		if(d->cur == d->to)
 			d->cur = d->from;
 	}
-	return 0;
 }
 
+void
+advance(usize n)
+{
+	Track *t;
+
+	for(t=tracks; t<tracks+ntracks; t++)
+		advanceone(t, n);
+}
+
 static void
 catch(void *, char *msg)
 {
@@ -315,18 +324,22 @@
 	noted(NDFLT);
 }
 
-int
-initcmd(int fd)
+void
+addtrack(char *path)
 {
-	Dot d;
+	int fd;
+	Track *t;
 
-	tracks = emalloc(++ntracks * sizeof *tracks);
-	d.t = tracks;
-	if(loadfile(fd, &d) == nil)
+	if((fd = path != nil ? open(path, OREAD) : 0) < 0)
+		sysfatal("open: %r");
+	tracks = erealloc(tracks, (ntracks+1) * sizeof *tracks, ntracks * sizeof *tracks);
+	t = tracks + ntracks++;
+	if(loadfile(fd, t) == nil)
 		sysfatal("initcmd: %r");
-	dots = emalloc(++ndots * sizeof *dots);
-	dots[0] = d;
-	current = dots;
-	*current = d;
-	return 0;
+	close(fd);
+	// FIXME
+	t->Dot.t = t;
+	if(current != nil)
+		return;
+	current = &t->Dot;
 }
--- a/dat.h
+++ b/dat.h
@@ -3,7 +3,18 @@
 typedef struct Buf Buf;
 typedef struct Track Track;
 typedef struct Seg Seg;
+typedef struct Punkt Punkt;
+typedef struct Rekt Rekt;
 
+struct Punkt{
+	int x;
+	int y;
+};
+struct Rekt{
+	Punkt min;
+	Punkt max;
+};
+
 enum{
 	Rate = 44100,
 	WriteRate = 25,
@@ -13,6 +24,11 @@
 	Chunksz = Sampsz * Rate,
 };
 #pragma incomplete Buf
+struct Seg{
+	Track *t;
+	usize from;
+	usize to;
+};
 struct Chunk{
 	Buf *b;
 	usize boff;
@@ -20,15 +36,6 @@
 	Chunk *left;
 	Chunk *right;
 };
-struct Track{
-	vlong len;
-	s16int *graph[2];
-};
-struct Seg{
-	Track *t;
-	usize from;
-	usize to;
-};
 struct Dot{
 	Seg;
 	usize cur;
@@ -36,8 +43,15 @@
 	usize totalsz;
 	Chunk *norris;
 };
-extern Dot *dots, *current;
-extern usize ndots, ntracks;
+struct Track{
+	Dot;
+	Rekt;
+	// FIXME: both for samples:
+	vlong len;
+	s16int *graph[2];
+};
+extern Dot *current;
+extern usize ntracks;
 extern Track *tracks;
 
 extern QLock lsync;
--- a/draw.c
+++ b/draw.c
@@ -5,6 +5,10 @@
 #include "dat.h"
 #include "fns.h"
 
+/* urgh */
+typedef Point Punkt;
+typedef Rectangle Rekt;
+
 QLock lsync;
 int debugdraw;
 
@@ -305,6 +309,22 @@
 	}
 }
 
+void
+resizetracks(void)
+{
+	int dy;
+	Track *t;
+	Rectangle r;
+
+	dy = screen->r.max.y / ntracks;
+	r = Rpt(screen->r.min, Pt(screen->r.max.x, dy));
+	for(t=tracks; t<tracks+ntracks; t++){
+		t->Rectangle = r;
+		r.min.y += dy;
+		r.max.y += dy;
+	}
+}
+
 static void
 resetdraw(void)
 {
@@ -322,6 +342,7 @@
 	bgscalyl = (viewr.max.y - font->height) / (stereo ? 4 : 2);
 	bgscalyr = viewr.max.y - bgscalyl;
 	bgscalf = 32767. / bgscalyl;
+	resizetracks();
 }
 
 void
--- a/fns.h
+++ b/fns.h
@@ -10,7 +10,8 @@
 Chunk*	loadfile(int, Dot*);
 void	quit(void);
 int	cmd(char*);
-int	initcmd(int);
+void	addtrack(char*);
+void	resizetracks(void);
 void	refresh(int);
 void	setzoom(int, int);
 int	zoominto(vlong, vlong);
@@ -23,7 +24,7 @@
 vlong	view2ss(int);
 void	redraw(int);
 void	initdrw(int);
-int	advance(Dot*, usize);
+void	advance(usize);
 Chunk*	p2c(usize, usize*, Dot*);
 int	setpos(usize);
 uchar*	getslice(Dot*, usize, usize*);
--- a/pplay.c
+++ b/pplay.c
@@ -62,7 +62,7 @@
 				goto again;
 			}
 			memcpy(bp, b, n);
-			advance(current, n);
+			advance(n);
 			refresh(Drawcur);
 		}
 		if(write(afd, buf, sizeof buf) != sizeof buf){
@@ -105,7 +105,6 @@
 void
 threadmain(int argc, char **argv)
 {
-	int fd;
 	char *p;
 	Mouse mo;
 	Rune r;
@@ -120,11 +119,11 @@
 	fmtinstall(L'Δ', Δfmt);
 	fmtinstall(L'χ', χfmt);
 	fmtinstall(L'τ', τfmt);
-	if((fd = *argv != nil ? open(*argv, OREAD) : 0) < 0)
-		sysfatal("open: %r");
-	if(initcmd(fd) < 0)
-		sysfatal("init: %r");
-	close(fd);
+	if(*argv != nil)
+		while(*argv != nil)
+			addtrack(*argv++);
+	else
+		addtrack(nil);
 	initdrw(notriob);
 	if((kc = initkeyboard(nil)) == nil)
 		sysfatal("initkeyboard: %r");