{
int used;
int run;
+ int rd;
ulong wp;
QLock;
Rendez;
ulong mixrp;
int mixbuf[NBUF][NCHAN];
+int lbbuf[NBUF][NCHAN];
Lock mixlock;
Stream streams[16];
s->used = 1;
qunlock(s);
+ s->rd = (r->ifcall.mode&OWRITE) == 0;
r->fid->aux = s;
respond(r, nil);
return;
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;
}
}
+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)
{
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);
Srv fs = {
.open= fsopen,
+ .read= fsread,
.write= fswrite,
.stat= fsstat,
.destroyfid= fsclunk,
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);