diff --git a/configure b/configure index 13a0394..21a546b 100755 --- a/configure +++ b/configure @@ -20,6 +20,8 @@ Usage: configure [options] --disable-sun disable sun audio backend --enable-rmidi enable character device midi backend [$rmidi] --disable-rmidi disable character device midi backend +--enable-umidi enable usb-midi backend [$umidi] +--disable-umidi disable usb-midi backend --with-libbsd use the libbsd rather than bsd-compat/* --without-libbsd don't use libbsd END @@ -34,6 +36,7 @@ alsa=no # do we want alsa support ? sun=no # do we want sun support ? oss=no # do we want oss support ? rmidi=no # do we want support for raw char dev ? +umidi=no # do we want support for umidi ? precision=16 # aucat/sndiod arithmetic precision user=_sndio # non-privileged user for sndio daemon libbsd=no # use libbsd? @@ -73,6 +76,7 @@ case `uname` in -DHAVE_STRLCAT -DHAVE_STRLCPY -DHAVE_STRTONUM' ;; DragonFly|FreeBSD) + umidi=yes user=_sndio so="$so libsndio.so" defs='-DHAVE_ARC4RANDOM -DHAVE_ISSETUGID \\\ @@ -133,6 +137,12 @@ for i; do --disable-rmidi) rmidi=no shift;; + --enable-umidi) + umidi=yes + shift;; + --disable-umidi) + umidi=no + shift;; --privsep-user=*) user="${i#--privsep-user=}" shift;; @@ -168,6 +178,13 @@ includedir="${includedir:-$prefix/include}" libdir="${libdir:-$prefix/lib}" mandir="${mandir:-$prefix/share/man}" +# +# umidi implies rmidi +# +if [ $umidi = yes ]; then + rmidi=yes +fi + # # if using ALSA, add corresponding parameters # @@ -197,6 +214,13 @@ if [ $rmidi = yes ]; then defs="$defs -DUSE_RMIDI" fi +# +# if using usb-midi raw devices for midi, add corresponding parameters +# +if [ $umidi = yes ]; then + defs="$defs -DUSE_UMIDI" +fi + # # if using libbsd, add corresponding parameters # @@ -242,6 +266,7 @@ alsa..................... $alsa oss...................... $oss sun...................... $sun rmidi.................... $rmidi +umidi.................... $umidi Do "make && make install" to compile and install sndio diff --git a/libsndio/mio_rmidi.c b/libsndio/mio_rmidi.c index 8e6116a..6ffef85 100644 --- a/libsndio/mio_rmidi.c +++ b/libsndio/mio_rmidi.c @@ -31,10 +31,19 @@ #include "debug.h" #include "mio_priv.h" +#ifdef USE_UMIDI +#define DEVPATH_PREFIX "/dev/umidi" +#define DEVPATH_MAX (1 + \ + sizeof(DEVPATH_PREFIX) - 1 + \ + sizeof(int) * 3 + \ + 1 + \ + sizeof(int) * 3) +#else #define DEVPATH_PREFIX "/dev/rmidi" #define DEVPATH_MAX (1 + \ sizeof(DEVPATH_PREFIX) - 1 + \ sizeof(int) * 3) +#endif struct mio_rmidi_hdl { struct mio_hdl mio; @@ -63,6 +72,9 @@ mio_rmidi_getfd(const char *str, unsigned int mode, int nbio) const char *p; char path[DEVPATH_MAX]; unsigned int devnum; +#ifdef USE_UMIDI + unsigned int subdevnum = 0; +#endif int fd, flags; p = _sndio_parsetype(str, "rmidi"); @@ -79,11 +91,37 @@ mio_rmidi_getfd(const char *str, unsigned int mode, int nbio) return -1; } p = _sndio_parsenum(p, &devnum, 255); - if (p == NULL || *p != '\0') { + if (p == NULL) { DPRINTF("mio_rmidi_getfd: %s: number expected after '/'\n", str); return -1; } +#ifdef USE_UMIDI + switch (*p) { + case '.': + p++; + p = _sndio_parsenum(p, &subdevnum, 255); + if (p == NULL) { + DPRINTF("mio_rmidi_getfd: %s: " + "number expected after '.'\n", str); + return -1; + } + break; + case '\0': + break; + default: + DPRINTF("mio_rmidi_getfd: %s: '.' expected\n", str); + return -1; + } +#endif + if (*p != '\0') { + DPRINTF("mio_rmidi_getfd: junk at end of string: %s\n", p); + return -1; + } +#ifdef USE_UMIDI + snprintf(path, sizeof(path), DEVPATH_PREFIX "%u.%u", devnum, subdevnum); +#else snprintf(path, sizeof(path), DEVPATH_PREFIX "%u", devnum); +#endif if (mode == (MIO_IN | MIO_OUT)) flags = O_RDWR; else