Merge pull request #810 from jpcima/devirtualize

Devirtualize OrderedEventProcessor
This commit is contained in:
JP Cimalando 2021-04-10 15:17:50 +02:00 committed by GitHub
commit be20a65c41
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 20 deletions

View file

@ -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)

View file

@ -12,6 +12,7 @@
using namespace Steinberg;
template <class R>
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"

View file

@ -9,7 +9,8 @@
#include <cstdio>
#include <cassert>
void OrderedEventProcessor::initializeEventProcessor(const Vst::ProcessSetup& setup, int32 paramCount, int32 subdivSize)
template <class R>
void OrderedEventProcessor<R>::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 <class R>
void OrderedEventProcessor<R>::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 <class R>
void OrderedEventProcessor<R>::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 <class R>
void OrderedEventProcessor<R>::processSubdiv(Vst::IEventList* evs, int32 firstOffset, int32 lastOffset)
{
sortSubdiv(firstOffset, lastOffset);
playSubdiv(evs, firstOffset, lastOffset);
}
void OrderedEventProcessor::sortSubdiv(int32 firstOffset, int32 lastOffset)
template <class R>
void OrderedEventProcessor<R>::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 <class R>
void OrderedEventProcessor<R>::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<R*>(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 <class R>
void OrderedEventProcessor<R>::playRemainder(int32 sampleOffset, Vst::IEventList* evs)
{
// play any remaining events and parameters in arbitrary order,
// disregarding their respective offsets
R& receiver = *static_cast<R*>(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 <class R>
void OrderedEventProcessor<R>::playEventsUpTo(Vst::IEventList* evs, int32 sampleOffset)
{
R& receiver = *static_cast<R*>(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;

View file

@ -20,7 +20,7 @@
using namespace Steinberg;
class SfizzVstProcessor : public Vst::AudioEffect,
public OrderedEventProcessor {
public OrderedEventProcessor<SfizzVstProcessor> {
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);