From 5406145ec8178841de1170a93b519c78fe0adc18 Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 5 Mar 2013 11:19:24 +0000 Subject: [PATCH] Fix midiseq plugin event ordering --- source/backend/native/midi-sequencer.cpp | 47 +++++++----------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/source/backend/native/midi-sequencer.cpp b/source/backend/native/midi-sequencer.cpp index 6a52f30e5..64906411e 100644 --- a/source/backend/native/midi-sequencer.cpp +++ b/source/backend/native/midi-sequencer.cpp @@ -136,13 +136,6 @@ public: addNote(2304*m, 0, 64, 90, 650*m); addNote(3072*m, 0, 62, 90, 325*m); addNote(3456*m, 0, 62, 90, 325*m); - - for (auto it = fData.begin(); it.valid(); it.next()) - { - const RawMidiEvent* const rawMidiEvent(*it); - - carla_stdout("Got event %02X @%i", rawMidiEvent->data[0], rawMidiEvent->time); - } } ~MidiPattern() @@ -159,7 +152,7 @@ public: ctrlEvent->size = 3; ctrlEvent->time = time; - appendAt(ctrlEvent, time); + append(ctrlEvent); } void addProgram(const uint32_t time, const uint8_t channel, const uint8_t bank, const uint8_t program) @@ -177,8 +170,8 @@ public: programEvent->size = 2; programEvent->time = time; - appendAt(bankEvent, time); - appendAt(programEvent, time); + append(bankEvent); + append(programEvent); } void addNote(const uint32_t time, const uint8_t channel, const uint8_t pitch, const uint8_t velocity, const uint32_t duration) @@ -197,8 +190,8 @@ public: noteOffEvent->size = 3; noteOffEvent->time = time+duration; - appendAt(noteOnEvent, time); - appendAt(noteOffEvent, time+duration); + append(noteOnEvent); + append(noteOffEvent); } void play(uint32_t timePosFrame, uint32_t frames) @@ -238,41 +231,29 @@ private: CarlaMutex fMutex; NonRtList fData; - void appendAt(const RawMidiEvent* const event, const uint32_t time) + void append(const RawMidiEvent* const event) { if (fData.isEmpty()) { - fMutex.lock(); + const CarlaMutex::ScopedLocker sl(&fMutex); fData.append(event); - fMutex.unlock(); return; } - uint32_t lastTime = 0; - for (auto it = fData.begin(); it.valid(); it.next()) { const RawMidiEvent* const oldEvent(*it); - if (lastTime > time) - { - fMutex.lock(); - fData.insertAt(event, it); - fMutex.unlock(); - return; - } + if (event->time >= oldEvent->time) + continue; - lastTime = oldEvent->time; + const CarlaMutex::ScopedLocker sl(&fMutex); + fData.insertAt(event, it); + return; } - if (time >= lastTime) - { - fMutex.lock(); - fData.append(event); - fMutex.unlock(); - } - else - carla_stderr2("MidiPattern::appendAt() failed for time %i", time); + const CarlaMutex::ScopedLocker sl(&fMutex); + fData.append(event); } void writeMidiEvent(const MidiEvent* const event)