Fix #3159: Handle MIDI interface descriptor after audio streaming interface
This commit is contained in:
@@ -197,7 +197,6 @@ bool midih_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len) {
|
bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *desc_itf, uint16_t max_len) {
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
|
||||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass);
|
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass);
|
||||||
const uint8_t *p_end = ((const uint8_t *) desc_itf) + max_len;
|
const uint8_t *p_end = ((const uint8_t *) desc_itf) + max_len;
|
||||||
const uint8_t *p_desc = (const uint8_t *) desc_itf;
|
const uint8_t *p_desc = (const uint8_t *) desc_itf;
|
||||||
@@ -211,7 +210,15 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
|
|||||||
desc_cb.jack_num = 0;
|
desc_cb.jack_num = 0;
|
||||||
|
|
||||||
// There can be just a MIDI or an Audio + MIDI interface
|
// There can be just a MIDI or an Audio + MIDI interface
|
||||||
// If there is Audio Control Interface + Audio Header descriptor, skip it
|
// If there is Audio Control Interface + Audio Header descriptor, then skip it.
|
||||||
|
// If there is an Audio Control Interface + Audio Streaming Interface, then
|
||||||
|
// ignore the Audio Streaming Interface.
|
||||||
|
// Future:
|
||||||
|
// Note that if this driver is used with an USB Audio Streaming host driver,
|
||||||
|
// then call that driver first. If the MIDI interface comes before the
|
||||||
|
// audio streaming interface, then the audio driver will have to call this
|
||||||
|
// driver after parsing the audio control interface and then resume parsing
|
||||||
|
// the streaming audio interface.
|
||||||
if (AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass) {
|
if (AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass) {
|
||||||
TU_VERIFY(max_len > 2*sizeof(tusb_desc_interface_t) + sizeof(audio_desc_cs_ac_interface_t));
|
TU_VERIFY(max_len > 2*sizeof(tusb_desc_interface_t) + sizeof(audio_desc_cs_ac_interface_t));
|
||||||
|
|
||||||
@@ -222,12 +229,21 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
|
|||||||
|
|
||||||
p_desc = tu_desc_next(p_desc);
|
p_desc = tu_desc_next(p_desc);
|
||||||
desc_itf = (const tusb_desc_interface_t *)p_desc;
|
desc_itf = (const tusb_desc_interface_t *)p_desc;
|
||||||
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass);
|
|
||||||
p_midi->itf_count = 1;
|
p_midi->itf_count = 1;
|
||||||
}
|
// See issue #3159
|
||||||
|
while ((p_desc < p_end) && (tu_desc_next(p_desc) <= p_end) && (desc_itf->bDescriptorType != TUSB_DESC_INTERFACE || (desc_itf->bInterfaceClass == TUSB_CLASS_AUDIO && desc_itf->bInterfaceSubClass != AUDIO_SUBCLASS_MIDI_STREAMING)))
|
||||||
|
{
|
||||||
|
if (desc_itf->bDescriptorType == TUSB_DESC_INTERFACE && desc_itf->bAlternateSetting == 0) {
|
||||||
|
p_midi->itf_count++;
|
||||||
|
}
|
||||||
|
p_desc = tu_desc_next(p_desc);
|
||||||
|
desc_itf = (tusb_desc_interface_t const *)p_desc;
|
||||||
|
}
|
||||||
|
TU_VERIFY(p_desc < p_end); // If MIDI interface comes after Audio Streaming, then max_len did not include the MIDI interface descriptor
|
||||||
|
TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass);
|
||||||
|
}
|
||||||
TU_VERIFY(AUDIO_SUBCLASS_MIDI_STREAMING == desc_itf->bInterfaceSubClass);
|
TU_VERIFY(AUDIO_SUBCLASS_MIDI_STREAMING == desc_itf->bInterfaceSubClass);
|
||||||
|
|
||||||
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->iInterface = desc_itf->iInterface;
|
||||||
p_midi->itf_count++;
|
p_midi->itf_count++;
|
||||||
@@ -236,6 +252,7 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
|
|||||||
p_desc = tu_desc_next(p_desc); // next to CS Header
|
p_desc = tu_desc_next(p_desc); // next to CS Header
|
||||||
|
|
||||||
bool found_new_interface = false;
|
bool found_new_interface = false;
|
||||||
|
printf("%p %p %p\r\n", p_desc, tu_desc_next(p_desc), p_end);
|
||||||
while ((p_desc < p_end) && (tu_desc_next(p_desc) <= p_end) && !found_new_interface) {
|
while ((p_desc < p_end) && (tu_desc_next(p_desc) <= p_end) && !found_new_interface) {
|
||||||
switch (tu_desc_type(p_desc)) {
|
switch (tu_desc_type(p_desc)) {
|
||||||
case TUSB_DESC_INTERFACE:
|
case TUSB_DESC_INTERFACE:
|
||||||
|
Reference in New Issue
Block a user