ref: cb1381e41c056d1aca8eff9237ae4b7820b36015
dir: /sample/sample.c/
#include <u.h>
#include <libc.h>
static void
usage(void)
{
print("usage: %s [-b buf_frames] [-c channels]\n", argv0);
exits("usage");
}
void
main(int argc, char **argv)
{
int bufsz, bufframes, framesz, chan, n, r, end, i;
float f;
u8int *b;
bufframes = 2048;
chan = 1;
ARGBEGIN{
case 'b':
bufframes = atoi(EARGF(usage()));
break;
case 'c':
chan = atoi(EARGF(usage()));
break;
default:
usage();
}ARGEND
if (bufframes < 1)
sysfatal("invalid buffer size: %d frames", bufframes);
if (chan < 1)
sysfatal("invalid number of channels: %d", chan);
framesz = chan * 4;
bufsz = bufframes * framesz;
b = malloc(bufsz);
n = 0;
for (;;) {
r = read(0, b+n, bufsz-n);
if (r < 0)
exits("read failed");
else if (r == 0)
break;
n += r;
end = n & ~(framesz-1);
if (end < 1)
continue;
for (; end > 0; end -= framesz) {
for (i = 0; i < chan; i++) {
f = *(float*)(b + end - framesz - i*4);
if (f != 0)
goto out;
}
}
out:
if (end == 0)
break;
if (write(1, b, end) != end)
exits("write failed");
n -= end;
memmove(b, b+end, n);
}
exits(nil);
}