summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>2021-08-21 22:51:11 +0000
committerSigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>2021-08-21 22:51:11 +0000
commit82c7251dc3ff57ae97c0ce24b72e2e2ae5f6945b (patch)
tree0bc0e4e98ea71fa8a06614e0d2db245d486cb66c
parent8c796bf8b9c10a0845717c47af908e47dfe14482 (diff)
downloadplan9front-82c7251dc3ff57ae97c0ce24b72e2e2ae5f6945b.tar.xz
mixfs: add reading (audio loopback)
-rw-r--r--sys/src/cmd/audio/mixfs/mixfs.c59
1 files changed, 57 insertions, 2 deletions
diff --git a/sys/src/cmd/audio/mixfs/mixfs.c b/sys/src/cmd/audio/mixfs/mixfs.c
index 15a082e24..de6f4a557 100644
--- a/sys/src/cmd/audio/mixfs/mixfs.c
+++ b/sys/src/cmd/audio/mixfs/mixfs.c
@@ -16,6 +16,7 @@ struct Stream
{
int used;
int run;
+ int rd;
ulong wp;
QLock;
Rendez;
@@ -23,6 +24,7 @@ struct Stream
ulong mixrp;
int mixbuf[NBUF][NCHAN];
+int lbbuf[NBUF][NCHAN];
Lock mixlock;
Stream streams[16];
@@ -61,6 +63,7 @@ fsopen(Req *r)
s->used = 1;
qunlock(s);
+ s->rd = (r->ifcall.mode&OWRITE) == 0;
r->fid->aux = s;
respond(r, nil);
return;
@@ -144,6 +147,7 @@ audioproc(void *)
for(i=0; i<m; i++){
for(j=0; j<NCHAN; j++){
v = clip16(mixbuf[mixrp % NBUF][j]);
+ lbbuf[mixrp % NBUF][j] = v;
mixbuf[mixrp % NBUF][j] = 0;
*p++ = v & 0xFF;
*p++ = v >> 8;
@@ -155,6 +159,56 @@ audioproc(void *)
}
void
+fsread(Req *r)
+{
+ Srv *srv;
+ int i, j, n, m, v;
+ Stream *s;
+ uchar *p;
+
+ p = (uchar*)r->ofcall.data;
+ n = r->ifcall.count;
+ n &= ~(NCHAN*2 - 1);
+ r->ofcall.count = n;
+ n /= (NCHAN*2);
+
+ srv = r->srv;
+ srvrelease(srv);
+ s = r->fid->aux;
+ qlock(s);
+ while(n > 0){
+ if(s->run == 0){
+ s->wp = mixrp;
+ s->run = 1;
+ }
+ m = NBUF-1 - (long)(s->wp - mixrp);
+ if(m <= 0){
+ s->run = 1;
+ rsleep(s);
+ continue;
+ }
+ if(m > n)
+ m = n;
+
+ lock(&mixlock);
+ for(i=0; i<m; i++){
+ for(j=0; j<NCHAN; j++){
+ v = lbbuf[s->wp % NBUF][j];
+ *p++ = v & 0xFF;
+ *p++ = v >> 8;
+ }
+ s->wp++;
+ }
+ unlock(&mixlock);
+
+ n -= m;
+ }
+ qunlock(s);
+ respond(r, nil);
+ srvacquire(srv);
+}
+
+void
fswrite(Req *r)
{
Srv *srv;
@@ -234,7 +288,7 @@ fsstart(Srv *)
Stream *s;
for(s=streams; s < streams+nelem(streams); s++){
- s->used = s->run = 0;
+ s->used = s->run = s->rd = 0;
s->Rendez.l = &s->QLock;
}
proccreate(audioproc, nil, 16*1024);
@@ -248,6 +302,7 @@ fsend(Srv *)
Srv fs = {
.open= fsopen,
+ .read= fsread,
.write= fswrite,
.stat= fsstat,
.destroyfid= fsclunk,
@@ -286,7 +341,7 @@ threadmain(int argc, char **argv)
usage();
fs.tree = alloctree(nil, nil, DMDIR|0777, nil);
- createfile(fs.tree->root, "audio", nil, 0222, nil);
+ createfile(fs.tree->root, "audio", nil, 0666, nil);
threadpostmountsrv(&fs, srv, mtpt, MREPL);
mtpt = smprint("%s/audio", mtpt);