@@ -24,9 +24,14 @@ uint16_t MidiPort::Open(uint16_t id, uint16_t queue_size, uint16_t id_range) {
2424}
2525
2626void MidiPort::Close () {
27- MidiPort::CloseMidiPort (id);
28- this ->id = MIDI_PORT_INVALID;
29- vQueueDelete (midi_queue);
27+ if (id != MIDI_PORT_INVALID) {
28+ MidiPort::CloseMidiPort (id);
29+ this ->id = MIDI_PORT_INVALID;
30+ }
31+ if (midi_queue != nullptr ) {
32+ vQueueDelete (midi_queue);
33+ midi_queue = nullptr ;
34+ }
3035}
3136
3237void MidiPort::SetName (string name) {
@@ -43,16 +48,22 @@ bool MidiPort::Send(MidiPacket midipacket, uint16_t targetPort, uint32_t timeout
4348}
4449
4550bool MidiPort::Receive (MidiPacket midipacket, uint32_t timeout_ms) {
51+ if (midi_queue == nullptr )
52+ return false ;
53+
4654 if (uxQueueSpacesAvailable (midi_queue) == 0 )
4755 {
48- // TODO: Drop first element
49- return false ;
56+ // Drop oldest packet to make room for new one (FIFO overflow behavior)
57+ MidiPacket discarded;
58+ xQueueReceive (midi_queue, &discarded, 0 );
5059 }
5160 xQueueSend (midi_queue, &midipacket, pdMS_TO_TICKS (timeout_ms));
5261 return true ;
5362}
5463
55- MidiPort::MidiPort () {}
64+ MidiPort::MidiPort () {
65+ midi_queue = nullptr ;
66+ }
5667
5768MidiPort::MidiPort (string name, uint16_t id, uint16_t queue_size) {
5869 this ->name = name;
@@ -69,7 +80,7 @@ MidiPort::~MidiPort() {
6980}
7081
7182bool MidiPort::OpenMidiPort (uint16_t port_id, MidiPort* midiPort) {
72- if (port_id < 0x100 )
83+ if (port_id < 0x100 || midiPort == nullptr )
7384 return false ;
7485
7586 if (midiPortMap.find (port_id) == midiPortMap.end ())
0 commit comments