Improve the bufferpool
This commit is contained in:
parent
7cb92e05d2
commit
5e8cb7de0a
2 changed files with 55 additions and 2 deletions
|
|
@ -7,6 +7,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
|
#include "AudioBuffer.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
@ -18,29 +19,80 @@ class BufferPool
|
||||||
public:
|
public:
|
||||||
BufferPool()
|
BufferPool()
|
||||||
{
|
{
|
||||||
|
for (auto& buffer : buffers) {
|
||||||
|
buffer = std::make_shared<sfz::Buffer<float>>(config::defaultSamplesPerBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& buffer : stereoBuffers) {
|
||||||
|
buffer = std::make_shared<sfz::AudioBuffer<float>>(2, config::defaultSamplesPerBlock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBufferSize(unsigned bufferSize)
|
void setBufferSize(unsigned bufferSize)
|
||||||
{
|
{
|
||||||
for (auto& buffer: buffers) {
|
for (auto& buffer: buffers) {
|
||||||
// Trying to resize a buffer in use
|
// Trying to resize a buffer in use
|
||||||
ASSERT(buffer.use_count() != 1);
|
ASSERT(buffer.use_count() == 1);
|
||||||
|
buffer->resize(bufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& buffer: stereoBuffers) {
|
||||||
|
// Trying to resize a buffer in use
|
||||||
|
ASSERT(buffer.use_count() == 1);
|
||||||
buffer->resize(bufferSize);
|
buffer->resize(bufferSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<sfz::Buffer<float>> getBuffer()
|
std::shared_ptr<sfz::Buffer<float>> getBuffer(size_t numFrames)
|
||||||
{
|
{
|
||||||
auto bufferIt = buffers.begin();
|
auto bufferIt = buffers.begin();
|
||||||
|
|
||||||
|
if (buffers.empty()) {
|
||||||
|
DBG("[sfizz] No available buffers in the pool");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffers[0]->size() < numFrames) {
|
||||||
|
DBG("[sfizz] Someone asked for a buffer of size " << numFrames << "; only " << buffers[0]->size() << " available...");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
while (bufferIt < buffers.end()) {
|
while (bufferIt < buffers.end()) {
|
||||||
if (bufferIt->use_count() == 1)
|
if (bufferIt->use_count() == 1)
|
||||||
return *bufferIt;
|
return *bufferIt;
|
||||||
|
++bufferIt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No buffer found; debug message
|
// No buffer found; debug message
|
||||||
DBG("[sfizz] No free buffer available!");
|
DBG("[sfizz] No free buffer available!");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<sfz::AudioBuffer<float>> getStereoBuffer(size_t numFrames)
|
||||||
|
{
|
||||||
|
if (stereoBuffers.empty()) {
|
||||||
|
DBG("[sfizz] No available stereoBuffers in the pool");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stereoBuffers[0]->getNumFrames() < numFrames) {
|
||||||
|
DBG("[sfizz] Someone asked for a buffer of size " << numFrames << "; only " << stereoBuffers[0]->getNumFrames() << " available...");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto bufferIt = stereoBuffers.begin();
|
||||||
|
while (bufferIt < stereoBuffers.end()) {
|
||||||
|
if (bufferIt->use_count() == 1)
|
||||||
|
return *bufferIt;
|
||||||
|
++bufferIt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No buffer found; debug message
|
||||||
|
DBG("[sfizz] No free buffer available!");
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
std::array<std::shared_ptr<sfz::Buffer<float>>, config::bufferPoolSize> buffers;
|
std::array<std::shared_ptr<sfz::Buffer<float>>, config::bufferPoolSize> buffers;
|
||||||
|
std::array<std::shared_ptr<sfz::AudioBuffer<float>>, config::stereoBufferPoolSize> stereoBuffers;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ namespace config {
|
||||||
constexpr int defaultSamplesPerBlock { 1024 };
|
constexpr int defaultSamplesPerBlock { 1024 };
|
||||||
constexpr int maxBlockSize { 8192 };
|
constexpr int maxBlockSize { 8192 };
|
||||||
constexpr int bufferPoolSize { 16 };
|
constexpr int bufferPoolSize { 16 };
|
||||||
|
constexpr int stereoBufferPoolSize { 4 };
|
||||||
constexpr int preloadSize { 8192 };
|
constexpr int preloadSize { 8192 };
|
||||||
constexpr int loggerQueueSize { 256 };
|
constexpr int loggerQueueSize { 256 };
|
||||||
constexpr int voiceLoggerQueueSize { 256 };
|
constexpr int voiceLoggerQueueSize { 256 };
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue