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;

Reply via email to