Use the bufferpool in the voices

This commit is contained in:
Paul Ferrand 2020-03-29 18:09:39 +02:00
parent c1266e5d70
commit 8ed3d16b8c
2 changed files with 35 additions and 30 deletions

View file

@ -257,14 +257,6 @@ void sfz::Voice::setSamplesPerBlock(int samplesPerBlock) noexcept
{ {
this->samplesPerBlock = samplesPerBlock; this->samplesPerBlock = samplesPerBlock;
this->minEnvelopeDelay = samplesPerBlock / 2; this->minEnvelopeDelay = samplesPerBlock / 2;
tempBuffer1.resize(samplesPerBlock);
tempBuffer2.resize(samplesPerBlock);
tempBuffer3.resize(samplesPerBlock);
indexBuffer.resize(samplesPerBlock);
tempSpan1 = absl::MakeSpan(tempBuffer1);
tempSpan2 = absl::MakeSpan(tempBuffer2);
tempSpan3 = absl::MakeSpan(tempBuffer3);
indexSpan = absl::MakeSpan(indexBuffer);
} }
void sfz::Voice::renderBlock(AudioSpan<float> buffer) noexcept void sfz::Voice::renderBlock(AudioSpan<float> buffer) noexcept
@ -331,8 +323,12 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
auto leftBuffer = buffer.getSpan(0); auto leftBuffer = buffer.getSpan(0);
auto rightBuffer = buffer.getSpan(1); auto rightBuffer = buffer.getSpan(1);
auto modulationSpan = tempSpan1.first(numSamples); auto modulationBuffer = resources.bufferPool.getBuffer(numSamples);
auto tempSpan = tempSpan2.first(numSamples); auto tempBuffer = resources.bufferPool.getBuffer(numSamples);
if (!modulationBuffer || !tempBuffer)
return;
auto modulationSpan = absl::MakeSpan(*modulationBuffer).first(numSamples);
auto tempSpan = absl::MakeSpan(*tempBuffer).first(numSamples);
{ // Amplitude processing { // Amplitude processing
ScopedTiming logger { amplitudeDuration }; ScopedTiming logger { amplitudeDuration };
@ -384,11 +380,16 @@ void sfz::Voice::processMono(AudioSpan<float> buffer) noexcept
void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
{ {
const auto numSamples = buffer.getNumFrames(); const auto numSamples = buffer.getNumFrames();
auto modulationSpan = tempSpan1.first(numSamples);
auto tempSpan = tempSpan2.first(numSamples);
auto leftBuffer = buffer.getSpan(0); auto leftBuffer = buffer.getSpan(0);
auto rightBuffer = buffer.getSpan(1); auto rightBuffer = buffer.getSpan(1);
auto modulationBuffer = resources.bufferPool.getBuffer(numSamples);
auto tempBuffer = resources.bufferPool.getBuffer(numSamples);
if (!modulationBuffer || !tempBuffer)
return;
auto modulationSpan = absl::MakeSpan(*modulationBuffer).first(numSamples);
auto tempSpan = absl::MakeSpan(*tempBuffer).first(numSamples);
{ // Amplitude processing { // Amplitude processing
ScopedTiming logger { amplitudeDuration }; ScopedTiming logger { amplitudeDuration };
@ -442,7 +443,8 @@ void sfz::Voice::processStereo(AudioSpan<float> buffer) noexcept
void sfz::Voice::fillWithData(AudioSpan<float> buffer) noexcept void sfz::Voice::fillWithData(AudioSpan<float> buffer) noexcept
{ {
if (buffer.getNumFrames() == 0) const auto numSamples = buffer.getNumFrames();
if (numSamples == 0)
return; return;
if (currentPromise == nullptr) { if (currentPromise == nullptr) {
@ -451,11 +453,18 @@ void sfz::Voice::fillWithData(AudioSpan<float> buffer) noexcept
} }
auto source = currentPromise->getData(); auto source = currentPromise->getData();
auto indices = indexSpan.first(buffer.getNumFrames()); auto jumpBuffer = resources.bufferPool.getBuffer(numSamples);
auto jumps = tempSpan1.first(buffer.getNumFrames()); auto bendBuffer = resources.bufferPool.getBuffer(numSamples);
auto bends = tempSpan2.first(buffer.getNumFrames()); auto leftCoeffBuffer = resources.bufferPool.getBuffer(numSamples);
auto leftCoeffs = tempSpan1.first(buffer.getNumFrames()); auto rightCoeffBuffer = resources.bufferPool.getBuffer(numSamples);
auto rightCoeffs = tempSpan2.first(buffer.getNumFrames()); auto indexBuffer = resources.bufferPool.getIndexBuffer(numSamples);
if (!jumpBuffer || !bendBuffer || !indexBuffer || !rightCoeffBuffer || !leftCoeffBuffer)
return;
auto jumps = absl::MakeSpan(*jumpBuffer).first(numSamples);
auto bends = absl::MakeSpan(*bendBuffer).first(numSamples);
auto indices = absl::MakeSpan(*indexBuffer).first(numSamples);
auto leftCoeffs = absl::MakeSpan(*leftCoeffBuffer).first(numSamples);
auto rightCoeffs = absl::MakeSpan(*rightCoeffBuffer).first(numSamples);
fill<float>(jumps, pitchRatio * speedRatio); fill<float>(jumps, pitchRatio * speedRatio);
if (region->bendStep > 1) if (region->bendStep > 1)
@ -530,13 +539,18 @@ void sfz::Voice::fillWithGenerator(AudioSpan<float> buffer) noexcept
const auto leftSpan = buffer.getSpan(0); const auto leftSpan = buffer.getSpan(0);
const auto rightSpan = buffer.getSpan(1); const auto rightSpan = buffer.getSpan(1);
if (region->sample == "*noise") { if (region->sample == "*noise") {
absl::c_generate(leftSpan, [&](){ return noiseDist(Random::randomGenerator); }); absl::c_generate(leftSpan, [&](){ return noiseDist(Random::randomGenerator); });
absl::c_generate(rightSpan, [&](){ return noiseDist(Random::randomGenerator); }); absl::c_generate(rightSpan, [&](){ return noiseDist(Random::randomGenerator); });
} else { } else {
// wavetables for sine and other generators const auto numSamples = buffer.getNumFrames();
auto frequencies = tempSpan1.first(buffer.getNumFrames()); auto frequencyBuffer = resources.bufferPool.getBuffer(numSamples);
auto bends = tempSpan2.first(buffer.getNumFrames()); auto bendBuffer = resources.bufferPool.getBuffer(numSamples);
if (!frequencyBuffer || !bendBuffer)
return;
auto frequencies = absl::MakeSpan(*frequencyBuffer).first(numSamples);
auto bends = absl::MakeSpan(*bendBuffer).first(numSamples);
float keycenterFrequency = midiNoteFrequency(region->pitchKeycenter); float keycenterFrequency = midiNoteFrequency(region->pitchKeycenter);
fill<float>(frequencies, pitchRatio * keycenterFrequency); fill<float>(frequencies, pitchRatio * keycenterFrequency);

View file

@ -280,15 +280,6 @@ private:
FilePromisePtr currentPromise { nullptr }; FilePromisePtr currentPromise { nullptr };
Buffer<float> tempBuffer1;
Buffer<float> tempBuffer2;
Buffer<float> tempBuffer3;
Buffer<int> indexBuffer;
absl::Span<float> tempSpan1 { absl::MakeSpan(tempBuffer1) };
absl::Span<float> tempSpan2 { absl::MakeSpan(tempBuffer2) };
absl::Span<float> tempSpan3 { absl::MakeSpan(tempBuffer3) };
absl::Span<int> indexSpan { absl::MakeSpan(indexBuffer) };
int samplesPerBlock { config::defaultSamplesPerBlock }; int samplesPerBlock { config::defaultSamplesPerBlock };
int minEnvelopeDelay { config::defaultSamplesPerBlock / 2 }; int minEnvelopeDelay { config::defaultSamplesPerBlock / 2 };
float sampleRate { config::defaultSampleRate }; float sampleRate { config::defaultSampleRate };