Skip to content

Commit c2924c5

Browse files
authored
Merge pull request #3032 from rppicomidi/fix_3031
Fix 3031: implement tuh_midi_itf_get_info()
2 parents 40ddf06 + 05e4f8b commit c2924c5

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/class/midi/midi_host.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ TU_ATTR_WEAK void tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes) { (void) i
5656
typedef struct {
5757
uint8_t daddr;
5858
uint8_t bInterfaceNumber; // interface number of MIDI streaming
59+
uint8_t iInterface;
5960
uint8_t itf_count; // number of interface including Audio Control + MIDI streaming
6061

6162
uint8_t ep_in; // IN endpoint address
@@ -228,6 +229,7 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
228229

229230
TU_LOG_DRV("MIDI opening Interface %u (addr = %u)\r\n", desc_itf->bInterfaceNumber, dev_addr);
230231
p_midi->bInterfaceNumber = desc_itf->bInterfaceNumber;
232+
p_midi->iInterface = desc_itf->iInterface;
231233
p_midi->itf_count++;
232234
desc_cb.desc_midi = desc_itf;
233235

@@ -346,6 +348,28 @@ uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num) {
346348
return TUSB_INDEX_INVALID_8;
347349
}
348350

351+
bool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t* info) {
352+
midih_interface_t* p_midi = &_midi_host[idx];
353+
TU_VERIFY(p_midi && info);
354+
355+
info->daddr = p_midi->daddr;
356+
357+
// re-construct descriptor
358+
tusb_desc_interface_t* desc = &info->desc;
359+
desc->bLength = sizeof(tusb_desc_interface_t);
360+
desc->bDescriptorType = TUSB_DESC_INTERFACE;
361+
362+
desc->bInterfaceNumber = p_midi->bInterfaceNumber;
363+
desc->bAlternateSetting = 0;
364+
desc->bNumEndpoints = (uint8_t)((p_midi->ep_in != 0 ? 1:0) + (p_midi->ep_out != 0 ? 1:0));
365+
desc->bInterfaceClass = TUSB_CLASS_AUDIO;
366+
desc->bInterfaceSubClass = AUDIO_SUBCLASS_MIDI_STREAMING;
367+
desc->bInterfaceProtocol = 0;
368+
desc->iInterface = p_midi->iInterface;
369+
370+
return true;
371+
}
372+
349373
uint8_t tuh_midi_get_tx_cable_count (uint8_t idx) {
350374
TU_VERIFY(idx < CFG_TUH_MIDI);
351375
midih_interface_t *p_midi = &_midi_host[idx];

src/class/midi/midi_host.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ bool tuh_midi_mounted(uint8_t idx);
9090
// return TUSB_INDEX_INVALID_8 (0xFF) if not found
9191
uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num);
9292

93+
// Get Interface information
94+
// return true if index is correct and interface is currently mounted
95+
bool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t* info);
96+
9397
// return the number of virtual midi cables on the device's IN endpoint
9498
uint8_t tuh_midi_get_rx_cable_count(uint8_t idx);
9599

0 commit comments

Comments
 (0)