13#include <JuceHeader.h>
17template <
typename SampleType>
28 AudioBufferQueue(
int hostRate = 44100,
int editorFramesPerSecond = 30,
int numSamplesPerBlock = 441)
31 this->bufferSize = hostRate / editorFramesPerSecond;
34 int capacity = numSamplesPerBlock * 2;
35 numBuffers = std::max((
int)(capacity / bufferSize + 1), (
int)5);
36 abstractFifo.reset(
new juce::AbstractFifo(numBuffers));
37 buffers.resize(numBuffers);
38 for (
size_t i = 0; i < numBuffers; i++)
40 buffers[i].resize(bufferSize);
50 void push(
const SampleType *dataToPush,
size_t numSamples)
53 jassert(numSamples <= bufferSize);
56 int start1, size1 = 0, start2, size2;
57 abstractFifo->prepareToWrite(1, start1, size1, start2, size2);
65 juce::FloatVectorOperations::copy(buffers[(
size_t)start1].data(), dataToPush, numSamples);
68 abstractFifo->finishedWrite(size1);
77 void pop(SampleType *outputBuffer)
80 int start1, size1, start2, size2;
81 abstractFifo->prepareToRead(1, start1, size1, start2, size2);
88 juce::FloatVectorOperations::copy(outputBuffer, buffers[(
size_t)start1].data(), (
int)buffers[(
size_t)start1].size());
90 abstractFifo->finishedRead(size1);
100 for (
auto i = 0; i < numBuffers; i++)
102 std::fill(std::begin(buffers[i]), std::end(buffers[i]), 0);
118 size_t numBuffers = 5;
119 std::unique_ptr<juce::AbstractFifo> abstractFifo;
120 std::vector<std::vector<SampleType>> buffers;
void push(const SampleType *dataToPush, size_t numSamples)
AudioBufferQueue(int hostRate=44100, int editorFramesPerSecond=30, int numSamplesPerBlock=441)
void pop(SampleType *outputBuffer)