On Mon, May 07, 2018 at 03:30:19PM +0200, Jesper Wallin wrote: > I've still not been able to test this using MIDI devices, but everything > else seems to work as far as I can tell.
As Theo (tb@) kindly pointed out to me off-list, aucat(1) supports the use of multiple -i and/or -o flags, which my previous patch broke. Instead, I've now split slot_new() into two functions, where slot_new() only sets the path to the file with all the parameters, and slot_parse() which loops through all files and parse the headers. Same testing as before as well as specifying -i/-o multiple times. Regards, Jesper Wallin Index: aucat.c =================================================================== RCS file: /cvs/src/usr.bin/aucat/aucat.c,v retrieving revision 1.172 diff -u -p -r1.172 aucat.c --- aucat.c 7 Nov 2017 11:39:24 -0000 1.172 +++ aucat.c 7 May 2018 18:03:05 -0000 @@ -14,6 +14,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <err.h> #include <errno.h> #include <limits.h> #include <poll.h> @@ -91,6 +92,7 @@ struct slot { int pstate; /* one of above */ long long skip; /* frames to skip at the beginning */ long long pos; /* start position (at device rate) */ + char *path; /* path to file */ struct afile afile; /* file desc & friends */ }; @@ -203,62 +205,77 @@ slot_fill(struct slot *s) } static int -slot_new(char *path, int mode, struct aparams *par, int hdr, - int cmin, int cmax, int rate, int dup, int vol, long long pos) +slot_parse(struct aparams *par, int hdr, int rate) { struct slot *s; - s = xmalloc(sizeof(struct slot)); - if (!afile_open(&s->afile, path, hdr, - mode == SIO_PLAY ? AFILE_FREAD : AFILE_FWRITE, - par, rate, cmax - cmin + 1)) { - xfree(s); - return 0; + for (s = slot_list; s != NULL; s = s->next) { + + if (!afile_open(&s->afile, s->path, hdr, + s->mode == SIO_PLAY ? AFILE_FREAD : AFILE_FWRITE, + par, rate, s->cmax - s->cmin + 1)) { + xfree(s); + return 0; + } + s->cmax = s->cmin + s->afile.nch - 1; + + if (log_level >= 2) { + slot_log(s); + log_puts(": "); + log_puts(s->mode == SIO_PLAY ? "play" : "rec"); + log_puts(", chan "); + log_putu(s->cmin); + log_puts(":"); + log_putu(s->cmax); + log_puts(", "); + log_putu(s->afile.rate); + log_puts("Hz, "); + switch (s->afile.fmt) { + case AFILE_FMT_PCM: + aparams_log(&s->afile.par); + break; + case AFILE_FMT_ULAW: + log_puts("ulaw"); + break; + case AFILE_FMT_ALAW: + log_puts("alaw"); + break; + case AFILE_FMT_FLOAT: + log_puts("f32le"); + break; + } + if (s->mode == SIO_PLAY && s->afile.endpos >= 0) { + log_puts(", bytes "); + log_puti(s->afile.startpos); + log_puts(".."); + log_puti(s->afile.endpos); + } + if (s->mode == SIO_PLAY) { + log_puts(", vol "); + log_puti(s->vol); + } + log_puts("\n"); + } } + + return 1; +} + +static int +slot_new(char *path, int mode, int cmin, int cmax, int dup, int vol, + long long pos) +{ + struct slot *s; + + s = xmalloc(sizeof(struct slot)); + s->path = path; s->cmin = cmin; - s->cmax = cmin + s->afile.nch - 1; + s->cmax = cmax; s->dup = dup; s->vol = MIDI_TO_ADATA(vol); s->mode = mode; s->pstate = SLOT_CFG; s->pos = pos; - if (log_level >= 2) { - slot_log(s); - log_puts(": "); - log_puts(s->mode == SIO_PLAY ? "play" : "rec"); - log_puts(", chan "); - log_putu(s->cmin); - log_puts(":"); - log_putu(s->cmax); - log_puts(", "); - log_putu(s->afile.rate); - log_puts("Hz, "); - switch (s->afile.fmt) { - case AFILE_FMT_PCM: - aparams_log(&s->afile.par); - break; - case AFILE_FMT_ULAW: - log_puts("ulaw"); - break; - case AFILE_FMT_ALAW: - log_puts("alaw"); - break; - case AFILE_FMT_FLOAT: - log_puts("f32le"); - break; - } - if (s->mode == SIO_PLAY && s->afile.endpos >= 0) { - log_puts(", bytes "); - log_puti(s->afile.startpos); - log_puts(".."); - log_puti(s->afile.endpos); - } - if (s->mode == SIO_PLAY) { - log_puts(", vol "); - log_puti(s->vol); - } - log_puts("\n"); - } s->next = slot_list; slot_list = s; return 1; @@ -640,31 +657,12 @@ slot_sub_bcopy(struct slot *s, adata_t * } static int -dev_open(char *dev, int mode, int bufsz, char *port) +dev_config(int mode, int bufsz) { int rate, pmax, rmax; struct sio_par par; struct slot *s; - if (port) { - dev_port = port; - dev_mh = mio_open(dev_port, MIO_IN, 0); - if (dev_mh == NULL) { - log_puts(port); - log_puts(": couldn't open midi port\n"); - return 0; - } - } else - dev_mh = NULL; - - dev_name = dev; - dev_sh = sio_open(dev, mode, 0); - if (dev_sh == NULL) { - log_puts(dev_name); - log_puts(": couldn't open audio device\n"); - return 0; - } - rate = pmax = rmax = 0; for (s = slot_list; s != NULL; s = s->next) { if (s->afile.rate > rate) @@ -737,6 +735,30 @@ dev_open(char *dev, int mode, int bufsz, return 1; } +static int +dev_open(char *dev, int mode, char *port) +{ + if (port) { + dev_port = port; + dev_mh = mio_open(dev_port, MIO_IN, 0); + if (dev_mh == NULL) { + log_puts(port); + log_puts(": couldn't open midi port\n"); + return 0; + } + } else + dev_mh = NULL; + + dev_name = dev; + dev_sh = sio_open(dev, mode, 0); + if (dev_sh == NULL) { + log_puts(dev_name); + log_puts(": couldn't open audio device\n"); + return 0; + } + return 1; +} + static void dev_close(void) { @@ -1149,7 +1171,7 @@ sigint(int s) } static int -playrec(char *dev, int mode, int bufsz, char *port) +playrec(char *dev, int mode, char *port) { #define MIDIBUFSZ 0x100 unsigned char mbuf[MIDIBUFSZ]; @@ -1158,8 +1180,6 @@ playrec(char *dev, int mode, int bufsz, struct slot *s; int n, ns, nm, ev; - if (!dev_open(dev, mode, bufsz, port)) - return 0; n = sio_nfds(dev_sh); if (dev_mh) n += mio_nfds(dev_mh); @@ -1364,6 +1384,9 @@ main(int argc, char **argv) int n_flag, c; long long pos; + if (pledge("stdio rpath wpath cpath inet unix dns audio", NULL) == -1) + err(1, "pledge"); + vol = 127; dup = 0; bufsz = 0; @@ -1408,9 +1431,7 @@ main(int argc, char **argv) return 1; break; case 'i': - if (!slot_new(optarg, SIO_PLAY, - &par, hdr, cmin, cmax, rate, dup, vol, pos)) - return 1; + slot_new(optarg, SIO_PLAY, cmin, cmax, dup, vol, pos); mode |= SIO_PLAY; break; case 'j': @@ -1421,9 +1442,7 @@ main(int argc, char **argv) n_flag = 1; break; case 'o': - if (!slot_new(optarg, SIO_REC, - &par, hdr, cmin, cmax, rate, dup, 0, pos)) - return 1; + slot_new(optarg, SIO_REC, cmin, cmax, dup, 0, pos); mode |= SIO_REC; break; case 'p': @@ -1461,6 +1480,12 @@ main(int argc, char **argv) log_puts("both -i and -o required\n"); return 1; } + if (pledge("stdio rpath wpath cpath", NULL) == -1) + err(1, "pledge"); + if (!slot_parse(&par, hdr, rate)) + return 1; + if (pledge("stdio", NULL) == -1) + err(1, "pledge"); if (!offline()) return 1; } else { @@ -1470,7 +1495,17 @@ main(int argc, char **argv) log_puts("at least -i or -o required\n"); return 1; } - if (!playrec(dev, mode, bufsz, port)) + if (!dev_open(dev, mode, port)) + return 1; + if (pledge("stdio rpath wpath cpath audio", NULL) == -1) + err(1, "pledge"); + if (!slot_parse(&par, hdr, rate)) + return 1; + if (!dev_config(mode, bufsz)) + return 1; + if (pledge("stdio audio", NULL) == -1) + err(1, "pledge"); + if (!playrec(dev, mode, port)) return 1; } return 0;