version 1.73, 2009/10/27 22:21:37 |
version 1.74, 2009/11/03 21:31:37 |
|
|
} |
} |
|
|
int |
int |
|
opt_mmc(void) |
|
{ |
|
if (strcmp("off", optarg) == 0) |
|
return 0; |
|
if (strcmp("slave", optarg) == 0) |
|
return 1; |
|
errx(1, "%s: bad MMC mode", optarg); |
|
} |
|
|
|
int |
opt_xrun(void) |
opt_xrun(void) |
{ |
{ |
if (strcmp("ignore", optarg) == 0) |
if (strcmp("ignore", optarg) == 0) |
|
|
char *name; /* optarg pointer (no need to copy it */ |
char *name; /* optarg pointer (no need to copy it */ |
int hdr; /* header format */ |
int hdr; /* header format */ |
int xrun; /* overrun/underrun policy */ |
int xrun; /* overrun/underrun policy */ |
|
int mmc; /* MMC mode */ |
}; |
}; |
|
|
SLIST_HEAD(farglist, farg); |
SLIST_HEAD(farglist, farg); |
|
|
void |
void |
farg_add(struct farglist *list, |
farg_add(struct farglist *list, |
struct aparams *ipar, struct aparams *opar, unsigned vol, |
struct aparams *ipar, struct aparams *opar, unsigned vol, |
int hdr, int xrun, char *optarg) |
int hdr, int xrun, int mmc, char *optarg) |
{ |
{ |
struct farg *fa; |
struct farg *fa; |
size_t namelen; |
size_t namelen; |
|
|
fa->opar = *opar; |
fa->opar = *opar; |
fa->vol = vol; |
fa->vol = vol; |
fa->name = optarg; |
fa->name = optarg; |
|
fa->mmc = mmc; |
SLIST_INSERT_HEAD(list, fa, entry); |
SLIST_INSERT_HEAD(list, fa, entry); |
} |
} |
|
|
|
|
(void)fputs("usage: " PROG_AUCAT " [-dlnu] [-b nframes] " |
(void)fputs("usage: " PROG_AUCAT " [-dlnu] [-b nframes] " |
"[-C min:max] [-c min:max] [-e enc] [-f device]\n" |
"[-C min:max] [-c min:max] [-e enc] [-f device]\n" |
"\t[-h fmt] [-i file] [-m mode] [-o file] [-r rate] [-s name]\n" |
"\t[-h fmt] [-i file] [-m mode] [-o file] [-r rate] [-s name]\n" |
"\t[-U unit] [-v volume] [-x policy]\n", |
"\t[-t mode] [-U unit] [-v volume] [-x policy] [-z nframes]\n", |
stderr); |
stderr); |
} |
} |
|
|
|
|
struct farglist ifiles, ofiles, sfiles; |
struct farglist ifiles, ofiles, sfiles; |
struct aparams ipar, opar, dipar, dopar; |
struct aparams ipar, opar, dipar, dopar; |
char base[PATH_MAX], path[PATH_MAX]; |
char base[PATH_MAX], path[PATH_MAX]; |
unsigned bufsz, mode; |
unsigned bufsz, round, mode; |
char *devpath; |
char *devpath; |
unsigned volctl; |
unsigned volctl; |
|
int mmc; |
|
|
aparams_init(&ipar, 0, 1, 44100); |
aparams_init(&ipar, 0, 1, 44100); |
aparams_init(&opar, 0, 1, 44100); |
aparams_init(&opar, 0, 1, 44100); |
|
|
l_flag = 0; |
l_flag = 0; |
n_flag = 0; |
n_flag = 0; |
unit = -1; |
unit = -1; |
|
mmc = 0; |
devpath = NULL; |
devpath = NULL; |
SLIST_INIT(&ifiles); |
SLIST_INIT(&ifiles); |
SLIST_INIT(&ofiles); |
SLIST_INIT(&ofiles); |
|
|
hdr = HDR_AUTO; |
hdr = HDR_AUTO; |
xrun = XRUN_IGNORE; |
xrun = XRUN_IGNORE; |
volctl = MIDI_MAXCTL; |
volctl = MIDI_MAXCTL; |
bufsz = 44100 * 4 / 15; /* XXX: use milliseconds, not frames */ |
|
mode = 0; |
mode = 0; |
|
bufsz = 0; |
|
round = 0; |
|
|
while ((c = getopt(argc, argv, "dnb:c:C:e:r:h:x:v:i:o:f:m:lus:U:")) != -1) { |
while ((c = getopt(argc, argv, "dnb:c:C:e:r:h:x:v:i:o:f:m:lus:U:t:z:")) != -1) { |
switch (c) { |
switch (c) { |
case 'd': |
case 'd': |
d_flag = 1; |
d_flag = 1; |
|
|
case 'x': |
case 'x': |
xrun = opt_xrun(); |
xrun = opt_xrun(); |
break; |
break; |
|
case 't': |
|
mmc = opt_mmc(); |
|
break; |
case 'c': |
case 'c': |
opt_ch(&ipar); |
opt_ch(&ipar); |
break; |
break; |
|
|
break; |
break; |
case 'i': |
case 'i': |
farg_add(&ifiles, &ipar, &opar, volctl, |
farg_add(&ifiles, &ipar, &opar, volctl, |
hdr, xrun, optarg); |
hdr, xrun, 0, optarg); |
break; |
break; |
case 'o': |
case 'o': |
farg_add(&ofiles, &ipar, &opar, volctl, |
farg_add(&ofiles, &ipar, &opar, volctl, |
hdr, xrun, optarg); |
hdr, xrun, 0, optarg); |
break; |
break; |
case 's': |
case 's': |
farg_add(&sfiles, &ipar, &opar, volctl, |
farg_add(&sfiles, &ipar, &opar, volctl, |
hdr, xrun, optarg); |
hdr, xrun, mmc, optarg); |
break; |
break; |
case 'f': |
case 'f': |
if (devpath) |
if (devpath) |
|
|
exit(1); |
exit(1); |
} |
} |
break; |
break; |
|
case 'z': |
|
if (sscanf(optarg, "%u", &round) != 1 || round == 0) { |
|
fprintf(stderr, "%s: bad block size\n", optarg); |
|
exit(1); |
|
} |
|
break; |
|
|
default: |
default: |
aucat_usage(); |
aucat_usage(); |
exit(1); |
exit(1); |
|
|
*/ |
*/ |
if (l_flag && SLIST_EMPTY(&sfiles)) { |
if (l_flag && SLIST_EMPTY(&sfiles)) { |
farg_add(&sfiles, &dopar, &dipar, |
farg_add(&sfiles, &dopar, &dipar, |
volctl, HDR_RAW, XRUN_IGNORE, DEFAULT_OPT); |
volctl, HDR_RAW, XRUN_IGNORE, mmc, DEFAULT_OPT); |
} |
} |
|
|
if (!u_flag) { |
if (!u_flag) { |
|
|
aparams_grow(&dipar, &fa->opar); |
aparams_grow(&dipar, &fa->opar); |
} |
} |
} |
} |
|
if (!round) |
|
round = ((mode & MODE_REC) ? dipar.rate : dopar.rate) / 15; |
|
if (!bufsz) |
|
bufsz = ((mode & MODE_REC) ? dipar.rate : dopar.rate) * 4 / 15; |
|
|
if (l_flag) { |
if (l_flag) { |
getbasepath(base, sizeof(base)); |
getbasepath(base, sizeof(base)); |
|
|
if (!dev_init(devpath, |
if (!dev_init(devpath, |
(mode & MODE_REC) ? &dipar : NULL, |
(mode & MODE_REC) ? &dipar : NULL, |
(mode & MODE_PLAY) ? &dopar : NULL, |
(mode & MODE_PLAY) ? &dopar : NULL, |
bufsz)) { |
bufsz, round)) { |
errx(1, "%s: can't open device", |
errx(1, "%s: can't open device", |
devpath ? devpath : "<default>"); |
devpath ? devpath : "<default>"); |
} |
} |
|
|
while (!SLIST_EMPTY(&sfiles)) { |
while (!SLIST_EMPTY(&sfiles)) { |
fa = SLIST_FIRST(&sfiles); |
fa = SLIST_FIRST(&sfiles); |
SLIST_REMOVE_HEAD(&sfiles, entry); |
SLIST_REMOVE_HEAD(&sfiles, entry); |
opt_new(fa->name, &fa->opar, &fa->ipar, MIDI_TO_ADATA(fa->vol)); |
opt_new(fa->name, &fa->opar, &fa->ipar, |
|
MIDI_TO_ADATA(fa->vol), fa->mmc); |
free(fa); |
free(fa); |
} |
} |
if (l_flag) { |
if (l_flag) { |
|
|
if (!file_poll()) |
if (!file_poll()) |
break; |
break; |
if ((!dev_mix || dev_mix->u.mix.idle > 2 * dev_bufsz) && |
if ((!dev_mix || dev_mix->u.mix.idle > 2 * dev_bufsz) && |
(!dev_sub || dev_sub->u.sub.idle > 2 * dev_bufsz)) { |
(!dev_sub || dev_sub->u.sub.idle > 2 * dev_bufsz) && |
|
((dev_mix || dev_sub) && dev_midi->u.ctl.tstate != CTL_RUN)) { |
if (!l_flag) |
if (!l_flag) |
break; |
break; |
if (!suspend) { |
if (!suspend) { |
|
|
} |
} |
} |
} |
if ((dev_mix && dev_mix->u.mix.idle == 0) || |
if ((dev_mix && dev_mix->u.mix.idle == 0) || |
(dev_sub && dev_sub->u.sub.idle == 0)) { |
(dev_sub && dev_sub->u.sub.idle == 0) || |
|
((dev_mix || dev_sub) && dev_midi->u.ctl.tstate == CTL_RUN)) { |
if (suspend) { |
if (suspend) { |
suspend = 0; |
suspend = 0; |
dev_start(); |
dev_start(); |
|
|
break; |
break; |
case 'i': |
case 'i': |
farg_add(&ifiles, &aparams_none, &aparams_none, |
farg_add(&ifiles, &aparams_none, &aparams_none, |
0, HDR_RAW, 0, optarg); |
0, HDR_RAW, 0, 0, optarg); |
break; |
break; |
case 'o': |
case 'o': |
farg_add(&ofiles, &aparams_none, &aparams_none, |
farg_add(&ofiles, &aparams_none, &aparams_none, |
0, HDR_RAW, 0, optarg); |
0, HDR_RAW, 0, 0, optarg); |
break; |
break; |
case 'f': |
case 'f': |
farg_add(&dfiles, &aparams_none, &aparams_none, |
farg_add(&dfiles, &aparams_none, &aparams_none, |
0, HDR_RAW, 0, optarg); |
0, HDR_RAW, 0, 0, optarg); |
break; |
break; |
case 'l': |
case 'l': |
l_flag = 1; |
l_flag = 1; |
|
|
|
|
dev_thruinit(); |
dev_thruinit(); |
if (!l_flag) |
if (!l_flag) |
dev_midi->u.thru.flags |= THRU_AUTOQUIT; |
dev_midi->flags |= APROC_QUIT; |
if ((!SLIST_EMPTY(&ifiles) || !SLIST_EMPTY(&ofiles)) && |
if ((!SLIST_EMPTY(&ifiles) || !SLIST_EMPTY(&ofiles)) && |
SLIST_EMPTY(&dfiles)) { |
SLIST_EMPTY(&dfiles)) { |
farg_add(&dfiles, &aparams_none, &aparams_none, |
farg_add(&dfiles, &aparams_none, &aparams_none, |
0, HDR_RAW, 0, NULL); |
0, HDR_RAW, 0, 0, NULL); |
} |
} |
while (!SLIST_EMPTY(&dfiles)) { |
while (!SLIST_EMPTY(&dfiles)) { |
fa = SLIST_FIRST(&dfiles); |
fa = SLIST_FIRST(&dfiles); |