summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2016-05-31 15:05:50 +0000
committerhselasky <hselasky@FreeBSD.org>2016-05-31 15:05:50 +0000
commitfe12ff2ff682b1844ec726630f7b3d564083f40e (patch)
tree5be02b8c9dd6f883191d8595611ef68d9e48fa40 /sys/dev/sound
parent25d51f7a7413a1c11861f0b38015ef6a871d9a36 (diff)
downloadFreeBSD-src-fe12ff2ff682b1844ec726630f7b3d564083f40e.zip
FreeBSD-src-fe12ff2ff682b1844ec726630f7b3d564083f40e.tar.gz
Add support for simplex USB MIDI devices, which only provide BULK or
INTERRUPT endpoints for moving data in one direction, like the KeyRig 49 from M-Audio. Requested by: Ivan Klymenko <fidaj@ukr.net> MFC after: 1 week
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/usb/uaudio.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 6329f81..3de87ae 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -657,6 +657,7 @@ static const struct usb_config
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
.bufsize = UMIDI_TX_BUFFER,
+ .flags = {.no_pipe_ok = 1},
.callback = &umidi_bulk_write_callback,
},
@@ -665,7 +666,7 @@ static const struct usb_config
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = 4, /* bytes */
- .flags = {.short_xfer_ok = 1,.proxy_buffer = 1,},
+ .flags = {.short_xfer_ok = 1,.proxy_buffer = 1,.no_pipe_ok = 1},
.callback = &umidi_bulk_read_callback,
},
};
@@ -5754,7 +5755,16 @@ umidi_start_write(struct usb_fifo *fifo)
{
struct umidi_chan *chan = usb_fifo_softc(fifo);
- usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]);
+ if (chan->xfer[UMIDI_TX_TRANSFER] == NULL) {
+ uint8_t buf[1];
+ int actlen;
+ do {
+ /* dump data */
+ usb_fifo_get_data_linear(fifo, buf, 1, &actlen, 0);
+ } while (actlen > 0);
+ } else {
+ usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]);
+ }
}
static void
@@ -5872,6 +5882,11 @@ umidi_probe(device_t dev)
DPRINTF("error=%s\n", usbd_errstr(error));
goto detach;
}
+ if (chan->xfer[UMIDI_TX_TRANSFER] == NULL &&
+ chan->xfer[UMIDI_RX_TRANSFER] == NULL) {
+ DPRINTF("no BULK or INTERRUPT MIDI endpoint(s) found\n");
+ goto detach;
+ }
/*
* Some USB MIDI device makers couldn't resist using
@@ -5885,7 +5900,8 @@ umidi_probe(device_t dev)
* and 64-byte maximum packet sizes for full-speed bulk
* endpoints and 512 bytes for high-speed bulk endpoints."
*/
- if (usbd_xfer_maxp_was_clamped(chan->xfer[UMIDI_TX_TRANSFER]))
+ if (chan->xfer[UMIDI_TX_TRANSFER] != NULL &&
+ usbd_xfer_maxp_was_clamped(chan->xfer[UMIDI_TX_TRANSFER]))
chan->single_command = 1;
if (chan->single_command != 0)
OpenPOWER on IntegriCloud