Skip to content

Commit 686bc14

Browse files
rppicomidiatoktoto
authored andcommitted
Make USB MIDI device code allow a device with no Audio Control interface
1 parent 5e2a8b4 commit 686bc14

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

src/class/midi/midi_device.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -406,19 +406,25 @@ void midid_reset(uint8_t rhport)
406406

407407
uint16_t midid_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t max_len)
408408
{
409+
uint16_t drv_len = 0;
410+
uint8_t const * p_desc = (uint8_t const *)desc_itf;
409411
// 1st Interface is Audio Control v1
410-
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
412+
if (TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
411413
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
412-
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol, 0);
413-
414-
uint16_t drv_len = tu_desc_len(desc_itf);
415-
uint8_t const * p_desc = tu_desc_next(desc_itf);
416-
417-
// Skip Class Specific descriptors
418-
while ( TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && drv_len <= max_len )
414+
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol)
419415
{
420-
drv_len += tu_desc_len(p_desc);
421-
p_desc = tu_desc_next(p_desc);
416+
drv_len = tu_desc_len(desc_itf);
417+
p_desc = tu_desc_next(desc_itf);
418+
// Skip Class Specific descriptors
419+
while ( TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && drv_len <= max_len )
420+
{
421+
drv_len += tu_desc_len(p_desc);
422+
p_desc = tu_desc_next(p_desc);
423+
}
424+
}
425+
else
426+
{
427+
TU_LOG1("Warning: MIDI Device has no Audio Control Interface");
422428
}
423429

424430
// 2nd Interface is MIDI Streaming

src/device/usbd.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,15 @@ static bool process_set_config(uint8_t rhport, uint8_t cfg_num)
920920
#endif
921921

922922
#if CFG_TUD_MIDI
923-
if ( driver->open == midid_open ) assoc_itf_count = 2;
923+
if ( driver->open == midid_open )
924+
{
925+
// If there is a class-compliant Audio Control Class, then 2 interfaces
926+
// Otherwise, only one
927+
if (TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass &&
928+
AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass &&
929+
AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol)
930+
assoc_itf_count = 2;
931+
}
924932
#endif
925933

926934
#if CFG_TUD_BTH && CFG_TUD_BTH_ISO_ALT_COUNT

0 commit comments

Comments
 (0)