ref: d24b93d9572b1272e0649468789458358656c7d0
parent: 713f33ceb0403944112457ad0173032da9e71f39
author: Sigrid Haflínudóttir <[email protected]>
date: Tue Jun 9 08:24:03 EDT 2020
free /dev/audio when not needed
--- a/zuke.c
+++ b/zuke.c
@@ -49,7 +49,6 @@
static int volume;
static Player *playernext;
static Player *playercurr;
-static int audio;
static u64int byteswritten;
static int pcur, pcurplaying;
static int scroll, scrollsz;
@@ -411,6 +410,15 @@
return -1;
}
+static int
+openaudio(int audio)
+{
+ while(audio < 0 && (audio = open("/dev/audio", OWRITE)) < 0)
+ sleep(1000);
+
+ return audio;
+}
+
static void
playerthread(void *player_)
{
@@ -421,6 +429,7 @@
ulong c;
int p[2], fd, pid, n, got, noinit, trycoverload;
u64int bytesfrom, bf;
+ int audio;
threadsetname("player");
player = player_;
@@ -431,6 +440,7 @@
trycoverload = 1;
io = nil;
pid = -1;
+ audio = -1;
restart:
if((fd = open(getmeta(player->pcur)->path, OREAD)) < 0){
@@ -470,6 +480,7 @@
c = recvul(player->ctl);
if(c != Cstart)
goto freeplayer;
+ audio = openaudio(audio);
iowrite(io, audio, buf, got);
byteswritten = got;
bytesfrom = 0;
@@ -501,9 +512,12 @@
if(c == Cstop || c == -1)
goto stop;
if(c == Ctoggle){
+ close(audio);
+ audio = -1;
c = recvul(player->ctl);
if(c == Cstop)
goto stop;
+ audio = openaudio(audio);
}else if(c == Cforward){
bytesfrom = bf + Seekbytes;
}else if(c == Cforwardfast){
@@ -522,6 +536,7 @@
if(bytesfrom <= byteswritten){
if(bytesfrom == byteswritten)
bytesfrom = 0;
+ audio = openaudio(audio);
if(iowrite(io, audio, buf, n) != n){
fprint(2, "failed to write %d bytes: %r\n", n);
break;
@@ -549,6 +564,8 @@
}
stop:
+ if(audio >= 0)
+ close(audio);
if(player->img != nil)
freeimage(recvp(player->img));
freeplayer:
@@ -860,10 +877,6 @@
usage();
break;
}ARGEND;
-
- audio = open("/dev/audio", OWRITE);
- if(audio < 0)
- sysfatal("audio: %r");
readplist();
if(plnum < 1){