summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorSaulo VerĂ­ssimo <[email protected]>2026-05-16 12:59:03 -0300
committerSaulo VerĂ­ssimo <[email protected]>2026-05-16 12:59:03 -0300
commit0af0665ed65ef9574a4c3c2da83c1c502cb713de (patch)
tree618dba569d2e863266261f910c6766ebca8b6b2c /src/class
parent97852816e873bf7f91f3a81f093ad08f96179656 (diff)
midi2: reject UMP read/write API on alt setting 0
Alt 0 carries USB-MIDI 1.0 32-bit Event Packets, not UMP words; calling the UMP API there would misinterpret the stream. Expose MIDI_PROTOCOL_MIDI1 and MIDI_PROTOCOL_MIDI2 in the public header so applications can branch on the negotiated protocol. Ref #3571
Diffstat (limited to 'src/class')
-rw-r--r--src/class/midi/midi2_device.c16
-rw-r--r--src/class/midi/midi2_device.h9
2 files changed, 19 insertions, 6 deletions
diff --git a/src/class/midi/midi2_device.c b/src/class/midi/midi2_device.c
index 15daad096..f7d338ede 100644
--- a/src/class/midi/midi2_device.c
+++ b/src/class/midi/midi2_device.c
@@ -73,12 +73,6 @@ enum {
STREAM_FB_INFO = 0x011,
};
-// MIDI Protocol values (per USB-MIDI 2.0 spec)
-enum {
- MIDI_PROTOCOL_MIDI1 = 0x01,
- MIDI_PROTOCOL_MIDI2 = 0x02,
-};
-
enum {
UMP_VER_MAJOR = 1,
UMP_VER_MINOR = 1,
@@ -304,6 +298,11 @@ uint32_t tud_midi2_n_available(uint8_t itf) {
uint32_t tud_midi2_n_ump_read(uint8_t itf, uint32_t* words, uint32_t max_words) {
TU_VERIFY(itf < CFG_TUD_MIDI2 && words != NULL && max_words > 0, 0);
midi2d_interface_t* p_midi = &_midi2d_itf[itf];
+
+ // UMP API is only valid on Alt Setting 1 (USB-MIDI 2.0).
+ // Alt 0 carries USB-MIDI 1.0 32-bit Event Packets, not UMP words.
+ if (p_midi->alt_setting != 1) { return 0; }
+
tu_edpt_stream_t* ep_rx = &p_midi->ep_stream.rx;
uint32_t total_read = 0;
@@ -336,6 +335,11 @@ bool tud_midi2_n_packet_read(uint8_t itf, uint8_t packet[4]) {
uint32_t tud_midi2_n_ump_write(uint8_t itf, const uint32_t* words, uint32_t count) {
TU_VERIFY(itf < CFG_TUD_MIDI2 && words != NULL && count > 0, 0);
midi2d_interface_t* p_midi = &_midi2d_itf[itf];
+
+ // UMP API is only valid on Alt Setting 1 (USB-MIDI 2.0).
+ // Alt 0 carries USB-MIDI 1.0 32-bit Event Packets, not UMP words.
+ if (p_midi->alt_setting != 1) { return 0; }
+
tu_edpt_stream_t* ep_tx = &p_midi->ep_stream.tx;
TU_VERIFY(tu_edpt_stream_is_opened(ep_tx), 0);
diff --git a/src/class/midi/midi2_device.h b/src/class/midi/midi2_device.h
index dac1f0124..8c64729c3 100644
--- a/src/class/midi/midi2_device.h
+++ b/src/class/midi/midi2_device.h
@@ -45,6 +45,15 @@ extern "C" {
#endif
//--------------------------------------------------------------------+
+// MIDI Protocol Values (returned by tud_midi2_n_protocol)
+//--------------------------------------------------------------------+
+// Per USB-MIDI 2.0 spec, UMP Stream Configuration messages.
+enum {
+ MIDI_PROTOCOL_MIDI1 = 0x01,
+ MIDI_PROTOCOL_MIDI2 = 0x02,
+};
+
+//--------------------------------------------------------------------+
// Application Callback API (weak, optional)
//--------------------------------------------------------------------+
void tud_midi2_rx_cb(uint8_t itf);