ref: 8d5457914701436a3ba2cac2c711b715fda2db4a
parent: 28a68bce6d97af85a0c86837bdb6b399868a530a
author: aiju <aiju@phicode.de>
date: Fri Mar 8 15:51:08 EST 2013
added geigerstats
--- /dev/null
+++ b/sys/src/games/geigerstats.c
@@ -1,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");+ }
+}
--- a/sys/src/games/mkfile
+++ b/sys/src/games/mkfile
@@ -5,6 +5,7 @@
ana\
catclock\
festoon\
+ geigerstats\
juggle\
life\
memo\
--
⑨