summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2025-03-20 09:44:56 +0700
committerGitHub <[email protected]>2025-03-20 09:44:56 +0700
commitc2924c51fc9bf0074663cafabf4399ca9d673750 (patch)
tree656cbd0aecb3be3e5e8ff61d077c40e4914f520a /src/class
parent40ddf0628a980a718db8c205c53ab45b595180f2 (diff)
parent05e4f8b77786a6bbc4a43e3b8574689714ca3138 (diff)
Merge pull request #3032 from rppicomidi/fix_3031
Fix 3031: implement tuh_midi_itf_get_info()
Diffstat (limited to 'src/class')
-rw-r--r--src/class/midi/midi_host.c24
-rw-r--r--src/class/midi/midi_host.h4
2 files changed, 28 insertions, 0 deletions
diff --git a/src/class/midi/midi_host.c b/src/class/midi/midi_host.c
index 4d824e04c..cfea0c080 100644
--- a/src/class/midi/midi_host.c
+++ b/src/class/midi/midi_host.c
@@ -56,6 +56,7 @@ TU_ATTR_WEAK void tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes) { (void) i
typedef struct {
uint8_t daddr;
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 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);
p_midi->bInterfaceNumber = desc_itf->bInterfaceNumber;
+ p_midi->iInterface = desc_itf->iInterface;
p_midi->itf_count++;
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;
}
+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) {
TU_VERIFY(idx < CFG_TUH_MIDI);
midih_interface_t *p_midi = &_midi_host[idx];
diff --git a/src/class/midi/midi_host.h b/src/class/midi/midi_host.h
index b06bb43d7..67df25a82 100644
--- a/src/class/midi/midi_host.h
+++ b/src/class/midi/midi_host.h
@@ -90,6 +90,10 @@ bool tuh_midi_mounted(uint8_t idx);
// return TUSB_INDEX_INVALID_8 (0xFF) if not found
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
uint8_t tuh_midi_get_rx_cable_count(uint8_t idx);