|
-
-
- #include <Arduino.h>
- #include "USBHost.h"
-
-
- MIDIDevice::MIDIDevice()
- {
- contribute_Pipes(mypipes, sizeof(mypipes)/sizeof(Pipe_t));
- contribute_Transfers(mytransfers, sizeof(mytransfers)/sizeof(Transfer_t));
- driver_ready_for_device(this);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool MIDIDevice::claim(Device_t *dev, int type, const uint8_t *descriptors, uint32_t len)
- {
-
-
- if (type != 1) return false;
- println("MIDIDevice claim this=", (uint32_t)this, HEX);
- println("len = ", len);
-
- const uint8_t *p = descriptors;
- const uint8_t *end = p + len;
-
- if (p[0] != 9 || p[1] != 4) return false;
-
-
- if (p[5] != 1) return false;
- if (p[6] != 3) return false;
- p += 9;
- println(" Interface is MIDI");
- rx_ep = 0;
- tx_ep = 0;
-
- while (p < end) {
- len = *p;
- if (len < 4) return false;
- if (p + len > end) return false;
- uint32_t type = p[1];
-
- if (type == 4 || type == 11) break;
- if (type == 0x24) {
- uint32_t subtype = p[2];
-
- if (subtype == 1) {
-
- println(" MIDI Header (ignored)");
- } else if (subtype == 2) {
-
- println(" MIDI IN Jack (ignored)");
- } else if (subtype == 3) {
-
- println(" MIDI OUT Jack (ignored)");
- } else if (subtype == 4) {
-
- println(" MIDI Element (ignored)");
- } else {
- return false;
- }
- } else if (type == 5) {
-
- if (p[0] < 7) return false;
- if (p[3] != 2) return false;
- println(" MIDI Endpoint: ", p[2], HEX);
- switch (p[2] & 0xF0) {
- case 0x80:
-
- if (rx_ep == 0) {
- rx_ep = p[2] & 0x0F;
- rx_size = p[4] | (p[5] << 8);
- println(" rx_size = ", rx_size);
- }
- break;
- case 0x00:
-
- if (tx_ep == 0) {
- tx_ep = p[2];
- tx_size = p[4] | (p[5] << 8);
- println(" tx_size = ", tx_size);
- }
- break;
- default:
- return false;
- }
- } else if (type == 37) {
-
- println(" MIDI Endpoint Jack Association (ignored)");
- } else {
- return false;
- }
- p += len;
- }
-
- if (rx_ep && rx_size <= BUFFERSIZE) {
- rxpipe = new_Pipe(dev, 2, rx_ep, 1, rx_size);
- if (rxpipe) {
- rxpipe->callback_function = rx_callback;
- queue_Data_Transfer(rxpipe, buffer, rx_size, this);
- }
- } else {
- rxpipe = NULL;
- }
-
- if (tx_ep && tx_size <= BUFFERSIZE) {
- txpipe = new_Pipe(dev, 2, tx_ep, 0, tx_size);
- if (txpipe) {
- txpipe->callback_function = tx_callback;
- }
- } else {
- rxpipe = NULL;
- }
-
- return (rxpipe || txpipe);
- }
-
- void MIDIDevice::rx_callback(const Transfer_t *transfer)
- {
- if (transfer->driver) {
- ((MIDIDevice *)(transfer->driver))->rx_data(transfer);
- }
- }
-
- void MIDIDevice::tx_callback(const Transfer_t *transfer)
- {
- if (transfer->driver) {
- ((MIDIDevice *)(transfer->driver))->tx_data(transfer);
- }
- }
-
- void MIDIDevice::rx_data(const Transfer_t *transfer)
- {
- println("MIDIDevice Receive");
- print(" MIDI Data: ");
- print_hexbytes(transfer->buffer, rx_size);
-
- queue_Data_Transfer(rxpipe, buffer, rx_size, this);
- }
-
- void MIDIDevice::tx_data(const Transfer_t *transfer)
- {
- println("MIDIDevice transmit complete");
- print(" MIDI Data: ");
- print_hexbytes(transfer->buffer, tx_size);
-
- }
-
-
- void MIDIDevice::disconnect()
- {
-
- }
-
-
|