Krzysztof Foltman wrote:
int port = (buffer[pos] >> 4) - 1;
if (... && (port == 0 || port == 1))
Not that it really matters, but if the port variable were unsigned, you could just check for "port <= 1".
+static void snd_usbmidi_akai_output(struct snd_usb_midi_out_endpoint *ep,
struct urb *urb)
...
- /* only try adding more data when there's space for at least 1 SysEx */
- while (urb->transfer_buffer_length + 16 < ep->max_transfer) {
count = snd_rawmidi_transmit(ep->ports[0].substream, &tmp, 1);
if (count < 1) {
ep->ports[0].active = 0;
return;
}
It is possible that ALSA's buffer does not yet contain the entire SysEx message; in this case, the driver would send off the partial message without the 0x10 in the first byte.
I think the only solution for that is to use snd_rawmidi_transmit_peek, and for a SysEx, waiting until the entire message is available before copying it to the transfer_buffer and calling transmit_ack.
- /* Akai MPD16 */
- CONTROL_PORT(0x09e8, 0x0062, 0, "%s Control"),
- EXTERNAL_PORT(0x09e8, 0x0062, 1, "%s MIDI"),
This MIDI port isn't an external port (which would imply that any random device could be connected to it). There is no macro for internal ports; just use PORT_INFO(... _MIDI_GENERIC | _HARDWARE).
Regards, Clemens