diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-04 16:35:04 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-04 16:35:04 +0000 |
commit | 79e9c9534592bc4948f4a0299f413d7cfa45479c (patch) | |
tree | fc6a786e9f1c3c92b64f0bb1171205cc6d9bc73e /sys/src/cmd/audio | |
parent | 35b8a692679495606c09e3f023ddee744a8852b9 (diff) |
audio/mixfs: fix locking for /dev/audio loopback
Add "Lock rplock" as a barrier for /dev/audio loopback
readers. Readers can execute concurrently (no need
to acquire mixlock), we just have to make sure lbbuf[]
data is written *before* mixrp is updated by audioproc().
Diffstat (limited to 'sys/src/cmd/audio')
-rw-r--r-- | sys/src/cmd/audio/mixfs/mixfs.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/src/cmd/audio/mixfs/mixfs.c b/sys/src/cmd/audio/mixfs/mixfs.c index de6f4a557..00b51057e 100644 --- a/sys/src/cmd/audio/mixfs/mixfs.c +++ b/sys/src/cmd/audio/mixfs/mixfs.c @@ -23,9 +23,12 @@ struct Stream }; ulong mixrp; -int mixbuf[NBUF][NCHAN]; +Lock rplock; int lbbuf[NBUF][NCHAN]; + +int mixbuf[NBUF][NCHAN]; Lock mixlock; + Stream streams[16]; int @@ -89,6 +92,7 @@ audioproc(void *) { static uchar buf[NBUF*NCHAN*2]; int sweep, fd, i, j, n, m, v; + ulong rp; Stream *s; uchar *p; @@ -144,16 +148,23 @@ audioproc(void *) } p = buf; + rp = mixrp; 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; + v = clip16(mixbuf[rp % NBUF][j]); + lbbuf[rp % NBUF][j] = v; + mixbuf[rp % NBUF][j] = 0; *p++ = v & 0xFF; *p++ = v >> 8; } - mixrp++; + rp++; } + + /* barrier */ + lock(&rplock); + mixrp = rp; + unlock(&rplock); + write(fd, buf, p - buf); } } @@ -182,6 +193,7 @@ fsread(Req *r) s->run = 1; } m = NBUF-1 - (long)(s->wp - mixrp); + if(m <= 0){ s->run = 1; rsleep(s); @@ -190,7 +202,6 @@ fsread(Req *r) 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]; @@ -199,7 +210,6 @@ fsread(Req *r) } s->wp++; } - unlock(&mixlock); n -= m; } @@ -231,6 +241,7 @@ fswrite(Req *r) s->run = 1; } m = NBUF-1 - (long)(s->wp - mixrp); + if(m <= 0){ s->run = 1; rsleep(s); |