mixfs: add reading (audio loopback)
This commit is contained in:
parent
8c796bf8b9
commit
82c7251dc3
1 changed files with 57 additions and 2 deletions
|
@ -16,6 +16,7 @@ struct Stream
|
||||||
{
|
{
|
||||||
int used;
|
int used;
|
||||||
int run;
|
int run;
|
||||||
|
int rd;
|
||||||
ulong wp;
|
ulong wp;
|
||||||
QLock;
|
QLock;
|
||||||
Rendez;
|
Rendez;
|
||||||
|
@ -23,6 +24,7 @@ struct Stream
|
||||||
|
|
||||||
ulong mixrp;
|
ulong mixrp;
|
||||||
int mixbuf[NBUF][NCHAN];
|
int mixbuf[NBUF][NCHAN];
|
||||||
|
int lbbuf[NBUF][NCHAN];
|
||||||
Lock mixlock;
|
Lock mixlock;
|
||||||
Stream streams[16];
|
Stream streams[16];
|
||||||
|
|
||||||
|
@ -61,6 +63,7 @@ fsopen(Req *r)
|
||||||
s->used = 1;
|
s->used = 1;
|
||||||
qunlock(s);
|
qunlock(s);
|
||||||
|
|
||||||
|
s->rd = (r->ifcall.mode&OWRITE) == 0;
|
||||||
r->fid->aux = s;
|
r->fid->aux = s;
|
||||||
respond(r, nil);
|
respond(r, nil);
|
||||||
return;
|
return;
|
||||||
|
@ -144,6 +147,7 @@ audioproc(void *)
|
||||||
for(i=0; i<m; i++){
|
for(i=0; i<m; i++){
|
||||||
for(j=0; j<NCHAN; j++){
|
for(j=0; j<NCHAN; j++){
|
||||||
v = clip16(mixbuf[mixrp % NBUF][j]);
|
v = clip16(mixbuf[mixrp % NBUF][j]);
|
||||||
|
lbbuf[mixrp % NBUF][j] = v;
|
||||||
mixbuf[mixrp % NBUF][j] = 0;
|
mixbuf[mixrp % NBUF][j] = 0;
|
||||||
*p++ = v & 0xFF;
|
*p++ = v & 0xFF;
|
||||||
*p++ = v >> 8;
|
*p++ = v >> 8;
|
||||||
|
@ -154,6 +158,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
|
void
|
||||||
fswrite(Req *r)
|
fswrite(Req *r)
|
||||||
{
|
{
|
||||||
|
@ -234,7 +288,7 @@ fsstart(Srv *)
|
||||||
Stream *s;
|
Stream *s;
|
||||||
|
|
||||||
for(s=streams; s < streams+nelem(streams); 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;
|
s->Rendez.l = &s->QLock;
|
||||||
}
|
}
|
||||||
proccreate(audioproc, nil, 16*1024);
|
proccreate(audioproc, nil, 16*1024);
|
||||||
|
@ -248,6 +302,7 @@ fsend(Srv *)
|
||||||
|
|
||||||
Srv fs = {
|
Srv fs = {
|
||||||
.open= fsopen,
|
.open= fsopen,
|
||||||
|
.read= fsread,
|
||||||
.write= fswrite,
|
.write= fswrite,
|
||||||
.stat= fsstat,
|
.stat= fsstat,
|
||||||
.destroyfid= fsclunk,
|
.destroyfid= fsclunk,
|
||||||
|
@ -286,7 +341,7 @@ threadmain(int argc, char **argv)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
fs.tree = alloctree(nil, nil, DMDIR|0777, nil);
|
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);
|
threadpostmountsrv(&fs, srv, mtpt, MREPL);
|
||||||
|
|
||||||
mtpt = smprint("%s/audio", mtpt);
|
mtpt = smprint("%s/audio", mtpt);
|
||||||
|
|
Loading…
Reference in a new issue