version 1.89, 2010/05/02 11:12:31 |
version 1.90, 2010/05/02 11:54:26 |
|
|
} |
} |
|
|
int |
int |
opt_join(void) |
opt_onoff(void) |
{ |
{ |
if (strcmp("off", optarg) == 0) |
if (strcmp("off", optarg) == 0) |
return 0; |
return 0; |
|
|
xrun = opt_xrun(); |
xrun = opt_xrun(); |
break; |
break; |
case 'j': |
case 'j': |
join = opt_join(); |
join = opt_onoff(); |
break; |
break; |
case 't': |
case 't': |
mmc = opt_mmc(); |
mmc = opt_mmc(); |
|
|
filelist_init(); |
filelist_init(); |
|
|
/* |
/* |
* Open the device. Give half of the buffer to the device, |
* Open the device |
* the other half is for the socket/files. |
|
*/ |
*/ |
if (n_flag) { |
if (n_flag) { |
if (mode & MODE_MON) |
if (mode & MODE_MON) |
errx(1, "monitoring not allowed in loopback mode"); |
errx(1, "monitoring not allowed in loopback mode"); |
dev_loopinit(&dipar, &dopar, bufsz); |
dev_init_loop(&dipar, &dopar, bufsz); |
} else { |
} else { |
if ((mode & MODE_MON) && !(mode & MODE_PLAY)) |
if ((mode & MODE_MON) && !(mode & MODE_PLAY)) |
errx(1, "no playback stream to monitor"); |
errx(1, "no playback stream to monitor"); |
if (!dev_init(devpath, mode, &dipar, &dopar, bufsz, round)) { |
dev_init_sio(devpath, mode, &dipar, &dopar, bufsz, round); |
errx(1, "%s: can't open device", |
|
devpath ? devpath : "<default>"); |
|
} |
|
} |
} |
|
if (!dev_ref()) { |
|
errx(1, "%s: can't open device", |
|
devpath ? devpath : "<default>"); |
|
} |
|
|
/* |
/* |
* Create buffers for all input and output pipes. |
* Create buffers for all input and output pipes. |
|
|
*/ |
*/ |
ctl_start(dev_midi); |
ctl_start(dev_midi); |
} |
} |
if (l_flag) |
|
dev_prime(); |
|
|
|
/* |
/* |
* Loop, start audio. |
* Loop, start audio. |
*/ |
*/ |
for (;;) { |
for (;;) { |
if (quit_flag) { |
if (quit_flag) |
break; |
break; |
} |
if (!dev_run()) |
if ((APROC_OK(dev_mix) && LIST_EMPTY(&dev_mix->outs)) || |
|
(APROC_OK(dev_sub) && LIST_EMPTY(&dev_sub->ins))) { |
|
fprintf(stderr, "device disappeared, terminating\n"); |
|
break; |
break; |
} |
|
if (!l_flag && ctl_idle(dev_midi)) |
if (!l_flag && ctl_idle(dev_midi)) |
break; |
break; |
if (!file_poll()) |
if (!file_poll()) |
break; |
break; |
if ((!APROC_OK(dev_mix) || dev_mix->u.mix.idle > 2 * dev_bufsz) && |
|
(!APROC_OK(dev_sub) || dev_sub->u.sub.idle > 2 * dev_bufsz) && |
|
(!APROC_OK(dev_submon) || dev_submon->u.sub.idle > 2 * dev_bufsz) && |
|
(!APROC_OK(dev_midi) || dev_midi->u.ctl.tstate != CTL_RUN)) { |
|
if (dev_pstate == DEV_RUN) { |
|
dev_pstate = DEV_INIT; |
|
dev_stop(); |
|
dev_clear(); |
|
/* |
|
* priming buffer in non-server mode is not |
|
* ok, because it will insert silence and |
|
* break synchronization |
|
*/ |
|
if (l_flag) |
|
dev_prime(); |
|
} |
|
} |
|
/* |
|
* move device state machine |
|
* XXX: move this to dev.c |
|
*/ |
|
if (dev_pstate == DEV_START) { |
|
dev_pstate = DEV_RUN; |
|
dev_start(); |
|
} |
|
} |
} |
|
dev_unref(); |
stopall(); |
stopall(); |
dev_done(); |
dev_done(); |
|
/* |
|
* give a chance to drain |
|
*/ |
|
while (file_poll()) |
|
; /* nothing */ |
filelist_done(); |
filelist_done(); |
if (l_flag) { |
if (l_flag) { |
if (rmdir(base) < 0 && errno != ENOTEMPTY && errno != EPERM) |
if (rmdir(base) < 0 && errno != ENOTEMPTY && errno != EPERM) |
|
|
setsig(); |
setsig(); |
filelist_init(); |
filelist_init(); |
|
|
dev_thruinit(); |
dev_init_thru(); |
|
if (0 && !dev_ref()) |
|
errx(1, "couldn't opem midi thru box"); |
if (!l_flag && APROC_OK(dev_midi)) |
if (!l_flag && APROC_OK(dev_midi)) |
dev_midi->flags |= APROC_QUIT; |
dev_midi->flags |= APROC_QUIT; |
if ((!SLIST_EMPTY(&ifiles) || !SLIST_EMPTY(&ofiles)) && |
if ((!SLIST_EMPTY(&ifiles) || !SLIST_EMPTY(&ofiles)) && |
|
|
* loop, start processing |
* loop, start processing |
*/ |
*/ |
for (;;) { |
for (;;) { |
if (quit_flag) { |
if (quit_flag) |
break; |
break; |
} |
if (!dev_run()) |
|
break; |
if (!file_poll()) |
if (!file_poll()) |
break; |
break; |
} |
} |
stopall(); |
stopall(); |
|
if (0) |
|
dev_unref(); |
dev_done(); |
dev_done(); |
|
/* |
|
* drain |
|
*/ |
|
while (file_poll()) |
|
; /* nothing */ |
filelist_done(); |
filelist_done(); |
if (l_flag) { |
if (l_flag) { |
if (rmdir(base) < 0 && errno != ENOTEMPTY && errno != EPERM) |
if (rmdir(base) < 0 && errno != ENOTEMPTY && errno != EPERM) |
|
|
{ |
{ |
char *prog; |
char *prog; |
|
|
|
#ifdef DEBUG |
|
atexit(dbg_flush); |
|
#endif |
prog = strrchr(argv[0], '/'); |
prog = strrchr(argv[0], '/'); |
if (prog == NULL) |
if (prog == NULL) |
prog = argv[0]; |
prog = argv[0]; |