From 67a13be6c622694f504d48d15f303656f08b6eda Mon Sep 17 00:00:00 2001 From: Francois Best Date: Sun, 4 Nov 2018 14:17:07 +0100 Subject: [PATCH] fix: Use USB packet interface in the transport layer --- src/midi_UsbTransport.h | 14 +----- src/midi_UsbTransport.hpp | 100 +++++--------------------------------- 2 files changed, 13 insertions(+), 101 deletions(-) diff --git a/src/midi_UsbTransport.h b/src/midi_UsbTransport.h index a1556f5..eb869e9 100644 --- a/src/midi_UsbTransport.h +++ b/src/midi_UsbTransport.h @@ -29,6 +29,7 @@ #include "midi_Defs.h" #include "midi_RingBuffer.h" +#include "midi_UsbPacketInterface.h" #include BEGIN_MIDI_NAMESPACE @@ -47,24 +48,13 @@ public: // Serial / Stream API required for template compatibility inline void write(byte inData); private: - inline bool pollUsbMidi(); + inline void pollUsbMidi(); inline void recomposeAndSendTxPackets(); - inline void resetTx(); - static inline byte encodePacketHeader(StatusByte inStatusByte); - static inline int getPacketLength(const midiEventPacket_t& inPacket); private: typedef RingBuffer Buffer; Buffer mTxBuffer; Buffer mRxBuffer; - - union TxPacket - { - byte mDataArray[4]; - midiEventPacket_t mPacket; - }; - TxPacket mCurrentTxPacket; - int mCurrentTxPacketByteIndex; }; END_MIDI_NAMESPACE diff --git a/src/midi_UsbTransport.hpp b/src/midi_UsbTransport.hpp index 2a02c41..5159433 100644 --- a/src/midi_UsbTransport.hpp +++ b/src/midi_UsbTransport.hpp @@ -73,108 +73,30 @@ inline void UsbTransport::write(byte inData) // ----------------------------------------------------------------------------- template -inline bool UsbTransport::pollUsbMidi() +inline void UsbTransport::pollUsbMidi() { - bool received = false; midiEventPacket_t packet = MidiUSB.read(); while (packet.header != 0) { - received = true; - - switch (packet.header << 4) - { - // 3 bytes messages - case midi::NoteOff: - case midi::NoteOn: - case midi::AfterTouchPoly: - case midi::ControlChange: - case midi::PitchBend: - mRxBuffer.write(packet.byte1); - mRxBuffer.write(packet.byte2); - mRxBuffer.write(packet.byte3); - break; - - // 2 bytes messages - case midi::ProgramChange: - case midi::AfterTouchChannel: - mRxBuffer.write(packet.byte1); - mRxBuffer.write(packet.byte2); - break; - - // 1 byte message - case midi::TuneRequest: - case midi::Clock: - case midi::Start: - case midi::Continue: - case midi::Stop: - case midi::ActiveSensing: - case midi::SystemReset: - mRxBuffer.write(packet.byte1); - break; - - // Special cases - // case midi::SystemExclusive: - // case midi::TimeCodeQuarterFrame: - // case midi::SongPosition: - // case midi::SongSelect: - // break; - - default: - break; - } - + serialiseRxPacket(packet, mRxBuffer); packet = MidiUSB.read(); } - return received; } template inline void UsbTransport::recomposeAndSendTxPackets() { - while (!mTxBuffer.isEmpty()) + midiEventPacket_t packet; + bool sent = false; + while (composeTxPacket(mTxBuffer, packet)) { - const byte data = mTxBuffer.read(); - if (mCurrentTxPacketByteIndex == 0) - { - mCurrentTxPacket.mPacket.header = encodePacketHeader(data); - } - else - { - mCurrentTxPacket.mDataArray[mCurrentTxPacketByteIndex] = data; - } - mCurrentTxPacketByteIndex++; - - const int packetLength = getPacketLength(mCurrentTxPacket.mPacket); - - if (mCurrentTxPacketByteIndex == packetLength) - { - MidiUSB.write(mCurrentTxPacket.mDataArray, packetLength); - resetTx(); - } + MidiUSB.sendMIDI(packet); + sent = true; + } + if (sent) + { + MidiUSB.flush(); } } -template -inline void UsbTransport::resetTx() -{ - mCurrentTxPacket.mPacket.header = 0; - mCurrentTxPacket.mPacket.byte1 = 0; - mCurrentTxPacket.mPacket.byte2 = 0; - mCurrentTxPacket.mPacket.byte3 = 0; - mCurrentTxPacketByteIndex = 0; -} - -template -inline byte UsbTransport::encodePacketHeader(StatusByte inStatusByte) -{ - // todo: fix me for other types than channel - return inStatusByte >> 4; -} - -template -inline int UsbTransport::getPacketLength(const midiEventPacket_t& inPacket) -{ - return 3; -} - END_MIDI_NAMESPACE