]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/geigerstats.c
mkpaqfs(8): allow setting compression level
[plan9front.git] / sys / src / games / geigerstats.c
1 #include <u.h>
2 #include <libc.h>
3
4 enum {
5         SRATE = 44100,
6         NSAMP = SRATE / 10,
7 };
8
9 void
10 usage(void)
11 {
12         fprint(2, "%s: usage: %s [-d dev] [-v vol]\n", argv0, argv0);
13         exits("usage");
14 }
15
16 int
17 load(void)
18 {
19         static int fd = -1;
20         static char buf[1024];
21         int rc, sum;
22         char *p, *q, *e;
23         char *f[10];
24         
25         if(fd < 0)
26                 fd = open("/dev/sysstat", OREAD);
27         if(fd < 0)
28                 sysfatal("open: %r");
29         seek(fd, 0, 0);
30         if((rc = readn(fd, buf, sizeof(buf)-1)) < 0)
31                 sysfatal("read: %r");
32         p = buf;
33         e = buf + rc;
34         sum = 0;
35         while(p < e){
36                 q = memchr(p, '\n', e - p);
37                 if(q == nil)
38                         q = e;
39                 *q = 0;
40                 rc = tokenize(p, f, nelem(f));
41                 if(rc >= 7)
42                         sum += atoi(f[7]);
43                 p = q;
44                 if(p < e)
45                         p++;
46         }
47         return sum;
48 }
49
50 void
51 main(int argc, char **argv)
52 {
53         char *dev;
54         uchar buf[4 * NSAMP], *p;
55         short s;
56         int vol, fd, cps;
57         ulong tresh;
58         
59         dev = "/dev/audio";
60         vol = 32767;
61         s = 0;
62         ARGBEGIN{
63         case 'd':
64                 dev = strdup(EARGF(usage()));
65                 break;
66         case 'v':
67                 vol = atoi(EARGF(usage()));
68                 break;
69         default:
70                 usage();
71         }ARGEND;
72         if(argc != 0)
73                 usage();
74         fd = open(dev, OWRITE);
75         if(fd < 0)
76                 sysfatal("open: %r");
77         for(;;){
78                 cps = 3 + load() / 3;
79                 tresh = umuldiv(0xFFFFFFFF, cps, SRATE);
80                 for(p = buf; p < buf + sizeof(buf);){
81                         s = lrand() < tresh ? (vol - s) : s;
82                         *p++ = s;
83                         *p++ = s >> 8;
84                         *p++ = s;
85                         *p++ = s >> 8;
86                 }
87                 if(write(fd, buf, sizeof(buf)) < 0)
88                         sysfatal("write: %r");
89         }
90 }