Browse Source

Detect MIDI devices lacking proper class/protocol ID (like Yamaha)

main
PaulStoffregen 5 years ago
parent
commit
794b1b8cec
1 changed files with 22 additions and 3 deletions
  1. +22
    -3
      midi.cpp

+ 22
- 3
midi.cpp View File

@@ -96,10 +96,18 @@ bool MIDIDevice::claim(Device_t *dev, int type, const uint8_t *descriptors, uint
if (p[0] != 9 || p[1] != 4) return false; // interface descriptor
//println(" bInterfaceClass=", p[5]);
//println(" bInterfaceSubClass=", p[6]);
if (p[5] != 1) return false; // bInterfaceClass: 1 = Audio class
if (p[6] != 3) return false; // bInterfaceSubClass: 3 = MIDI
bool ismidi = false;
if (p[5] == 1 && p[6] == 3) {
println(" Interface is MIDI"); // p[5] is bInterfaceClass: 1 = Audio class
ismidi = true; // p[6] is bInterfaceSubClass: 3 = MIDI
} else {
if (p[5] >= 2 && p[5] <= 18) return false; // definitely not MIDI
// Yamaha uses vendor specific class, but can be
// identified as MIDI from CS_INTERFACE descriptors.
// https://forum.pjrc.com/threads/55142?p=199162&viewfull=1#post199162
println(" Interface is unknown (might be Yahama)");
}
p += 9;
println(" Interface is MIDI");
rx_ep = 0;
tx_ep = 0;

@@ -117,19 +125,25 @@ bool MIDIDevice::claim(Device_t *dev, int type, const uint8_t *descriptors, uint
if (subtype == 1) {
// Interface Header, midi 1.0, page 21
println(" MIDI Header (ignored)");
ismidi = true;
} else if (subtype == 2) {
// MIDI IN Jack, midi 1.0, page 22
println(" MIDI IN Jack (ignored)");
ismidi = true;
} else if (subtype == 3) {
// MIDI OUT Jack, midi 1.0, page 22
println(" MIDI OUT Jack (ignored)");
ismidi = true;
} else if (subtype == 4) {
// Element Descriptor, midi 1.0, page 23-24
println(" MIDI Element (ignored)");
ismidi = true;
} else if (subtype == 0xF1 && p[3] == 2) {
// see Linux sound/usb/quirks.c create_roland_midi_quirk()
println(" Roland vendor-specific (ignored)");
ismidi = true;
} else {
println(" Unknown MIDI CS_INTERFACE descriptor!");
return false; // unknown
}
} else if (type == 5) {
@@ -163,10 +177,15 @@ bool MIDIDevice::claim(Device_t *dev, int type, const uint8_t *descriptors, uint
// MIDI endpoint info, midi 1.0: 6.2.2, page 26
println(" MIDI Endpoint Jack Association (ignored)");
} else {
println(" Unknown descriptor, type=", type);
return false; // unknown
}
p += len;
}
if (!ismidi) {
println("This interface is not MIDI");
return false;
}
// if an IN endpoint was found, create its pipe
if (rx_ep && rx_size <= MAX_PACKET_SIZE) {
rxpipe = new_Pipe(dev, rx_ep_type, rx_ep, 1, rx_size);

Loading…
Cancel
Save