- rename tuh_midi_stream_flush() to tuh_midi_write_flush()
- add tuh_midi_packet_read_n() and tuh_midi_packet_write_n() - add CFG_TUH_MIDI_STREAM_API to opt out stream API
This commit is contained in:
@@ -47,13 +47,14 @@ typedef struct {
|
|||||||
uint8_t num_cables_rx; // IN endpoint CS descriptor bNumEmbMIDIJack value
|
uint8_t num_cables_rx; // IN endpoint CS descriptor bNumEmbMIDIJack value
|
||||||
uint8_t num_cables_tx; // OUT endpoint CS descriptor bNumEmbMIDIJack value
|
uint8_t num_cables_tx; // OUT endpoint CS descriptor bNumEmbMIDIJack value
|
||||||
|
|
||||||
|
#if CFG_TUH_MIDI_STREAM_API
|
||||||
// For Stream read()/write() API
|
// For Stream read()/write() API
|
||||||
// Messages are always 4 bytes long, queue them for reading and writing so the
|
// Messages are always 4 bytes long, queue them for reading and writing so the
|
||||||
// callers can use the Stream interface with single-byte read/write calls.
|
// callers can use the Stream interface with single-byte read/write calls.
|
||||||
midi_driver_stream_t stream_write;
|
midi_driver_stream_t stream_write;
|
||||||
midi_driver_stream_t stream_read;
|
midi_driver_stream_t stream_read;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*------------- From this point, data is not cleared by bus reset -------------*/
|
|
||||||
// Endpoint stream
|
// Endpoint stream
|
||||||
struct {
|
struct {
|
||||||
tu_edpt_stream_t tx;
|
tu_edpt_stream_t tx;
|
||||||
@@ -433,6 +434,57 @@ bool tuh_midi_configured(uint8_t dev_addr) {
|
|||||||
return p_midi_host->configured;
|
return p_midi_host->configured;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t tuh_midi_get_num_tx_cables (uint8_t dev_addr) {
|
||||||
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi_host != NULL, 0);
|
||||||
|
TU_VERIFY(p_midi_host->ep_stream.tx.ep_addr != 0, 0);
|
||||||
|
return p_midi_host->num_cables_tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t tuh_midi_get_num_rx_cables (uint8_t dev_addr) {
|
||||||
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi_host != NULL, 0);
|
||||||
|
TU_VERIFY(p_midi_host->ep_stream.rx.ep_addr != 0, 0);
|
||||||
|
return p_midi_host->num_cables_rx;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t tuh_midi_read_available(uint8_t dev_addr) {
|
||||||
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi_host != NULL);
|
||||||
|
return tu_edpt_stream_read_available(&p_midi_host->ep_stream.rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t tuh_midi_write_flush(uint8_t dev_addr) {
|
||||||
|
midih_interface_t *p_midi = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi != NULL);
|
||||||
|
return tu_edpt_stream_write_xfer(p_midi->dev_addr, &p_midi->ep_stream.tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
// Packet API
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
|
uint32_t tuh_midi_packet_read_n(uint8_t dev_addr, uint8_t* buffer, uint32_t bufsize) {
|
||||||
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi_host != NULL);
|
||||||
|
|
||||||
|
uint32_t count4 = tu_min32(bufsize, tu_edpt_stream_read_available(&p_midi_host->ep_stream.rx));
|
||||||
|
count4 = tu_align4(count4); // round down to multiple of 4
|
||||||
|
TU_VERIFY(count4 > 0, 0);
|
||||||
|
return tu_edpt_stream_read(dev_addr, &p_midi_host->ep_stream.rx, buffer, count4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t tuh_midi_packet_write_n(uint8_t dev_addr, const uint8_t* buffer, uint32_t bufsize) {
|
||||||
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
|
TU_VERIFY(p_midi_host != NULL, 0);
|
||||||
|
uint32_t bufsize4 = tu_align4(bufsize);
|
||||||
|
return tu_edpt_stream_write(dev_addr, &p_midi_host->ep_stream.tx, buffer, bufsize4);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
// Stream API
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
#if CFG_TUH_MIDI_STREAM_API
|
||||||
uint32_t tuh_midi_stream_write(uint8_t dev_addr, uint8_t cable_num, uint8_t const *buffer, uint32_t bufsize) {
|
uint32_t tuh_midi_stream_write(uint8_t dev_addr, uint8_t cable_num, uint8_t const *buffer, uint32_t bufsize) {
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
TU_VERIFY(p_midi_host != NULL);
|
TU_VERIFY(p_midi_host != NULL);
|
||||||
@@ -530,47 +582,6 @@ uint32_t tuh_midi_stream_write(uint8_t dev_addr, uint8_t cable_num, uint8_t cons
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tuh_midi_packet_write (uint8_t dev_addr, uint8_t const packet[4]) {
|
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi_host != NULL);
|
|
||||||
return 4 == tu_edpt_stream_write(dev_addr, &p_midi_host->ep_stream.tx, packet, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t tuh_midi_stream_flush(uint8_t dev_addr) {
|
|
||||||
midih_interface_t *p_midi = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi != NULL);
|
|
||||||
return tu_edpt_stream_write_xfer(p_midi->dev_addr, &p_midi->ep_stream.tx);
|
|
||||||
}
|
|
||||||
//--------------------------------------------------------------------+
|
|
||||||
// Helper
|
|
||||||
//--------------------------------------------------------------------+
|
|
||||||
uint8_t tuh_midi_get_num_tx_cables (uint8_t dev_addr) {
|
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi_host != NULL, 0);
|
|
||||||
TU_VERIFY(p_midi_host->ep_stream.tx.ep_addr != 0, 0);
|
|
||||||
return p_midi_host->num_cables_tx;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t tuh_midi_get_num_rx_cables (uint8_t dev_addr) {
|
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi_host != NULL, 0);
|
|
||||||
TU_VERIFY(p_midi_host->ep_stream.rx.ep_addr != 0, 0);
|
|
||||||
return p_midi_host->num_cables_rx;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t tuh_midi_read_available(uint8_t dev_addr) {
|
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi_host != NULL);
|
|
||||||
return tu_edpt_stream_read_available(&p_midi_host->ep_stream.rx);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool tuh_midi_packet_read (uint8_t dev_addr, uint8_t packet[4]) {
|
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
|
||||||
TU_VERIFY(p_midi_host != NULL);
|
|
||||||
TU_VERIFY(tu_edpt_stream_read_available(&p_midi_host->ep_stream.rx) >= 4);
|
|
||||||
return 4 == tu_edpt_stream_read(dev_addr, &p_midi_host->ep_stream.rx, packet, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t tuh_midi_stream_read(uint8_t dev_addr, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize) {
|
uint32_t tuh_midi_stream_read(uint8_t dev_addr, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize) {
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
TU_VERIFY(p_midi_host != NULL);
|
TU_VERIFY(p_midi_host != NULL);
|
||||||
@@ -669,6 +680,9 @@ uint32_t tuh_midi_stream_read(uint8_t dev_addr, uint8_t *p_cable_num, uint8_t *p
|
|||||||
return bytes_buffered;
|
return bytes_buffered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
// String API
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
#if CFG_MIDI_HOST_DEVSTRINGS
|
#if CFG_MIDI_HOST_DEVSTRINGS
|
||||||
static uint8_t find_string_index(midih_interface_t *ptr, uint8_t jack_id)
|
static uint8_t find_string_index(midih_interface_t *ptr, uint8_t jack_id)
|
||||||
{
|
{
|
||||||
@@ -690,9 +704,7 @@ static uint8_t find_string_index(midih_interface_t *ptr, uint8_t jack_id)
|
|||||||
}
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CFG_MIDI_HOST_DEVSTRINGS
|
|
||||||
uint8_t tuh_midi_get_rx_cable_istrings(uint8_t dev_addr, uint8_t* istrings, uint8_t max_istrings) {
|
uint8_t tuh_midi_get_rx_cable_istrings(uint8_t dev_addr, uint8_t* istrings, uint8_t max_istrings) {
|
||||||
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
midih_interface_t *p_midi_host = find_midi_by_daddr(dev_addr);
|
||||||
TU_VERIFY(p_midi_host != NULL, 0);
|
TU_VERIFY(p_midi_host != NULL, 0);
|
||||||
@@ -732,3 +744,5 @@ uint8_t tuh_midi_get_all_istrings(uint8_t dev_addr, const uint8_t** istrings)
|
|||||||
return nstrings;
|
return nstrings;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@@ -24,8 +24,8 @@
|
|||||||
* This file is part of the TinyUSB stack.
|
* This file is part of the TinyUSB stack.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TUSB_MIDI_HOST_H_
|
#ifndef TUSB_MIDI_HOST_H_
|
||||||
#define _TUSB_MIDI_HOST_H_
|
#define TUSB_MIDI_HOST_H_
|
||||||
|
|
||||||
#include "class/audio/audio.h"
|
#include "class/audio/audio.h"
|
||||||
#include "midi.h"
|
#include "midi.h"
|
||||||
@@ -53,6 +53,12 @@
|
|||||||
#define CFG_TUH_MIDI_EP_BUFSIZE TUH_EPSIZE_BULK_MPS
|
#define CFG_TUH_MIDI_EP_BUFSIZE TUH_EPSIZE_BULK_MPS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enable the MIDI stream read/write API. Some library can work with raw USB MIDI packet
|
||||||
|
// Disable this can save driver footprint.
|
||||||
|
#ifndef CFG_TUH_MIDI_STREAM_API
|
||||||
|
#define CFG_TUH_MIDI_STREAM_API 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef CFG_MIDI_HOST_DEVSTRINGS
|
#ifndef CFG_MIDI_HOST_DEVSTRINGS
|
||||||
#define CFG_MIDI_HOST_DEVSTRINGS 0
|
#define CFG_MIDI_HOST_DEVSTRINGS 0
|
||||||
#endif
|
#endif
|
||||||
@@ -60,7 +66,7 @@
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Application API
|
// Application API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
bool tuh_midi_configured (uint8_t dev_addr);
|
bool tuh_midi_configured (uint8_t dev_addr);
|
||||||
|
|
||||||
// return the number of virtual midi cables on the device's IN endpoint
|
// return the number of virtual midi cables on the device's IN endpoint
|
||||||
uint8_t tuh_midi_get_num_rx_cables(uint8_t dev_addr);
|
uint8_t tuh_midi_get_num_rx_cables(uint8_t dev_addr);
|
||||||
@@ -74,40 +80,51 @@ uint8_t tuh_midi_get_tx_cable_istrings(uint8_t dev_addr, uint8_t* istrings, uint
|
|||||||
uint8_t tuh_midi_get_all_istrings(uint8_t dev_addr, const uint8_t** istrings);
|
uint8_t tuh_midi_get_all_istrings(uint8_t dev_addr, const uint8_t** istrings);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// return the raw number of bytes available from device endpoint.
|
// return the raw number of bytes available.
|
||||||
// Note: this is related but not the same as number of stream bytes available.
|
// Note: this is related but not the same as number of stream bytes available.
|
||||||
uint32_t tuh_midi_read_available(uint8_t dev_addr);
|
uint32_t tuh_midi_read_available(uint8_t dev_addr);
|
||||||
|
|
||||||
|
// Send any queued packets to the device if the host hardware is able to do it
|
||||||
|
// Returns the number of bytes flushed to the host hardware or 0 if
|
||||||
|
// the host hardware is busy or there is nothing in queue to send.
|
||||||
|
uint32_t tuh_midi_write_flush( uint8_t dev_addr);
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Packet API
|
// Packet API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
// Read a raw MIDI packet from the connected device
|
// Read all available MIDI packets from the connected device
|
||||||
// This function does not parse the packet format
|
// Return number of bytes read (always multiple of 4)
|
||||||
// Return true if a packet was returned
|
uint32_t tuh_midi_packet_read_n(uint8_t dev_addr, uint8_t* buffer, uint32_t bufsize);
|
||||||
bool tuh_midi_packet_read (uint8_t dev_addr, uint8_t packet[4]);
|
|
||||||
|
|
||||||
// Queue a packet to the device. The application
|
// Read a raw MIDI packet from the connected device
|
||||||
// must call tuh_midi_stream_flush to actually have the
|
// Return true if a packet was returned
|
||||||
// data go out. It is up to the application to properly
|
TU_ATTR_ALWAYS_INLINE static inline
|
||||||
// format this packet; this function does not check.
|
bool tuh_midi_packet_read (uint8_t dev_addr, uint8_t packet[4]) {
|
||||||
|
return 4 == tuh_midi_packet_read_n(dev_addr, packet, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write all 4-byte packets, data is locally buffered and only transferred when buffered bytes
|
||||||
|
// reach the endpoint packet size or tuh_midi_write_flush() is called
|
||||||
|
uint32_t tuh_midi_packet_write_n(uint8_t dev_addr, const uint8_t* buffer, uint32_t bufsize);
|
||||||
|
|
||||||
|
// Write a 4-bytes packet to the device.
|
||||||
// Returns true if the packet was successfully queued.
|
// Returns true if the packet was successfully queued.
|
||||||
bool tuh_midi_packet_write (uint8_t dev_addr, uint8_t const packet[4]);
|
TU_ATTR_ALWAYS_INLINE static inline
|
||||||
|
bool tuh_midi_packet_write (uint8_t dev_addr, uint8_t const packet[4]) {
|
||||||
|
return 4 == tuh_midi_packet_write_n(dev_addr, packet, 4);
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Stream API
|
// Stream API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
#if CFG_TUH_MIDI_STREAM_API
|
||||||
|
|
||||||
// Queue a message to the device. The application
|
// Queue a message to the device using stream API. data is locally buffered and only transferred when buffered bytes
|
||||||
// must call tuh_midi_stream_flush to actually have the
|
// reach the endpoint packet size or tuh_midi_write_flush() is called
|
||||||
// data go out.
|
// Returns number of bytes was successfully queued.
|
||||||
uint32_t tuh_midi_stream_write (uint8_t dev_addr, uint8_t cable_num, uint8_t const* p_buffer, uint32_t bufsize);
|
uint32_t tuh_midi_stream_write (uint8_t dev_addr, uint8_t cable_num, uint8_t const* p_buffer, uint32_t bufsize);
|
||||||
|
|
||||||
// Send any queued packets to the device if the host hardware is able to do it
|
|
||||||
// Returns the number of bytes flushed to the host hardware or 0 if
|
|
||||||
// the host hardware is busy or there is nothing in queue to send.
|
|
||||||
uint32_t tuh_midi_stream_flush( uint8_t dev_addr);
|
|
||||||
|
|
||||||
// Get the MIDI stream from the device. Set the value pointed
|
// Get the MIDI stream from the device. Set the value pointed
|
||||||
// to by p_cable_num to the MIDI cable number intended to receive it.
|
// to by p_cable_num to the MIDI cable number intended to receive it.
|
||||||
// The MIDI stream will be stored in the buffer pointed to by p_buffer.
|
// The MIDI stream will be stored in the buffer pointed to by p_buffer.
|
||||||
@@ -117,6 +134,8 @@ uint32_t tuh_midi_stream_flush( uint8_t dev_addr);
|
|||||||
// it properly.
|
// it properly.
|
||||||
uint32_t tuh_midi_stream_read (uint8_t dev_addr, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize);
|
uint32_t tuh_midi_stream_read (uint8_t dev_addr, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Callbacks (Weak is optional)
|
// Callbacks (Weak is optional)
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@@ -144,4 +163,4 @@ void midih_close (uint8_t dev_addr);
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _TUSB_MIDI_HOST_H_ */
|
#endif
|
||||||
|
Reference in New Issue
Block a user