fix: Use USB packet interface in the transport layer
This commit is contained in:
parent
5ccf0159a2
commit
67a13be6c6
|
|
@ -29,6 +29,7 @@
|
||||||
|
|
||||||
#include "midi_Defs.h"
|
#include "midi_Defs.h"
|
||||||
#include "midi_RingBuffer.h"
|
#include "midi_RingBuffer.h"
|
||||||
|
#include "midi_UsbPacketInterface.h"
|
||||||
#include <MIDIUSB.h>
|
#include <MIDIUSB.h>
|
||||||
|
|
||||||
BEGIN_MIDI_NAMESPACE
|
BEGIN_MIDI_NAMESPACE
|
||||||
|
|
@ -47,24 +48,13 @@ public: // Serial / Stream API required for template compatibility
|
||||||
inline void write(byte inData);
|
inline void write(byte inData);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline bool pollUsbMidi();
|
inline void pollUsbMidi();
|
||||||
inline void recomposeAndSendTxPackets();
|
inline void recomposeAndSendTxPackets();
|
||||||
inline void resetTx();
|
|
||||||
static inline byte encodePacketHeader(StatusByte inStatusByte);
|
|
||||||
static inline int getPacketLength(const midiEventPacket_t& inPacket);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef RingBuffer<byte, BuffersSize> Buffer;
|
typedef RingBuffer<byte, BuffersSize> Buffer;
|
||||||
Buffer mTxBuffer;
|
Buffer mTxBuffer;
|
||||||
Buffer mRxBuffer;
|
Buffer mRxBuffer;
|
||||||
|
|
||||||
union TxPacket
|
|
||||||
{
|
|
||||||
byte mDataArray[4];
|
|
||||||
midiEventPacket_t mPacket;
|
|
||||||
};
|
|
||||||
TxPacket mCurrentTxPacket;
|
|
||||||
int mCurrentTxPacketByteIndex;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
END_MIDI_NAMESPACE
|
END_MIDI_NAMESPACE
|
||||||
|
|
|
||||||
|
|
@ -73,108 +73,30 @@ inline void UsbTransport<BufferSize>::write(byte inData)
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
template<unsigned BufferSize>
|
template<unsigned BufferSize>
|
||||||
inline bool UsbTransport<BufferSize>::pollUsbMidi()
|
inline void UsbTransport<BufferSize>::pollUsbMidi()
|
||||||
{
|
{
|
||||||
bool received = false;
|
|
||||||
midiEventPacket_t packet = MidiUSB.read();
|
midiEventPacket_t packet = MidiUSB.read();
|
||||||
while (packet.header != 0)
|
while (packet.header != 0)
|
||||||
{
|
{
|
||||||
received = true;
|
serialiseRxPacket(packet, mRxBuffer);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
packet = MidiUSB.read();
|
packet = MidiUSB.read();
|
||||||
}
|
}
|
||||||
return received;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<unsigned BufferSize>
|
template<unsigned BufferSize>
|
||||||
inline void UsbTransport<BufferSize>::recomposeAndSendTxPackets()
|
inline void UsbTransport<BufferSize>::recomposeAndSendTxPackets()
|
||||||
{
|
{
|
||||||
while (!mTxBuffer.isEmpty())
|
midiEventPacket_t packet;
|
||||||
|
bool sent = false;
|
||||||
|
while (composeTxPacket(mTxBuffer, packet))
|
||||||
{
|
{
|
||||||
const byte data = mTxBuffer.read();
|
MidiUSB.sendMIDI(packet);
|
||||||
if (mCurrentTxPacketByteIndex == 0)
|
sent = true;
|
||||||
|
}
|
||||||
|
if (sent)
|
||||||
{
|
{
|
||||||
mCurrentTxPacket.mPacket.header = encodePacketHeader(data);
|
MidiUSB.flush();
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
mCurrentTxPacket.mDataArray[mCurrentTxPacketByteIndex] = data;
|
|
||||||
}
|
|
||||||
mCurrentTxPacketByteIndex++;
|
|
||||||
|
|
||||||
const int packetLength = getPacketLength(mCurrentTxPacket.mPacket);
|
|
||||||
|
|
||||||
if (mCurrentTxPacketByteIndex == packetLength)
|
|
||||||
{
|
|
||||||
MidiUSB.write(mCurrentTxPacket.mDataArray, packetLength);
|
|
||||||
resetTx();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<unsigned BufferSize>
|
|
||||||
inline void UsbTransport<BufferSize>::resetTx()
|
|
||||||
{
|
|
||||||
mCurrentTxPacket.mPacket.header = 0;
|
|
||||||
mCurrentTxPacket.mPacket.byte1 = 0;
|
|
||||||
mCurrentTxPacket.mPacket.byte2 = 0;
|
|
||||||
mCurrentTxPacket.mPacket.byte3 = 0;
|
|
||||||
mCurrentTxPacketByteIndex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<unsigned BufferSize>
|
|
||||||
inline byte UsbTransport<BufferSize>::encodePacketHeader(StatusByte inStatusByte)
|
|
||||||
{
|
|
||||||
// todo: fix me for other types than channel
|
|
||||||
return inStatusByte >> 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<unsigned BufferSize>
|
|
||||||
inline int UsbTransport<BufferSize>::getPacketLength(const midiEventPacket_t& inPacket)
|
|
||||||
{
|
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
END_MIDI_NAMESPACE
|
END_MIDI_NAMESPACE
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue