Changed the scoped timing to have 1 of 2 possible behaviors

This commit is contained in:
Paul Fd 2020-02-26 21:49:26 +01:00
parent 1bb373cfa0
commit c9baf7671e
4 changed files with 60 additions and 45 deletions

View file

@ -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;
}
}

View file

@ -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() };
};

View file

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

View file

@ -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() };