4040
4141#define TU_LOG_DRV (...) TU_LOG(CFG_TUH_MIDI_LOG_LEVEL, __VA_ARGS__)
4242
43+ //--------------------------------------------------------------------+
44+ // Weak stubs: invoked if no strong implementation is available
45+ //--------------------------------------------------------------------+
46+ TU_ATTR_WEAK void tuh_midi_descriptor_cb (uint8_t idx , const tuh_midi_descriptor_cb_t * desc_cb_data ) { (void ) idx ; (void ) desc_cb_data ; }
47+ TU_ATTR_WEAK void tuh_midi_mount_cb (uint8_t idx , const tuh_midi_mount_cb_t * mount_cb_data ) { (void ) idx ; (void ) mount_cb_data ; }
48+ TU_ATTR_WEAK void tuh_midi_umount_cb (uint8_t idx ) { (void ) idx ; }
49+ TU_ATTR_WEAK void tuh_midi_rx_cb (uint8_t idx , uint32_t xferred_bytes ) { (void ) idx ; (void ) xferred_bytes ; }
50+ TU_ATTR_WEAK void tuh_midi_tx_cb (uint8_t idx , uint32_t xferred_bytes ) { (void ) idx ; (void ) xferred_bytes ; }
51+
4352//--------------------------------------------------------------------+
4453// MACRO CONSTANT TYPEDEF
4554//--------------------------------------------------------------------+
@@ -52,8 +61,8 @@ typedef struct {
5261 uint8_t ep_in ; // IN endpoint address
5362 uint8_t ep_out ; // OUT endpoint address
5463
55- uint8_t num_cables_rx ; // IN endpoint CS descriptor bNumEmbMIDIJack value
56- uint8_t num_cables_tx ; // OUT endpoint CS descriptor bNumEmbMIDIJack value
64+ uint8_t rx_cable_count ; // IN endpoint CS descriptor bNumEmbMIDIJack value
65+ uint8_t tx_cable_count ; // OUT endpoint CS descriptor bNumEmbMIDIJack value
5766
5867 #if CFG_TUH_MIDI_STREAM_API
5968 // For Stream read()/write() API
@@ -135,16 +144,13 @@ void midih_close(uint8_t daddr) {
135144 midih_interface_t * p_midi = & _midi_host [idx ];
136145 if (p_midi -> daddr == daddr ) {
137146 TU_LOG_DRV (" MIDI close addr = %u index = %u\r\n" , daddr , idx );
138-
139- if (tuh_midi_umount_cb ) {
140- tuh_midi_umount_cb (idx );
141- }
147+ tuh_midi_umount_cb (idx );
142148
143149 p_midi -> ep_in = 0 ;
144150 p_midi -> ep_out = 0 ;
145151 p_midi -> bInterfaceNumber = 0 ;
146- p_midi -> num_cables_rx = 0 ;
147- p_midi -> num_cables_tx = 0 ;
152+ p_midi -> rx_cable_count = 0 ;
153+ p_midi -> tx_cable_count = 0 ;
148154 p_midi -> daddr = 0 ;
149155 p_midi -> mounted = false;
150156 tu_memclr (& p_midi -> stream_read , sizeof (p_midi -> stream_read ));
@@ -163,33 +169,16 @@ bool midih_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint
163169 midih_interface_t * p_midi_host = & _midi_host [idx ];
164170
165171 if (ep_addr == p_midi_host -> ep_stream .rx .ep_addr ) {
166- // receive new data if available
172+ // receive new data, put it into FIFO and invoke callback if available
167173 if (xferred_bytes ) {
168- // put in the RX FIFO only non-zero MIDI IN 4-byte packets
169- uint32_t packets_queued = 0 ;
170- uint8_t * buf = _midi_epbuf -> rx ;
171- const uint32_t npackets = xferred_bytes / 4 ;
172- for (uint32_t p = 0 ; p < npackets ; p ++ ) {
173- // some devices send back all zero packets even if there is no data ready
174- const uint32_t packet = tu_unaligned_read32 (buf );
175- if (packet != 0 ) {
176- tu_edpt_stream_read_xfer_complete_with_buf (& p_midi_host -> ep_stream .rx , buf , 4 );
177- ++ packets_queued ;
178- TU_LOG3 ("MIDI RX=%08x\r\n" , packet );
179- }
180- buf += 4 ;
181- }
182-
183- if (tuh_midi_rx_cb ) {
184- tuh_midi_rx_cb (idx , packets_queued );
185- }
174+ tu_edpt_stream_read_xfer_complete (& p_midi_host -> ep_stream .rx , xferred_bytes );
175+ tuh_midi_rx_cb (idx , xferred_bytes );
186176 }
187177
188178 tu_edpt_stream_read_xfer (dev_addr , & p_midi_host -> ep_stream .rx ); // prepare for next transfer
189179 } else if (ep_addr == p_midi_host -> ep_stream .tx .ep_addr ) {
190- if (tuh_midi_tx_cb ) {
191- tuh_midi_tx_cb (idx );
192- }
180+ tuh_midi_tx_cb (idx , xferred_bytes );
181+
193182 if (0 == tu_edpt_stream_write_xfer (dev_addr , & p_midi_host -> ep_stream .tx )) {
194183 // If there is no data left, a ZLP should be sent if
195184 // xferred_bytes is multiple of EP size and not zero
@@ -207,7 +196,6 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
207196 (void ) rhport ;
208197
209198 TU_VERIFY (TUSB_CLASS_AUDIO == desc_itf -> bInterfaceClass );
210- // const uint8_t* p_start = ((uint8_t const*) desc_itf);
211199 const uint8_t * p_end = ((const uint8_t * ) desc_itf ) + max_len ;
212200 const uint8_t * p_desc = (const uint8_t * ) desc_itf ;
213201
@@ -286,14 +274,14 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
286274 TU_LOG_DRV (" Endpoint and CS_Endpoint descriptor %02x\r\n" , p_ep -> bEndpointAddress );
287275 if (tu_edpt_dir (p_ep -> bEndpointAddress ) == TUSB_DIR_OUT ) {
288276 p_midi -> ep_out = p_ep -> bEndpointAddress ;
289- p_midi -> num_cables_tx = p_csep -> bNumEmbMIDIJack ;
277+ p_midi -> tx_cable_count = p_csep -> bNumEmbMIDIJack ;
290278 desc_cb .desc_epout = p_ep ;
291279
292280 TU_ASSERT (tuh_edpt_open (dev_addr , p_ep ));
293281 tu_edpt_stream_open (& p_midi -> ep_stream .tx , p_ep );
294282 } else {
295283 p_midi -> ep_in = p_ep -> bEndpointAddress ;
296- p_midi -> num_cables_rx = p_csep -> bNumEmbMIDIJack ;
284+ p_midi -> rx_cable_count = p_csep -> bNumEmbMIDIJack ;
297285 desc_cb .desc_epin = p_ep ;
298286
299287 TU_ASSERT (tuh_edpt_open (dev_addr , p_ep ));
@@ -309,10 +297,7 @@ bool midih_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_interface_t const *d
309297 desc_cb .desc_midi_total_len = (uint16_t ) ((uintptr_t )p_desc - (uintptr_t ) desc_itf );
310298
311299 p_midi -> daddr = dev_addr ;
312-
313- if (tuh_midi_descriptor_cb ) {
314- tuh_midi_descriptor_cb (idx , & desc_cb );
315- }
300+ tuh_midi_descriptor_cb (idx , & desc_cb );
316301
317302 return true;
318303}
@@ -323,9 +308,13 @@ bool midih_set_config(uint8_t dev_addr, uint8_t itf_num) {
323308 midih_interface_t * p_midi = & _midi_host [idx ];
324309 p_midi -> mounted = true;
325310
326- if (tuh_midi_mount_cb ) {
327- tuh_midi_mount_cb (idx , p_midi -> num_cables_rx , p_midi -> num_cables_tx );
328- }
311+ const tuh_midi_mount_cb_t mount_cb_data = {
312+ .daddr = dev_addr ,
313+ .bInterfaceNumber = itf_num ,
314+ .rx_cable_count = p_midi -> rx_cable_count ,
315+ .tx_cable_count = p_midi -> tx_cable_count ,
316+ };
317+ tuh_midi_mount_cb (idx , & mount_cb_data );
329318
330319 tu_edpt_stream_read_xfer (dev_addr , & p_midi -> ep_stream .rx ); // prepare for incoming data
331320
@@ -355,18 +344,18 @@ uint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num) {
355344 return TUSB_INDEX_INVALID_8 ;
356345}
357346
358- uint8_t tuh_midi_get_num_tx_cables (uint8_t idx ) {
347+ uint8_t tuh_midi_get_tx_cable_count (uint8_t idx ) {
359348 TU_VERIFY (idx < CFG_TUH_MIDI );
360349 midih_interface_t * p_midi = & _midi_host [idx ];
361350 TU_VERIFY (p_midi -> ep_stream .tx .ep_addr != 0 , 0 );
362- return p_midi -> num_cables_tx ;
351+ return p_midi -> tx_cable_count ;
363352}
364353
365- uint8_t tuh_midi_get_num_rx_cables (uint8_t idx ) {
354+ uint8_t tuh_midi_get_rx_cable_count (uint8_t idx ) {
366355 TU_VERIFY (idx < CFG_TUH_MIDI );
367356 midih_interface_t * p_midi = & _midi_host [idx ];
368357 TU_VERIFY (p_midi -> ep_stream .rx .ep_addr != 0 , 0 );
369- return p_midi -> num_cables_rx ;
358+ return p_midi -> rx_cable_count ;
370359}
371360
372361uint32_t tuh_midi_read_available (uint8_t idx ) {
@@ -410,7 +399,7 @@ uint32_t tuh_midi_packet_write_n(uint8_t idx, const uint8_t* buffer, uint32_t bu
410399uint32_t tuh_midi_stream_write (uint8_t idx , uint8_t cable_num , uint8_t const * buffer , uint32_t bufsize ) {
411400 TU_VERIFY (idx < CFG_TUH_MIDI && buffer && bufsize > 0 );
412401 midih_interface_t * p_midi = & _midi_host [idx ];
413- TU_VERIFY (cable_num < p_midi -> num_cables_tx );
402+ TU_VERIFY (cable_num < p_midi -> tx_cable_count );
414403 midi_driver_stream_t * stream = & p_midi -> stream_write ;
415404
416405 uint32_t byte_count = 0 ;
@@ -520,7 +509,7 @@ uint32_t tuh_midi_stream_read(uint8_t idx, uint8_t *p_cable_num, uint8_t *p_buff
520509 while (nread == 4 && bytes_buffered < bufsize ) {
521510 * p_cable_num = (p_midi -> stream_read .buffer [0 ] >> 4 ) & 0x0f ;
522511 uint8_t bytes_to_add_to_stream = 0 ;
523- if (* p_cable_num < p_midi -> num_cables_rx ) {
512+ if (* p_cable_num < p_midi -> rx_cable_count ) {
524513 // ignore the CIN field; too many devices out there encode this wrong
525514 uint8_t status = p_midi -> stream_read .buffer [1 ];
526515 uint16_t cable_mask = (uint16_t ) (1 << * p_cable_num );
0 commit comments