ref: d73c67660bd2573787e99c300806c2f1394a8b52
dir: /sys/src/games/geigerstats.c/
#include <u.h> #include <libc.h> enum { SRATE = 44100, NSAMP = SRATE / 10, }; void usage(void) { fprint(2, "%s: usage: %s [-d dev] [-v vol]\n", argv0, argv0); exits("usage"); } int load(void) { static int fd = -1; static char buf[1024]; int rc, sum; char *p, *q, *e; char *f[10]; if(fd < 0) fd = open("/dev/sysstat", OREAD); if(fd < 0) sysfatal("open: %r"); seek(fd, 0, 0); if((rc = readn(fd, buf, sizeof(buf)-1)) < 0) sysfatal("read: %r"); p = buf; e = buf + rc; sum = 0; while(p < e){ q = memchr(p, '\n', e - p); if(q == nil) q = e; *q = 0; rc = tokenize(p, f, nelem(f)); if(rc >= 7) sum += atoi(f[7]); p = q; if(p < e) p++; } return sum; } void main(int argc, char **argv) { char *dev; uchar buf[4 * NSAMP], *p; short s; int vol, fd, cps; ulong tresh; dev = "/dev/audio"; vol = 32767; s = 0; ARGBEGIN{ case 'd': dev = strdup(EARGF(usage())); break; case 'v': vol = atoi(EARGF(usage())); break; default: usage(); }ARGEND; if(argc != 0) usage(); fd = open(dev, OWRITE); if(fd < 0) sysfatal("open: %r"); for(;;){ cps = 3 + load() / 3; tresh = umuldiv(0xFFFFFFFF, cps, SRATE); for(p = buf; p < buf + sizeof(buf);){ s = lrand() < tresh ? (vol - s) : s; *p++ = s; *p++ = s >> 8; *p++ = s; *p++ = s >> 8; } if(write(fd, buf, sizeof(buf)) < 0) sysfatal("write: %r"); } }