summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrppicomidi <[email protected]>2022-08-25 15:09:27 -0700
committeratoktoto <[email protected]>2022-11-13 14:29:16 +0100
commit3325e2613d4bc68ac2443445e62520baa4bbe6cb (patch)
treeec64633e2dc38dc3b9a793a83b27c9d3aee61a4d
parent70eefcb849542f386a1349da7a4944d2d02dcd40 (diff)
Make USB MIDI device code allow a device with no Audio Control interface
-rw-r--r--src/class/midi/midi_device.c26
-rw-r--r--src/device/usbd.c10
2 files changed, 25 insertions, 11 deletions
diff --git a/src/class/midi/midi_device.c b/src/class/midi/midi_device.c
index de41706e8..c6c99db29 100644
--- a/src/class/midi/midi_device.c
+++ b/src/class/midi/midi_device.c
@@ -406,19 +406,25 @@ void midid_reset(uint8_t rhport)
uint16_t midid_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
{
+ uint16_t drv_len = 0;
+ uint8_t const * p_desc = (uint8_t const *)desc_itf;
// 1st Interface is Audio Control v1
- TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
+ if (TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
- AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol, 0);
-
- uint16_t drv_len = tu_desc_len(desc_itf);
- uint8_t const * p_desc = tu_desc_next(desc_itf);
-
- // Skip Class Specific descriptors
- while ( TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && drv_len <= max_len )
+ AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol)
{
- drv_len += tu_desc_len(p_desc);
- p_desc = tu_desc_next(p_desc);
+ drv_len = tu_desc_len(desc_itf);
+ p_desc = tu_desc_next(desc_itf);
+ // Skip Class Specific descriptors
+ while ( TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && drv_len <= max_len )
+ {
+ drv_len += tu_desc_len(p_desc);
+ p_desc = tu_desc_next(p_desc);
+ }
+ }
+ else
+ {
+ TU_LOG1("Warning: MIDI Device has no Audio Control Interface");
}
// 2nd Interface is MIDI Streaming
diff --git a/src/device/usbd.c b/src/device/usbd.c
index c199e647e..1cede1289 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -920,7 +920,15 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
#endif
#if CFG_TUD_MIDI
- if ( driver->open == midid_open ) assoc_itf_count = 2;
+ if ( driver->open == midid_open )
+ {
+ // If there is a class-compliant Audio Control Class, then 2 interfaces
+ // Otherwise, only one
+ if (TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
+ AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
+ AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol)
+ assoc_itf_count = 2;
+ }
#endif
#if CFG_TUD_BTH && CFG_TUD_BTH_ISO_ALT_COUNT