shithub: zuke

Download patch

ref: a7982edeb51aa586ed782996ef6aee52e6f1fba0
parent: 0c8b6da38ef0f1ac8d45d99e1b4f334091b9a252
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Feb 25 22:48:22 EST 2016

update

--- a/zuke.c
+++ b/zuke.c
@@ -250,6 +250,7 @@
 done:
 	if(pid < 0)
 		sendp(ch, nil);
+	chanclose(ch);
 	chanfree(ch);
 	if(pid >= 0)
 		postnote(PNGROUP, pid, "interrupt");
@@ -341,7 +342,7 @@
 restart:
 	if((fd = open(pl[player->pcur].path, OREAD)) < 0){
 		fprint(2, "%r\n");
-		nbsendul(player->ev, Everror);
+		sendul(player->ev, Everror);
 		goto freeplayer;
 	}
 
@@ -361,7 +362,7 @@
 
 	byteswritten = 0;
 	if(!noinit){
-		nbsendul(player->ev, Evready);
+		sendul(player->ev, Evready);
 		buf = malloc(Relbufsz);
 		io = ioproc();
 		for(c = 0, got = 0; got < Relbufsz; got += n){
@@ -375,7 +376,7 @@
 			c = recvul(player->ctl);
 		if(c != Cstart)
 			goto freeplayer;
-		write(audio, buf, got);
+		iowrite(io, audio, buf, got);
 		byteswritten = got;
 		bytesfrom = 0;
 		c = 0;
@@ -394,7 +395,8 @@
 		if(n < 1)
 			break;
 
-		if(player->img != nil && nbrecv(player->img, &thiscover) > 0){
+		thiscover = nil;
+		if(player->img != nil && nbrecv(player->img, &thiscover) != 0){
 			freeimage(cover);
 			cover = thiscover;
 			redraw(screen, 0);
@@ -401,7 +403,7 @@
 			player->img = nil;
 		}
 		c = nbrecvul(player->ctl);
-		if(c == Cstop)
+		if(c == Cstop || c == -1)
 			goto stop;
 		if(c == Ctoggle){
 			c = recvul(player->ctl);
@@ -417,7 +419,7 @@
 
 		c = 0;
 		if(bytesfrom <= byteswritten){
-			if(write(audio, buf, n) != n){
+			if(iowrite(io, audio, buf, n) != n){
 				fprint(2, "failed to write %d bytes: %r\n", n);
 				break;
 			}
@@ -435,6 +437,7 @@
 	if(n == 0){ /* seeking backwards or end of the song */
 		close(p[1]);
 		if(c != Cbackward){
+			playercurr = nil;
 			playercurr = newplayer((player->pcur+1) % plnum, 1);
 			start(playercurr);
 			goto stop;
@@ -446,11 +449,17 @@
 	if(player->img != nil)
 		freeimage(recvp(player->img));
 freeplayer:
+	if(player == playercurr)
+		playercurr = nil;
+	if(player == playernext)
+		playernext = nil;
+	chanclose(player->ctl);
+	chanclose(player->ev);
+	chanfree(player->ctl);
+	chanfree(player->ev);
 	close(p[1]);
 	closeioproc(io);
 	free(buf);
-	chanfree(player->ctl);
-	chanfree(player->ev);
 	free(player);
 	if(pid >= 0)
 		postnote(PNGROUP, pid, "interrupt");