12namespace tracktion {
inline namespace graph
14#include "../3rd_party/farbot/include/farbot/fifo.hpp"
17namespace tracktion {
inline namespace graph
62 choc::buffer::ChannelArrayBuffer<float>
allocate (choc::buffer::Size);
70 bool release (choc::buffer::ChannelArrayBuffer<float>&&);
83 void reserve (
size_t numBuffers, choc::buffer::Size);
120 choc::buffer::ChannelArrayBuffer<float> buffer;
122 if (fifo->pop (buffer))
124 if (
auto bufferSize = buffer.getSize();
125 bufferSize.numChannels < size.numChannels
126 || bufferSize.numFrames < size.numFrames)
128 buffer.resize (size);
133 buffer.resize (size);
141 return fifo->push (std::move (buffer));
149 if (maxCapacity <= capacity)
153 capacity = maxCapacity;
163 choc::buffer::ChannelArrayBuffer<float> tempBuffer;
165 if (! fifo->pop (tempBuffer))
172 for (
auto& b : buffers)
174 if (
auto bufferSize = b.getSize();
175 bufferSize.numChannels < size.numChannels
176 || bufferSize.numFrames < size.numFrames)
183 const int numToAdd =
static_cast<int> (numBuffers) -
static_cast<int> (buffers.
size());
186 for (
auto& b : buffers)
188 [[ maybe_unused ]]
bool succeeded =
release (std::move (b));
193 for (
int i = 0; i < numToAdd; ++i)
195 [[ maybe_unused ]]
bool succeeded =
release (choc::buffer::ChannelArrayBuffer<float> (size));
207 choc::buffer::ChannelArrayBuffer<float> tempBuffer;
209 if (! fifo->pop (tempBuffer))
215 const auto numBuffers = buffers.
size();
218 for (
auto& b : buffers)
220 [[ maybe_unused ]]
bool succeeded =
release (std::move (b));
235 choc::buffer::ChannelArrayBuffer<float> tempBuffer;
237 if (! fifo->pop (tempBuffer))
244 for (
auto& b : buffers)
245 size += b.getView().data.getBytesNeeded (b.getSize());
248 for (
auto& b : buffers)
249 fifo->push (std::move (b));
A lock-free pool of audio buffers.
choc::buffer::ChannelArrayBuffer< float > allocate(choc::buffer::Size)
Returns an allocated buffer for a given size from the pool.
bool release(choc::buffer::ChannelArrayBuffer< float > &&)
Releases an allocated buffer back to the pool.
void reset()
Releases all the internal allocated storage.
size_t getAllocatedSize()
Returns the currently allocated size of all the buffers in bytes.
AudioBufferPool()=default
Create an empty pool.
size_t getCapacity() const
Returns the current maximum number of buffers this can store.
void reserve(size_t numBuffers, choc::buffer::Size)
Reserves a number of buffers of a given size, preallocating them.
void setCapacity(size_t)
Sets the maximum number of buffers this can store.
size_t getNumBuffers()
Returns the current number of buffers in the pool.
T emplace_back(T... args)
int nextPowerOfTwo(int n) noexcept