Ich erlaube mir mal den dementprechenden Auszug aus der "unixinout.c" zu entnehmen.
Starten tut die Aufnahme ohne Probleme. Erst beim beenden der Aufnahme spricht er fehler aus. Letzter Fehler war bei mir irgendwas mit den Effekten. Kein Plan was genau.

void input_sound(unsigned int sample_rate, const char *ifname) {
/************************************************** *********************
* Audio-Device abfragen
************************************************** *********************/

int sndparam;
int fd;

/* verdoppelt für 2-Kanal */
union {
short s[8192 * CHANNELS];
unsigned char b[8192 * CHANNELS];
} b;

float fbuf[CHANNELS][16384];
unsigned int fbuf_cnt = 0;
int i;
short *sp;
unsigned char *bp;
int fmt = 0;
/* gfgf ==> */
time_t tp;
int rec_n, n;
void *rec_p;
/* <== */

if ((fd = open(ifname ? ifname : "/dev/dsp", O_RDONLY)) < 0) {
perror("open");
exit(10);
}
sndparam = AFMT_S16_LE; /* we want 16 bits/sample signed */
/* little endian; works only on little endian systems! */
if (ioctl(fd, SNDCTL_DSP_SETFMT, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
if (sndparam != AFMT_S16_LE) {
fmt = 1;
sndparam = AFMT_U8;
if (ioctl(fd, SNDCTL_DSP_SETFMT, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
if (sndparam != AFMT_U8) {
perror("ioctl: SNDCTL_DSP_SETFMT");
exit(10);
}
}
sndparam = 1; /* 2 Kanäle */
if (ioctl(fd, SNDCTL_DSP_STEREO, &sndparam) == -1) {
perror("ioctl: SNDCTL_DSP_STEREO");
exit(10);
}
if (sndparam != 1) {
/* Monovariante? */
fprintf(stderr, "soundif: Error, cannot set the channel "
"number to 2\n");
exit(10);
}

sndparam = sample_rate;
if (ioctl(fd, SNDCTL_DSP_SPEED, &sndparam) == -1) {
// perror("ioctl: SNDCTL_DSP_SPEED");exit(10);
}
if ((10 * abs(sndparam - sample_rate)) > sample_rate) {
// perror("ioctl: SNDCTL_DSP_SPEED");exit(10);
}

if (sndparam != sample_rate) {
fprintf(stderr, "Warning: Sampling rate is %u, "
"requested %u\n", sndparam, sample_rate);
}

#if 0
sndparam = 4;
if (ioctl(fd, SOUND_PCM_SUBDIVIDE, &sndparam) == -1) {
perror("ioctl: SOUND_PCM_SUBDIVIDE");
}
if (sndparam != 4) {
perror("ioctl: SOUND_PCM_SUBDIVIDE");
}
#endif

for (;;) {
channel = 0;
if (fmt) {
i = read(fd, bp = b.b, sizeof(b.b));
if (i < 0 && errno != EAGAIN) {
perror("read");
exit(4);
}
if (!i)
break;

if (i > 0) {

if (rec.stat) {
time(&tp);
if (tp > rec.start + rec.time)
record_stop();
else {
verbprintf(3, "Aufzeichung Kanal %c %i sec", _channel[channel], tp - rec.start);
sprintf(rec.in_args, "-u -b -r %d -c 2 -t raw", sample_rate);
rec_n = i;
rec_p = (void *) bp;
while (rec_n) {
n = write(rec.fd, rec_p, rec_n);
rec_n -= n;
rec_p += rec_n;
}
}
}

for (; i >= sizeof(b.b[0]); i -= sizeof(b.b[0] * 2), bp++) {
fbuf[0][fbuf_cnt] = ((int)(*bp++) - 0x80) * (1.0 / 128.0);
fbuf[1][fbuf_cnt++] = ((int)(*bp) - 0x80) * (1.0 / 128.0);
}

if (i)
fprintf(stderr, "warning: noninteger number of samples read\n");
if (fbuf_cnt > overlap) {
process_buffer(fbuf[0], fbuf_cnt - overlap);
memmove(fbuf[0], fbuf[0] + fbuf_cnt - overlap, overlap * sizeof(fbuf[0][0]));
channel++;
process_buffer(fbuf[1], fbuf_cnt - overlap);
memmove(fbuf[1], fbuf[1] + fbuf_cnt - overlap, overlap * sizeof(fbuf[1][0]));
fbuf_cnt = overlap;
}
}
}
else {
#ifdef ZLOG
char outprint[ITEMLEN];
#endif
i = read(fd, sp = b.s, sizeof(b.s));
if (i < 0 && errno != EAGAIN) {
/* Schliessen des Sounddevices und neustarten */
close(fd);
return;
}
#ifdef ZLOG
update_file("newbuf", LOG);
#endif
if (!i) break;
if (i > 0) {

if (rec.stat) {
time(&tp);
if (tp > rec.start + rec.time)
record_stop();
else {
verbprintf(3, "Aufzeichung Kanal %c %i sec", _channel[channel], tp - rec.start);
sprintf(rec.in_args, "-e single-integer -2 -r %d -c 2 -t raw", sample_rate);
rec_n = i;
rec_p = (void *) sp;
while(rec_n) {
n = write(rec.fd, rec_p, rec_n);
rec_n -= n;
rec_p += rec_n;
}
}
}
/* <== */
for (; i >= sizeof(b.s[0]); i -= sizeof(b.s[0]) * 2, sp++) {
fbuf[0][fbuf_cnt] = (*sp++) * (1.0 / 32768.0);
fbuf[1][fbuf_cnt++] = (*sp) * (1.0 / 32768.0);
#ifdef ZLOG
memset(outprint, 0, sizeof(outprint));
sprintf(outprint, "fbuf[%d]\t\t[li]%8.5f\t\t[re]%8.5f", fbuf_cnt-1, fbuf[0][fbuf_cnt-1], fbuf[1][fbuf_cnt-1]);
update_file(outprint, LOG);
#endif
}
if (i)
fprintf(stderr, "warning: noninteger number of samples read\n");
if (fbuf_cnt > overlap) {
process_buffer(fbuf[0], fbuf_cnt - overlap);
memmove(fbuf[0], fbuf[0] + fbuf_cnt - overlap, overlap * sizeof(fbuf[0][0]));
channel++;
process_buffer(fbuf[1], fbuf_cnt - overlap);
memmove(fbuf[1], fbuf[1] + fbuf_cnt - overlap, overlap * sizeof(fbuf[1][0]));
fbuf_cnt = overlap;
}
}
}
}
close(fd);
}
#endif /* SUN_AUDIO */



/* ------------------------------------------------------------------- */
void record_start (short *code) {
/************************************************** *********************
* Audio-Aufzeichung starten
************************************************** *********************/

char cmdline[LINELEN], buf[5];
struct tm *today;
int i = 0;

time(&tp);

if(!rec.stat) {
memmove(buf, code, 5);
today = localtime(&tp);
strftime(cmdline, 17, "%Y-%m-%d_%H%M", today);
sprintf(rec.file, "%s/%s_", rec.path, cmdline);
while(i < 5)
sprintf(rec.file, "%s%i", rec.file, code[i++]);
if((rec.fd = open(rec.file, O_WRONLY | O_CREAT | O_TRUNC, 0664)) < 0) {
fprintf(stderr, "Cannot open %s\n", rec.file);
}
rec.chan = _channel[channel] + ' ';
rec.stat = 1;
verbprintf(2, "Aufzeichung Kanal %c", _channel[channel]);
}
else
verbprintf(2, "Aufzeichung Kanal %c verlängert", _channel[channel]);

rec.start = tp;

} /* record_start


---------------------------------------------------------------------- */
void record_stop (void) {
/************************************************** *********************
* Audio-Aufzeichung abschließen
************************************************** *********************/

char cmdline[256];

close(rec.fd);
rec.stat = 0;
sprintf(cmdline, "%s -v%f %s %s %s %s%s -%c", rec.cmd, (float)rec.volume / 100, rec.in_args, rec.file,
rec.out_args, rec.file, rec.suff, rec.chan);
system(cmdline);
sprintf(cmdline, "rm %s", rec.file);
system(cmdline);
verbprintf(2, "Aufzeichung Kanal %c beendet", _channel[channel]);

} /* record_stop
Original hier: http://grohmann.gmxhome.de/mon/monitor-1.8.1.tar.gz