From fc88896fc1f7a1849e8f4e8c372b1e06ea836384 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 10 Jan 2014 14:51:29 +0100 Subject: mixfs: make mixbuffer addition atomic serialize mixing with spinlock to make the addition on the mixbuffer samples atomic. --- sys/src/cmd/audio/mixfs/mixfs.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/sys/src/cmd/audio/mixfs/mixfs.c b/sys/src/cmd/audio/mixfs/mixfs.c index 537bfca8f..15a082e24 100644 --- a/sys/src/cmd/audio/mixfs/mixfs.c +++ b/sys/src/cmd/audio/mixfs/mixfs.c @@ -23,6 +23,7 @@ struct Stream ulong mixrp; int mixbuf[NBUF][NCHAN]; +Lock mixlock; Stream streams[16]; int @@ -163,33 +164,44 @@ fswrite(Req *r) p = (uchar*)r->ifcall.data; n = r->ifcall.count; - m = n/(NCHAN*2); + r->ofcall.count = n; + n /= (NCHAN*2); srv = r->srv; srvrelease(srv); s = r->fid->aux; qlock(s); - if(s->run == 0){ - s->wp = mixrp; - s->run = 1; - } - for(i=0; iwp - mixrp) >= NBUF-1){ + 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; } - for(j=0; jwp % NBUF][j] += s16(p); - p += 2; + if(m > n) + m = n; + + lock(&mixlock); + for(i=0; iwp % NBUF][j] += s16(p); + p += 2; + } + s->wp++; } - s->wp++; + unlock(&mixlock); + + n -= m; } if((long)(s->wp - mixrp) >= NDELAY){ s->run = 1; rsleep(s); } qunlock(s); - r->ofcall.count = n; respond(r, nil); srvacquire(srv); } -- cgit v1.2.3