Skip to content

Commit 96ccf83

Browse files
committed
Fix some issues in midi ports
1 parent fb5e3e2 commit 96ccf83

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

OS/Framework/Midi/MidiPort.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,14 @@ uint16_t MidiPort::Open(uint16_t id, uint16_t queue_size, uint16_t id_range) {
2424
}
2525

2626
void 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

3237
void MidiPort::SetName(string name) {
@@ -43,16 +48,22 @@ bool MidiPort::Send(MidiPacket midipacket, uint16_t targetPort, uint32_t timeout
4348
}
4449

4550
bool 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

5768
MidiPort::MidiPort(string name, uint16_t id, uint16_t queue_size) {
5869
this->name = name;
@@ -69,7 +80,7 @@ MidiPort::~MidiPort() {
6980
}
7081

7182
bool 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

Comments
 (0)