Changed the scoped timing to have 1 of 2 possible behaviors
This commit is contained in:
parent
1bb373cfa0
commit
c9baf7671e
4 changed files with 60 additions and 45 deletions
|
|
@ -155,13 +155,21 @@ void sfz::Logger::disableLogging()
|
|||
clearFlag.clear();
|
||||
}
|
||||
|
||||
sfz::ScopedLogger::ScopedLogger(std::function<void(std::chrono::duration<double>)> callback)
|
||||
: callback(std::move(callback))
|
||||
sfz::ScopedLogger::ScopedLogger(Duration& targetDuration, Operation operation)
|
||||
: targetDuration(targetDuration), operation(operation)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
sfz::ScopedLogger::~ScopedLogger()
|
||||
{
|
||||
callback(std::chrono::high_resolution_clock::now() - creationTime);
|
||||
switch(operation)
|
||||
{
|
||||
case(Operation::replaceDuration):
|
||||
targetDuration = std::chrono::high_resolution_clock::now() - creationTime;
|
||||
break;
|
||||
case(Operation::addToDuration):
|
||||
targetDuration += std::chrono::high_resolution_clock::now() - creationTime;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,10 +22,16 @@ using Duration = std::chrono::duration<double>;
|
|||
struct ScopedLogger
|
||||
{
|
||||
using TimePoint = std::chrono::time_point<std::chrono::high_resolution_clock>;
|
||||
enum class Operation
|
||||
{
|
||||
addToDuration,
|
||||
replaceDuration
|
||||
};
|
||||
ScopedLogger() = delete;
|
||||
ScopedLogger(std::function<void(Duration)> callback);
|
||||
ScopedLogger(Duration& targetDuration, Operation op = Operation::replaceDuration);
|
||||
~ScopedLogger();
|
||||
const std::function<void(Duration)> callback;
|
||||
Duration& targetDuration;
|
||||
const Operation operation;
|
||||
const TimePoint creationTime { std::chrono::high_resolution_clock::now() };
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -410,38 +410,39 @@ void sfz::Synth::setSampleRate(float sampleRate) noexcept
|
|||
void sfz::Synth::renderBlock(AudioSpan<float> buffer) noexcept
|
||||
{
|
||||
ScopedFTZ ftz;
|
||||
const auto callbackStartTime = std::chrono::high_resolution_clock::now();
|
||||
CallbackBreakdown callbackBreakdown;
|
||||
callbackBreakdown.dispatch = dispatchDuration;
|
||||
|
||||
buffer.fill(0.0f);
|
||||
|
||||
resources.filePool.cleanupPromises();
|
||||
|
||||
if (freeWheeling)
|
||||
resources.filePool.waitForBackgroundLoading();
|
||||
|
||||
AtomicGuard callbackGuard { inCallback };
|
||||
if (!canEnterCallback)
|
||||
return;
|
||||
|
||||
auto tempSpan = AudioSpan<float>(tempBuffer).first(buffer.getNumFrames());
|
||||
int numActiveVoices { 0 };
|
||||
for (auto& voice : voices) {
|
||||
if (!voice->isFree()) {
|
||||
numActiveVoices++;
|
||||
voice->renderBlock(tempSpan);
|
||||
buffer.add(tempSpan);
|
||||
callbackBreakdown.data += voice->getLastDataDuration();
|
||||
callbackBreakdown.amplitude += voice->getLastAmplitudeDuration();
|
||||
callbackBreakdown.filters += voice->getLastFilterDuration();
|
||||
callbackBreakdown.panning += voice->getLastPanningDuration();
|
||||
|
||||
{ // Main render block
|
||||
ScopedLogger logger { callbackBreakdown.renderMethod };
|
||||
buffer.fill(0.0f);
|
||||
|
||||
resources.filePool.cleanupPromises();
|
||||
|
||||
if (freeWheeling)
|
||||
resources.filePool.waitForBackgroundLoading();
|
||||
|
||||
AtomicGuard callbackGuard { inCallback };
|
||||
if (!canEnterCallback)
|
||||
return;
|
||||
|
||||
auto tempSpan = AudioSpan<float>(tempBuffer).first(buffer.getNumFrames());
|
||||
for (auto& voice : voices) {
|
||||
if (!voice->isFree()) {
|
||||
numActiveVoices++;
|
||||
voice->renderBlock(tempSpan);
|
||||
buffer.add(tempSpan);
|
||||
callbackBreakdown.data += voice->getLastDataDuration();
|
||||
callbackBreakdown.amplitude += voice->getLastAmplitudeDuration();
|
||||
callbackBreakdown.filters += voice->getLastFilterDuration();
|
||||
callbackBreakdown.panning += voice->getLastPanningDuration();
|
||||
}
|
||||
}
|
||||
|
||||
buffer.applyGain(db2mag(volume));
|
||||
}
|
||||
|
||||
buffer.applyGain(db2mag(volume));
|
||||
|
||||
callbackBreakdown.renderMethod = std::chrono::high_resolution_clock::now() - callbackStartTime;
|
||||
callbackBreakdown.dispatch = dispatchDuration;
|
||||
resources.logger.logCallbackTime(std::move(callbackBreakdown), numActiveVoices, buffer.getNumFrames());
|
||||
|
||||
// Reset the dispatch counter
|
||||
|
|
@ -453,7 +454,7 @@ void sfz::Synth::noteOn(int delay, int noteNumber, uint8_t velocity) noexcept
|
|||
ASSERT(noteNumber < 128);
|
||||
ASSERT(noteNumber >= 0);
|
||||
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
resources.midiState.noteOnEvent(noteNumber, velocity);
|
||||
|
||||
AtomicGuard callbackGuard { inCallback };
|
||||
|
|
@ -468,7 +469,7 @@ void sfz::Synth::noteOff(int delay, int noteNumber, uint8_t velocity [[maybe_unu
|
|||
ASSERT(noteNumber < 128);
|
||||
ASSERT(noteNumber >= 0);
|
||||
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
resources.midiState.noteOffEvent(noteNumber, velocity);
|
||||
|
||||
AtomicGuard callbackGuard { inCallback };
|
||||
|
|
@ -524,7 +525,7 @@ void sfz::Synth::cc(int delay, int ccNumber, uint8_t ccValue) noexcept
|
|||
ASSERT(ccNumber < config::numCCs);
|
||||
ASSERT(ccNumber >= 0);
|
||||
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
|
||||
resources.midiState.ccEvent(ccNumber, ccValue);
|
||||
|
||||
|
|
@ -556,7 +557,7 @@ void sfz::Synth::pitchWheel(int delay, int pitch) noexcept
|
|||
ASSERT(pitch <= 8192);
|
||||
ASSERT(pitch >= -8192);
|
||||
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
|
||||
resources.midiState.pitchBendEvent(pitch);
|
||||
|
||||
|
|
@ -570,11 +571,11 @@ void sfz::Synth::pitchWheel(int delay, int pitch) noexcept
|
|||
}
|
||||
void sfz::Synth::aftertouch(int /* delay */, uint8_t /* aftertouch */) noexcept
|
||||
{
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
}
|
||||
void sfz::Synth::tempo(int /* delay */, float /* secondsPerQuarter */) noexcept
|
||||
{
|
||||
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } };
|
||||
ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
|
||||
}
|
||||
|
||||
int sfz::Synth::getNumRegions() const noexcept
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ void sfz::Voice::renderBlock(AudioSpan<float> buffer) noexcept
|
|||
initialDelay -= static_cast<int>(delay);
|
||||
|
||||
{ // Fill buffer with raw data
|
||||
ScopedLogger logger { [&](auto&& duration){ dataDuration = duration; } };
|
||||
ScopedLogger logger { dataDuration };
|
||||
if (region->isGenerator())
|
||||
fillWithGenerator(delayed_buffer);
|
||||
else
|
||||
|
|
@ -279,7 +279,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
|
|||
auto modulationSpan = tempSpan1.first(numSamples);
|
||||
|
||||
{ // Amplitude processing
|
||||
ScopedLogger logger { [&](auto&& duration){ amplitudeDuration = duration; } };
|
||||
ScopedLogger logger { amplitudeDuration };
|
||||
|
||||
// Amplitude envelope
|
||||
amplitudeEnvelope.getBlock(modulationSpan);
|
||||
|
|
@ -299,7 +299,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
|
|||
}
|
||||
|
||||
{ // Filtering and EQ
|
||||
ScopedLogger logger { [&](auto&& duration){ filterDuration = duration; } };
|
||||
ScopedLogger logger { filterDuration };
|
||||
|
||||
const float* inputChannel[1] { leftBuffer.data() };
|
||||
float* outputChannel[1] { leftBuffer.data() };
|
||||
|
|
@ -313,7 +313,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
|
|||
}
|
||||
|
||||
{ // Panning and stereo processing
|
||||
ScopedLogger logger { [&](auto&& duration){ panningDuration = duration; } };
|
||||
ScopedLogger logger { panningDuration };
|
||||
|
||||
// Prepare for stereo output
|
||||
copy<float>(leftBuffer, rightBuffer);
|
||||
|
|
@ -332,7 +332,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
|
|||
auto rightBuffer = buffer.getSpan(1);
|
||||
|
||||
{ // Amplitude processing
|
||||
ScopedLogger logger { [&](auto&& duration){ amplitudeDuration = duration; } };
|
||||
ScopedLogger logger { amplitudeDuration };
|
||||
|
||||
// Amplitude envelope
|
||||
amplitudeEnvelope.getBlock(modulationSpan);
|
||||
|
|
@ -352,7 +352,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
|
|||
}
|
||||
|
||||
{ // Panning and stereo processing
|
||||
ScopedLogger logger { [&](auto&& duration){ panningDuration = duration; } };
|
||||
ScopedLogger logger { panningDuration };
|
||||
|
||||
// Apply the width/position process
|
||||
widthEnvelope.getBlock(modulationSpan);
|
||||
|
|
@ -362,7 +362,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
|
|||
}
|
||||
|
||||
{ // Filtering and EQ
|
||||
ScopedLogger logger { [&](auto&& duration){ filterDuration = duration; } };
|
||||
ScopedLogger logger { filterDuration };
|
||||
|
||||
const float* inputChannels[2] { leftBuffer.data(), rightBuffer.data() };
|
||||
float* outputChannels[2] { leftBuffer.data(), rightBuffer.data() };
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue