Merge pull request #3032 from rppicomidi/fix_3031

Fix 3031: implement tuh_midi_itf_get_info()
This commit is contained in:
Ha Thach 2025-03-20 09:44:56 +07:00 committed by GitHub
commit c2924c51fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 0 deletions

View File

@ -56,6 +56,7 @@ TU_ATTR_WEAK void tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes) { (void) i
typedef struct { typedef struct {
uint8_t daddr; uint8_t daddr;
uint8_t bInterfaceNumber; // interface number of MIDI streaming uint8_t bInterfaceNumber; // interface number of MIDI streaming
uint8_t iInterface;
uint8_t itf_count; // number of interface including Audio Control + MIDI streaming uint8_t itf_count; // number of interface including Audio Control + MIDI streaming
uint8_t ep_in; // IN endpoint address 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
TU_LOG_DRV("MIDI opening Interface %u (addr = %u)\r\n", desc_itf->bInterfaceNumber, dev_addr); TU_LOG_DRV("MIDI opening Interface %u (addr = %u)\r\n", desc_itf->bInterfaceNumber, dev_addr);
p_midi->bInterfaceNumber = desc_itf->bInterfaceNumber; p_midi->bInterfaceNumber = desc_itf->bInterfaceNumber;
p_midi->iInterface = desc_itf->iInterface;
p_midi->itf_count++; p_midi->itf_count++;
desc_cb.desc_midi = desc_itf; desc_cb.desc_midi = desc_itf;
@ -346,6 +348,28 @@ uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num) {
return TUSB_INDEX_INVALID_8; return TUSB_INDEX_INVALID_8;
} }
bool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t* info) {
midih_interface_t* p_midi = &_midi_host[idx];
TU_VERIFY(p_midi && info);
info->daddr = p_midi->daddr;
// re-construct descriptor
tusb_desc_interface_t* desc = &info->desc;
desc->bLength = sizeof(tusb_desc_interface_t);
desc->bDescriptorType = TUSB_DESC_INTERFACE;
desc->bInterfaceNumber = p_midi->bInterfaceNumber;
desc->bAlternateSetting = 0;
desc->bNumEndpoints = (uint8_t)((p_midi->ep_in != 0 ? 1:0) + (p_midi->ep_out != 0 ? 1:0));
desc->bInterfaceClass = TUSB_CLASS_AUDIO;
desc->bInterfaceSubClass = AUDIO_SUBCLASS_MIDI_STREAMING;
desc->bInterfaceProtocol = 0;
desc->iInterface = p_midi->iInterface;
return true;
}
uint8_t tuh_midi_get_tx_cable_count (uint8_t idx) { uint8_t tuh_midi_get_tx_cable_count (uint8_t idx) {
TU_VERIFY(idx < CFG_TUH_MIDI); TU_VERIFY(idx < CFG_TUH_MIDI);
midih_interface_t *p_midi = &_midi_host[idx]; midih_interface_t *p_midi = &_midi_host[idx];

View File

@ -90,6 +90,10 @@ bool tuh_midi_mounted(uint8_t idx);
// return TUSB_INDEX_INVALID_8 (0xFF) if not found // return TUSB_INDEX_INVALID_8 (0xFF) if not found
uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num); uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num);
// Get Interface information
// return true if index is correct and interface is currently mounted
bool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t* info);
// return the number of virtual midi cables on the device's IN endpoint // return the number of virtual midi cables on the device's IN endpoint
uint8_t tuh_midi_get_rx_cable_count(uint8_t idx); uint8_t tuh_midi_get_rx_cable_count(uint8_t idx);