summaryrefslogtreecommitdiff
path: root/sys/src/games/geigerstats.c
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2013-03-08 20:51:08 +0100
committeraiju <aiju@phicode.de>2013-03-08 20:51:08 +0100
commitd9dd0970b18098fe881889ff16fcd57f5c97cf80 (patch)
tree2e182bf987c6d78ba77425c746124a7fe064963d /sys/src/games/geigerstats.c
parent2cb20023eb5375e6c9b8c0da344e8543af70d2d5 (diff)
added geigerstats
Diffstat (limited to 'sys/src/games/geigerstats.c')
-rw-r--r--sys/src/games/geigerstats.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/sys/src/games/geigerstats.c b/sys/src/games/geigerstats.c
new file mode 100644
index 000000000..95baf0ceb
--- /dev/null
+++ b/sys/src/games/geigerstats.c
@@ -0,0 +1,89 @@
+#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);
+}
+
+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");
+ }
+}