+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);
+}
+