Use the bufferpool in the voices
This commit is contained in:
parent
c1266e5d70
commit
8ed3d16b8c
2 changed files with 35 additions and 30 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue