shithub: riscv

ref: ad6e6444f9c1bf3a2d65c67ab8f4f48ac6468104
dir: /sys/src/games/geigerstats.c/

View raw version
#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");
	}
}