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