Add support for FreeBSD raw usb-midi devices. Bits from Tobias

Kortkamp <t@tobik.me> plus configure script tweaks.
This commit is contained in:
Alexandre Ratchov 2016-11-06 12:21:59 +01:00
parent 9cb5193ca7
commit 2606d3f24e
2 changed files with 64 additions and 1 deletions

25
configure vendored
View File

@ -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

View File

@ -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