| @@ -153,7 +153,7 @@ public: | |||||
| fHandle = fDescriptor->instantiate(&fHost); | fHandle = fDescriptor->instantiate(&fHost); | ||||
| CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | ||||
| carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2); | |||||
| carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents); | |||||
| carla_zeroStruct<NativeTimeInfo>(fTimeInfo); | carla_zeroStruct<NativeTimeInfo>(fTimeInfo); | ||||
| return true; | return true; | ||||
| @@ -196,7 +196,6 @@ public: | |||||
| fDescriptor->activate(fHandle); | fDescriptor->activate(fHandle); | ||||
| fMidiEventCount = 0; | fMidiEventCount = 0; | ||||
| carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2); | |||||
| carla_zeroStruct<NativeTimeInfo>(fTimeInfo); | carla_zeroStruct<NativeTimeInfo>(fTimeInfo); | ||||
| } | } | ||||
| else | else | ||||
| @@ -294,7 +293,7 @@ public: | |||||
| fMidiEvents[j].size = 3; | fMidiEvents[j].size = 3; | ||||
| for (uint32_t k=0; k<3; ++k) | for (uint32_t k=0; k<3; ++k) | ||||
| fMidiEvents[fMidiEventCount].data[k] = static_cast<uint8_t>(vstMidiEvent->midiData[k]); | |||||
| fMidiEvents[j].data[k] = static_cast<uint8_t>(vstMidiEvent->midiData[k]); | |||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| @@ -373,40 +372,12 @@ public: | |||||
| fTimeInfo.bbt.barStartTick = fTimeInfo.bbt.ticksPerBeat*fTimeInfo.bbt.beatsPerBar*(fTimeInfo.bbt.bar-1); | fTimeInfo.bbt.barStartTick = fTimeInfo.bbt.ticksPerBeat*fTimeInfo.bbt.beatsPerBar*(fTimeInfo.bbt.bar-1); | ||||
| } | } | ||||
| const uint32_t oldMidiEventCount(fMidiEventCount); | |||||
| fMidiOutEvents.numEvents = 0; | |||||
| if (fHandle != nullptr) | if (fHandle != nullptr) | ||||
| fDescriptor->process(fHandle, const_cast<float**>(inputs), outputs, static_cast<uint32_t>(sampleFrames), fMidiEvents, fMidiEventCount); | fDescriptor->process(fHandle, const_cast<float**>(inputs), outputs, static_cast<uint32_t>(sampleFrames), fMidiEvents, fMidiEventCount); | ||||
| const uint32_t newMidiEventCount(fMidiEventCount); | |||||
| fMidiEventCount = 0; | fMidiEventCount = 0; | ||||
| carla_zeroStruct<NativeMidiEvent>(fMidiEvents, kMaxMidiEvents*2); | |||||
| CARLA_SAFE_ASSERT_RETURN(newMidiEventCount == oldMidiEventCount,); | |||||
| fMidiOutEvents.numEvents = 0; | |||||
| // reverse lookup MIDI events | |||||
| for (uint32_t i = (kMaxMidiEvents*2)-1; i >= newMidiEventCount; --i) | |||||
| { | |||||
| if (fMidiEvents[i].data[0] == 0) | |||||
| break; | |||||
| NativeMidiEvent& midiEvent(fMidiEvents[i]); | |||||
| VstMidiEvent& vstMidiEvent(fMidiOutEvents.mdata[i]); | |||||
| vstMidiEvent.type = kVstMidiType; | |||||
| vstMidiEvent.byteSize = kVstMidiEventSize; | |||||
| uint8_t j=0; | |||||
| for (; j<midiEvent.size; ++j) | |||||
| vstMidiEvent.midiData[j] = static_cast<char>(midiEvent.data[j]); | |||||
| for (; j<4; ++j) | |||||
| vstMidiEvent.midiData[j] = 0; | |||||
| ++(fMidiOutEvents.numEvents); | |||||
| } | |||||
| if (fMidiOutEvents.numEvents > 0) | if (fMidiOutEvents.numEvents > 0) | ||||
| fAudioMaster(fEffect, audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f); | fAudioMaster(fEffect, audioMasterProcessEvents, 0, 0, &fMidiOutEvents, 0.0f); | ||||
| @@ -441,15 +412,19 @@ protected: | |||||
| CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); | CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); | ||||
| CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false); | CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false); | ||||
| // reverse-find first free event, and put it there | |||||
| for (uint32_t i=(kMaxMidiEvents*2)-1; i > fMidiEventCount; --i) | |||||
| { | |||||
| if (fMidiEvents[i].data[0] == 0) | |||||
| { | |||||
| std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); | |||||
| return true; | |||||
| } | |||||
| } | |||||
| if (fMidiOutEvents.numEvents >= static_cast<int32_t>(kMaxMidiEvents)) | |||||
| return false; | |||||
| VstMidiEvent& vstMidiEvent(fMidiOutEvents.mdata[fMidiOutEvents.numEvents++]); | |||||
| vstMidiEvent.type = kVstMidiType; | |||||
| vstMidiEvent.byteSize = kVstMidiEventSize; | |||||
| uint8_t i=0; | |||||
| for (; i<event->size; ++i) | |||||
| vstMidiEvent.midiData[i] = static_cast<char>(event->data[i]); | |||||
| for (; i<4; ++i) | |||||
| vstMidiEvent.midiData[i] = 0; | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -503,15 +478,15 @@ private: | |||||
| // Temporary data | // Temporary data | ||||
| uint32_t fMidiEventCount; | uint32_t fMidiEventCount; | ||||
| NativeMidiEvent fMidiEvents[kMaxMidiEvents*2]; | |||||
| NativeMidiEvent fMidiEvents[kMaxMidiEvents]; | |||||
| NativeTimeInfo fTimeInfo; | NativeTimeInfo fTimeInfo; | ||||
| ERect fVstRect; | ERect fVstRect; | ||||
| struct FixedVstEvents { | struct FixedVstEvents { | ||||
| int32_t numEvents; | int32_t numEvents; | ||||
| intptr_t reserved; | intptr_t reserved; | ||||
| VstEvent* data[kMaxMidiEvents*2]; | |||||
| VstMidiEvent mdata[kMaxMidiEvents*2]; | |||||
| VstEvent* data[kMaxMidiEvents]; | |||||
| VstMidiEvent mdata[kMaxMidiEvents]; | |||||
| FixedVstEvents() | FixedVstEvents() | ||||
| : numEvents(0), | : numEvents(0), | ||||
| @@ -519,9 +494,9 @@ private: | |||||
| data(), | data(), | ||||
| mdata() | mdata() | ||||
| { | { | ||||
| for (uint32_t i=0; i<kMaxMidiEvents*2; ++i) | |||||
| for (uint32_t i=0; i<kMaxMidiEvents; ++i) | |||||
| data[i] = (VstEvent*)&mdata[i]; | data[i] = (VstEvent*)&mdata[i]; | ||||
| carla_zeroStruct<VstMidiEvent>(mdata, kMaxMidiEvents*2); | |||||
| carla_zeroStruct<VstMidiEvent>(mdata, kMaxMidiEvents); | |||||
| } | } | ||||
| CARLA_DECLARE_NON_COPY_STRUCT(FixedVstEvents); | CARLA_DECLARE_NON_COPY_STRUCT(FixedVstEvents); | ||||