diff --git a/plugins/vst/CMakeLists.txt b/plugins/vst/CMakeLists.txt index 5bcede86..61ed870e 100644 --- a/plugins/vst/CMakeLists.txt +++ b/plugins/vst/CMakeLists.txt @@ -36,7 +36,7 @@ add_library(sfizz-vst3-core STATIC EXCLUDE_FROM_ALL SfizzVstUpdates.cpp SfizzVstIDs.h OrderedEventProcessor.h - OrderedEventProcessor.cpp + OrderedEventProcessor.hpp IdleUpdateHandler.h X11RunLoop.h X11RunLoop.cpp) diff --git a/plugins/vst/OrderedEventProcessor.h b/plugins/vst/OrderedEventProcessor.h index b13b3fa8..aa49c26d 100644 --- a/plugins/vst/OrderedEventProcessor.h +++ b/plugins/vst/OrderedEventProcessor.h @@ -12,6 +12,7 @@ using namespace Steinberg; +template class OrderedEventProcessor { public: virtual ~OrderedEventProcessor() {} @@ -19,10 +20,6 @@ public: void initializeEventProcessor(const Vst::ProcessSetup& setup, int32 paramCount, int32 subdivSize = 128); void processUnorderedEvents(int32 numSamples, Vst::IParameterChanges* pcs, Vst::IEventList* evs); -protected: - virtual void playOrderedParameter(int32 sampleOffset, Vst::ParamID id, Vst::ParamValue value) = 0; - virtual void playOrderedEvent(const Vst::Event& event) = 0; - private: void startProcessing(Vst::IEventList* evs, Vst::IParameterChanges* pcs); void processSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset); @@ -64,3 +61,5 @@ private: bool haveCurrentEvent_ = false; Vst::Event currentEvent_ {}; }; + +#include "OrderedEventProcessor.hpp" diff --git a/plugins/vst/OrderedEventProcessor.cpp b/plugins/vst/OrderedEventProcessor.hpp similarity index 85% rename from plugins/vst/OrderedEventProcessor.cpp rename to plugins/vst/OrderedEventProcessor.hpp index 548f079b..316eaf56 100644 --- a/plugins/vst/OrderedEventProcessor.cpp +++ b/plugins/vst/OrderedEventProcessor.hpp @@ -9,7 +9,8 @@ #include #include -void OrderedEventProcessor::initializeEventProcessor(const Vst::ProcessSetup& setup, int32 paramCount, int32 subdivSize) +template +void OrderedEventProcessor::initializeEventProcessor(const Vst::ProcessSetup& setup, int32 paramCount, int32 subdivSize) { paramCount_ = paramCount; subdivSize_ = subdivSize; @@ -18,7 +19,8 @@ void OrderedEventProcessor::initializeEventProcessor(const Vst::ProcessSetup& se numPointsBySample_.reset(new uint32[subdivSize]); } -void OrderedEventProcessor::processUnorderedEvents(int32 numSamples, Vst::IParameterChanges* pcs, Vst::IEventList* evs) +template +void OrderedEventProcessor::processUnorderedEvents(int32 numSamples, Vst::IParameterChanges* pcs, Vst::IEventList* evs) { int32 sampleIndex = 0; int32 subdivNumber = 0; @@ -36,7 +38,8 @@ void OrderedEventProcessor::processUnorderedEvents(int32 numSamples, Vst::IParam playRemainder(std::max(int32(0), numSamples - 1), evs); } -void OrderedEventProcessor::startProcessing(Vst::IEventList* evs, Vst::IParameterChanges* pcs) +template +void OrderedEventProcessor::startProcessing(Vst::IEventList* evs, Vst::IParameterChanges* pcs) { // collect the parameter queues which have values on them // push them onto a work list @@ -70,13 +73,15 @@ void OrderedEventProcessor::startProcessing(Vst::IEventList* evs, Vst::IParamete evs->getEvent(eventIndex_, currentEvent_) == kResultTrue; } -void OrderedEventProcessor::processSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset) +template +void OrderedEventProcessor::processSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset) { sortSubdiv(firstOffset, lastOffset); playSubdiv(evs, firstOffset, lastOffset); } -void OrderedEventProcessor::sortSubdiv(int32 firstOffset, int32 lastOffset) +template +void OrderedEventProcessor::sortSubdiv(int32 firstOffset, int32 lastOffset) { // this collects parameter changes from the subdivision that goes from // first offset to last offset, included. @@ -166,11 +171,14 @@ void OrderedEventProcessor::sortSubdiv(int32 firstOffset, int32 lastOffset) queueList_ = head; } -void OrderedEventProcessor::playSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset) +template +void OrderedEventProcessor::playSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset) { // go over the points in sample order, and play them intermittently with the // event queue according to the sample offsets. + R& receiver = *static_cast(this); + const int32 paramCount = paramCount_; const ParameterAndValue* pointsBySample = pointsBySample_.get(); const uint32* numPointsBySample = numPointsBySample_.get(); @@ -181,22 +189,25 @@ void OrderedEventProcessor::playSubdiv(Vst::IEventList* evs, int32 firstOffset, playEventsUpTo(evs, sampleOffset); for (int32 i = 0; i < listSize; ++i) { const ParameterAndValue item = listItems[i]; - playOrderedParameter(sampleOffset, item.id, item.value); + receiver.playOrderedParameter(sampleOffset, item.id, item.value); } } } -void OrderedEventProcessor::playRemainder(int32 sampleOffset, Vst::IEventList* evs) +template +void OrderedEventProcessor::playRemainder(int32 sampleOffset, Vst::IEventList* evs) { // play any remaining events and parameters in arbitrary order, // disregarding their respective offsets + R& receiver = *static_cast(this); + int32 eventIndex = eventIndex_; int32 eventCount = eventCount_; bool haveCurrentEvent = haveCurrentEvent_; while (haveCurrentEvent) { currentEvent_.sampleOffset = std::min(sampleOffset, currentEvent_.sampleOffset); - playOrderedEvent(currentEvent_); + receiver.playOrderedEvent(currentEvent_); haveCurrentEvent = false; while (!haveCurrentEvent && ++eventIndex < eventCount) haveCurrentEvent = evs->getEvent(eventIndex, currentEvent_) == kResultTrue; @@ -210,19 +221,22 @@ void OrderedEventProcessor::playRemainder(int32 sampleOffset, Vst::IEventList* e int32 unusedSampleOffset; Vst::ParamValue value; if (vq->getPoint(i, unusedSampleOffset, value) == kResultTrue) - playOrderedParameter(sampleOffset, id, value); + receiver.playOrderedParameter(sampleOffset, id, value); } } } -void OrderedEventProcessor::playEventsUpTo(Vst::IEventList* evs, int32 sampleOffset) +template +void OrderedEventProcessor::playEventsUpTo(Vst::IEventList* evs, int32 sampleOffset) { + R& receiver = *static_cast(this); + int32 index = eventIndex_; int32 count = eventCount_; bool haveCurrentEvent = haveCurrentEvent_; while (haveCurrentEvent && currentEvent_.sampleOffset <= sampleOffset) { - playOrderedEvent(currentEvent_); + receiver.playOrderedEvent(currentEvent_); haveCurrentEvent = false; while (!haveCurrentEvent && ++index < count) haveCurrentEvent = evs->getEvent(index, currentEvent_) == kResultTrue; diff --git a/plugins/vst/SfizzVstProcessor.h b/plugins/vst/SfizzVstProcessor.h index 30c5e607..d29b00ef 100644 --- a/plugins/vst/SfizzVstProcessor.h +++ b/plugins/vst/SfizzVstProcessor.h @@ -20,7 +20,7 @@ using namespace Steinberg; class SfizzVstProcessor : public Vst::AudioEffect, - public OrderedEventProcessor { + public OrderedEventProcessor { public: SfizzVstProcessor(); ~SfizzVstProcessor(); @@ -39,8 +39,8 @@ public: tresult PLUGIN_API process(Vst::ProcessData& data) override; // OrderedEventProcessor - void playOrderedParameter(int32 sampleOffset, Vst::ParamID id, Vst::ParamValue value) override; - void playOrderedEvent(const Vst::Event& event) override; + void playOrderedParameter(int32 sampleOffset, Vst::ParamID id, Vst::ParamValue value); + void playOrderedEvent(const Vst::Event& event); void processMessagesFromUi(); static int convertVelocityFromFloat(float x);