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