From c9baf7671eb213076706578c01b31ff453045a93 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Wed, 26 Feb 2020 21:49:26 +0100 Subject: [PATCH] Changed the scoped timing to have 1 of 2 possible behaviors --- src/sfizz/Logger.cpp | 14 +++++++-- src/sfizz/Logger.h | 10 +++++-- src/sfizz/Synth.cpp | 67 ++++++++++++++++++++++---------------------- src/sfizz/Voice.cpp | 14 ++++----- 4 files changed, 60 insertions(+), 45 deletions(-) diff --git a/src/sfizz/Logger.cpp b/src/sfizz/Logger.cpp index 5ecb4f3b..75f274fe 100644 --- a/src/sfizz/Logger.cpp +++ b/src/sfizz/Logger.cpp @@ -155,13 +155,21 @@ void sfz::Logger::disableLogging() clearFlag.clear(); } -sfz::ScopedLogger::ScopedLogger(std::function)> 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; + } } diff --git a/src/sfizz/Logger.h b/src/sfizz/Logger.h index dbc3cf49..f14f8438 100644 --- a/src/sfizz/Logger.h +++ b/src/sfizz/Logger.h @@ -22,10 +22,16 @@ using Duration = std::chrono::duration; struct ScopedLogger { using TimePoint = std::chrono::time_point; + enum class Operation + { + addToDuration, + replaceDuration + }; ScopedLogger() = delete; - ScopedLogger(std::function callback); + ScopedLogger(Duration& targetDuration, Operation op = Operation::replaceDuration); ~ScopedLogger(); - const std::function callback; + Duration& targetDuration; + const Operation operation; const TimePoint creationTime { std::chrono::high_resolution_clock::now() }; }; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 63ef098f..a96cfd1a 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -410,38 +410,39 @@ void sfz::Synth::setSampleRate(float sampleRate) noexcept void sfz::Synth::renderBlock(AudioSpan 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(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(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 diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index 308dfde6..3b47ff9c 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -251,7 +251,7 @@ void sfz::Voice::renderBlock(AudioSpan buffer) noexcept initialDelay -= static_cast(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 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 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 buffer) noexcept } { // Panning and stereo processing - ScopedLogger logger { [&](auto&& duration){ panningDuration = duration; } }; + ScopedLogger logger { panningDuration }; // Prepare for stereo output copy(leftBuffer, rightBuffer); @@ -332,7 +332,7 @@ void sfz::Voice::processStereo(AudioSpan 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 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 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() };