plan9front/sys/src/games/geigerstats.c

91 lines
1.3 KiB
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");
}
}