diff --git a/src/sfizz/BufferPool.h b/src/sfizz/BufferPool.h index 46c433e9..8bcb6dcf 100644 --- a/src/sfizz/BufferPool.h +++ b/src/sfizz/BufferPool.h @@ -7,6 +7,7 @@ #pragma once #include "Config.h" #include "Buffer.h" +#include "AudioBuffer.h" #include #include @@ -18,29 +19,80 @@ class BufferPool public: BufferPool() { + for (auto& buffer : buffers) { + buffer = std::make_shared>(config::defaultSamplesPerBlock); + } + for (auto& buffer : stereoBuffers) { + buffer = std::make_shared>(2, config::defaultSamplesPerBlock); + } } + void setBufferSize(unsigned bufferSize) { for (auto& buffer: buffers) { // 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); } } - std::shared_ptr> getBuffer() + std::shared_ptr> getBuffer(size_t numFrames) { 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()) { if (bufferIt->use_count() == 1) return *bufferIt; + ++bufferIt; } // No buffer found; debug message DBG("[sfizz] No free buffer available!"); + return {}; + } + + std::shared_ptr> 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: std::array>, config::bufferPoolSize> buffers; + std::array>, config::stereoBufferPoolSize> stereoBuffers; }; } diff --git a/src/sfizz/Config.h b/src/sfizz/Config.h index 2b81db1f..e4a5aa2a 100644 --- a/src/sfizz/Config.h +++ b/src/sfizz/Config.h @@ -29,6 +29,7 @@ namespace config { constexpr int defaultSamplesPerBlock { 1024 }; constexpr int maxBlockSize { 8192 }; constexpr int bufferPoolSize { 16 }; + constexpr int stereoBufferPoolSize { 4 }; constexpr int preloadSize { 8192 }; constexpr int loggerQueueSize { 256 }; constexpr int voiceLoggerQueueSize { 256 };