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(); clearFlag.clear();
} }
sfz::ScopedLogger::ScopedLogger(std::function<void(std::chrono::duration<double>)> callback) sfz::ScopedLogger::ScopedLogger(Duration& targetDuration, Operation operation)
: callback(std::move(callback)) : targetDuration(targetDuration), operation(operation)
{ {
} }
sfz::ScopedLogger::~ScopedLogger() 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 struct ScopedLogger
{ {
using TimePoint = std::chrono::time_point<std::chrono::high_resolution_clock>; using TimePoint = std::chrono::time_point<std::chrono::high_resolution_clock>;
enum class Operation
{
addToDuration,
replaceDuration
};
ScopedLogger() = delete; ScopedLogger() = delete;
ScopedLogger(std::function<void(Duration)> callback); ScopedLogger(Duration& targetDuration, Operation op = Operation::replaceDuration);
~ScopedLogger(); ~ScopedLogger();
const std::function<void(Duration)> callback; Duration& targetDuration;
const Operation operation;
const TimePoint creationTime { std::chrono::high_resolution_clock::now() }; const TimePoint creationTime { std::chrono::high_resolution_clock::now() };
}; };

View file

@ -410,10 +410,11 @@ void sfz::Synth::setSampleRate(float sampleRate) noexcept
void sfz::Synth::renderBlock(AudioSpan<float> buffer) noexcept void sfz::Synth::renderBlock(AudioSpan<float> buffer) noexcept
{ {
ScopedFTZ ftz; ScopedFTZ ftz;
const auto callbackStartTime = std::chrono::high_resolution_clock::now();
CallbackBreakdown callbackBreakdown; CallbackBreakdown callbackBreakdown;
callbackBreakdown.dispatch = dispatchDuration; int numActiveVoices { 0 };
{ // Main render block
ScopedLogger logger { callbackBreakdown.renderMethod };
buffer.fill(0.0f); buffer.fill(0.0f);
resources.filePool.cleanupPromises(); resources.filePool.cleanupPromises();
@ -426,7 +427,6 @@ void sfz::Synth::renderBlock(AudioSpan<float> buffer) noexcept
return; return;
auto tempSpan = AudioSpan<float>(tempBuffer).first(buffer.getNumFrames()); auto tempSpan = AudioSpan<float>(tempBuffer).first(buffer.getNumFrames());
int numActiveVoices { 0 };
for (auto& voice : voices) { for (auto& voice : voices) {
if (!voice->isFree()) { if (!voice->isFree()) {
numActiveVoices++; numActiveVoices++;
@ -440,8 +440,9 @@ void sfz::Synth::renderBlock(AudioSpan<float> buffer) noexcept
} }
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()); resources.logger.logCallbackTime(std::move(callbackBreakdown), numActiveVoices, buffer.getNumFrames());
// Reset the dispatch counter // 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 < 128);
ASSERT(noteNumber >= 0); ASSERT(noteNumber >= 0);
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } }; ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
resources.midiState.noteOnEvent(noteNumber, velocity); resources.midiState.noteOnEvent(noteNumber, velocity);
AtomicGuard callbackGuard { inCallback }; 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 < 128);
ASSERT(noteNumber >= 0); ASSERT(noteNumber >= 0);
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } }; ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
resources.midiState.noteOffEvent(noteNumber, velocity); resources.midiState.noteOffEvent(noteNumber, velocity);
AtomicGuard callbackGuard { inCallback }; 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 < config::numCCs);
ASSERT(ccNumber >= 0); ASSERT(ccNumber >= 0);
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } }; ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
resources.midiState.ccEvent(ccNumber, ccValue); resources.midiState.ccEvent(ccNumber, ccValue);
@ -556,7 +557,7 @@ void sfz::Synth::pitchWheel(int delay, int pitch) noexcept
ASSERT(pitch <= 8192); ASSERT(pitch <= 8192);
ASSERT(pitch >= -8192); ASSERT(pitch >= -8192);
ScopedLogger logger { [this](auto&& duration){ dispatchDuration += duration; } }; ScopedLogger logger { dispatchDuration, ScopedLogger::Operation::addToDuration };
resources.midiState.pitchBendEvent(pitch); 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 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 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 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); initialDelay -= static_cast<int>(delay);
{ // Fill buffer with raw data { // Fill buffer with raw data
ScopedLogger logger { [&](auto&& duration){ dataDuration = duration; } }; ScopedLogger logger { dataDuration };
if (region->isGenerator()) if (region->isGenerator())
fillWithGenerator(delayed_buffer); fillWithGenerator(delayed_buffer);
else else
@ -279,7 +279,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
auto modulationSpan = tempSpan1.first(numSamples); auto modulationSpan = tempSpan1.first(numSamples);
{ // Amplitude processing { // Amplitude processing
ScopedLogger logger { [&](auto&& duration){ amplitudeDuration = duration; } }; ScopedLogger logger { amplitudeDuration };
// Amplitude envelope // Amplitude envelope
amplitudeEnvelope.getBlock(modulationSpan); amplitudeEnvelope.getBlock(modulationSpan);
@ -299,7 +299,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
} }
{ // Filtering and EQ { // Filtering and EQ
ScopedLogger logger { [&](auto&& duration){ filterDuration = duration; } }; ScopedLogger logger { filterDuration };
const float* inputChannel[1] { leftBuffer.data() }; const float* inputChannel[1] { leftBuffer.data() };
float* outputChannel[1] { leftBuffer.data() }; float* outputChannel[1] { leftBuffer.data() };
@ -313,7 +313,7 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
} }
{ // Panning and stereo processing { // Panning and stereo processing
ScopedLogger logger { [&](auto&& duration){ panningDuration = duration; } }; ScopedLogger logger { panningDuration };
// Prepare for stereo output // Prepare for stereo output
copy<float>(leftBuffer, rightBuffer); copy<float>(leftBuffer, rightBuffer);
@ -332,7 +332,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
auto rightBuffer = buffer.getSpan(1); auto rightBuffer = buffer.getSpan(1);
{ // Amplitude processing { // Amplitude processing
ScopedLogger logger { [&](auto&& duration){ amplitudeDuration = duration; } }; ScopedLogger logger { amplitudeDuration };
// Amplitude envelope // Amplitude envelope
amplitudeEnvelope.getBlock(modulationSpan); amplitudeEnvelope.getBlock(modulationSpan);
@ -352,7 +352,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
} }
{ // Panning and stereo processing { // Panning and stereo processing
ScopedLogger logger { [&](auto&& duration){ panningDuration = duration; } }; ScopedLogger logger { panningDuration };
// Apply the width/position process // Apply the width/position process
widthEnvelope.getBlock(modulationSpan); widthEnvelope.getBlock(modulationSpan);
@ -362,7 +362,7 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
} }
{ // Filtering and EQ { // Filtering and EQ
ScopedLogger logger { [&](auto&& duration){ filterDuration = duration; } }; ScopedLogger logger { filterDuration };
const float* inputChannels[2] { leftBuffer.data(), rightBuffer.data() }; const float* inputChannels[2] { leftBuffer.data(), rightBuffer.data() };
float* outputChannels[2] { leftBuffer.data(), rightBuffer.data() }; float* outputChannels[2] { leftBuffer.data(), rightBuffer.data() };