ref: 5dba948712bce034bdedb8b14afcc47293e94ebc
parent: 41c959afd6f41c8151c57685fabe7e148f9e2e88
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jan 3 17:06:33 EST 2023
audio/mixfs: implement flush
--- a/sys/src/cmd/audio/mixfs/mixfs.c
+++ b/sys/src/cmd/audio/mixfs/mixfs.c
@@ -16,6 +16,7 @@
{
int used;
int mode;
+ int flush;
int run;
ulong rp;
ulong wp;
@@ -66,6 +67,7 @@
if(s->used == 0 && s->run == 0){
s->used = 1;
s->mode = r->ifcall.mode;
+ s->flush = 0;
qunlock(s);
r->fid->aux = s;
@@ -78,6 +80,23 @@
}
void
+fsflush(Req *r)
+{
+ Fid *f = r->oldreq->fid;
+ Stream *s;
+
+ if(f->file != nil && strcmp(f->file->name, "audio") == 0 && (s = f->aux) != nil){
+ qlock(s);
+ if(s->used && s->run){
+ s->flush = 1;
+ rwakeup(s);
+ }
+ qunlock(s);
+ }
+ respond(r, nil);
+}
+
+void
fsclunk(Fid *f)
{
Stream *s;
@@ -203,6 +222,8 @@
}
m = (long)(mixrp - s->rp);
if(m <= 0){
+ if(s->flush)
+ break;
s->run = 1;
rsleep(s);
continue;
@@ -225,6 +246,7 @@
n -= m;
}
+ s->flush = 0;
qunlock(s);
respond(r, nil);
srvacquire(srv);
@@ -255,6 +277,8 @@
m = NBUF-1 - (long)(s->wp - mixrp);
if(m <= 0){
+ if(s->flush)
+ break;
s->run = 1;
rsleep(s);
continue;
@@ -274,10 +298,11 @@
n -= m;
}
- if((long)(s->wp - mixrp) >= NDELAY){
+ if((long)(s->wp - mixrp) >= NDELAY && !s->flush){
s->run = 1;
rsleep(s);
}
+ s->flush = 0;
qunlock(s);
respond(r, nil);
srvacquire(srv);
@@ -329,6 +354,7 @@
.write= fswrite,
.stat= fsstat,
.destroyfid= fsclunk,
+ .flush= fsflush,
.start= fsstart,
.end= fsend,
};