|
|
@@ -167,15 +167,19 @@ protected: |
|
|
|
|
|
|
|
fInEvents.appendRT(rawMidiEvent); |
|
|
|
} |
|
|
|
|
|
|
|
if (fInEvents.mutex.tryLock()) |
|
|
|
{ |
|
|
|
fInEvents.splice(); |
|
|
|
fInEvents.mutex.unlock(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (! fMutex.tryLock()) |
|
|
|
if (! timePos->playing) |
|
|
|
return; |
|
|
|
if (! fOutEvents.mutex.tryLock()) |
|
|
|
return; |
|
|
|
|
|
|
|
if (fWantInEvents) |
|
|
|
fInEvents.splice(); |
|
|
|
|
|
|
|
if (timePos->playing) |
|
|
|
{ |
|
|
|
MidiEvent midiEvent; |
|
|
|
|
|
|
@@ -196,14 +200,14 @@ protected: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fMutex.unlock(); |
|
|
|
fOutEvents.mutex.unlock(); |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
CarlaMutex fMutex; |
|
|
|
bool fWantInEvents; |
|
|
|
bool fWantInEvents; |
|
|
|
|
|
|
|
struct InRtEvents { |
|
|
|
CarlaMutex mutex; |
|
|
|
RtList<RawMidiEvent>::Pool dataPool; |
|
|
|
RtList<RawMidiEvent> data; |
|
|
|
RtList<RawMidiEvent> dataPendingRT; |
|
|
@@ -237,8 +241,33 @@ private: |
|
|
|
} fInEvents; |
|
|
|
|
|
|
|
struct OutRtEvents { |
|
|
|
CarlaMutex mutex; |
|
|
|
NonRtList<RawMidiEvent*> data; |
|
|
|
|
|
|
|
void appendAt(RawMidiEvent* event, uint32_t time) |
|
|
|
{ |
|
|
|
if (data.isEmpty()) |
|
|
|
{ |
|
|
|
mutex.lock(); |
|
|
|
data.append(event); |
|
|
|
mutex.unlock(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
for (auto it = data.begin(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
RawMidiEvent* const oldEvent(*it); |
|
|
|
|
|
|
|
if (time > oldEvent->time) |
|
|
|
{ |
|
|
|
mutex.lock(); |
|
|
|
data.appendAt(event, it); |
|
|
|
mutex.unlock(); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void addControl(uint32_t time, uint8_t channel, uint8_t control, uint8_t value) |
|
|
|
{ |
|
|
|
RawMidiEvent* ctrlEvent(new RawMidiEvent); |
|
|
@@ -247,7 +276,7 @@ private: |
|
|
|
ctrlEvent->data[2] = value; |
|
|
|
ctrlEvent->time = time; |
|
|
|
|
|
|
|
data.append(ctrlEvent); |
|
|
|
appendAt(ctrlEvent, time); |
|
|
|
} |
|
|
|
|
|
|
|
void addProgram(uint32_t time, uint8_t channel, uint8_t bank, uint8_t program) |
|
|
@@ -264,8 +293,8 @@ private: |
|
|
|
programEvent->data[2] = 0; |
|
|
|
programEvent->time = time; |
|
|
|
|
|
|
|
data.append(bankEvent); |
|
|
|
data.append(programEvent); |
|
|
|
appendAt(bankEvent, time); |
|
|
|
appendAt(programEvent, time); |
|
|
|
} |
|
|
|
|
|
|
|
void addNote(uint32_t time, uint8_t channel, uint8_t pitch, uint8_t velocity, uint32_t duration) |
|
|
@@ -282,8 +311,8 @@ private: |
|
|
|
noteOffEvent->data[2] = velocity; |
|
|
|
noteOffEvent->time = time+duration; |
|
|
|
|
|
|
|
data.append(noteOnEvent); |
|
|
|
data.append(noteOffEvent); |
|
|
|
appendAt(noteOnEvent, time); |
|
|
|
appendAt(noteOffEvent, time+duration); |
|
|
|
} |
|
|
|
|
|
|
|
} fOutEvents; |
|
|
|