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;