Oscilloscope 0.5.0
A simple oscilloscope VST
Loading...
Searching...
No Matches
AudioBufferQueue.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 AudioBufferQueue.h
5 Created: 24 Feb 2023 6:49:10pm
6 Author: wadda
7
8 ==============================================================================
9*/
10
11#pragma once
12
13#include <JuceHeader.h>
17template <typename SampleType>
19{
20public:
21 //==============================================================================
22
28 AudioBufferQueue(int hostRate = 44100, int editorFramesPerSecond = 30, int numSamplesPerBlock = 441)
29 {
30 // set number of samples per frame
31 this->bufferSize = hostRate / editorFramesPerSecond;
32
33 // calculate capacitz and reset buffers & Abstract FIFO
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++)
39 {
40 buffers[i].resize(bufferSize);
41 }
42 }
43
50 void push(const SampleType *dataToPush, size_t numSamples)
51 {
52 // no more samples than buffer size
53 jassert(numSamples <= bufferSize);
54
55 // get pointer to where to write
56 int start1, size1 = 0, start2, size2;
57 abstractFifo->prepareToWrite(1, start1, size1, start2, size2);
58
59 jassert(size1 <= 1);
60 jassert(size2 == 0);
61
62 // write data
63 if (size1 > 0)
64 {
65 juce::FloatVectorOperations::copy(buffers[(size_t)start1].data(), dataToPush, numSamples);
66 }
67
68 abstractFifo->finishedWrite(size1);
69 }
70
71 //==============================================================================
77 void pop(SampleType *outputBuffer)
78 {
79 // get where to read
80 int start1, size1, start2, size2;
81 abstractFifo->prepareToRead(1, start1, size1, start2, size2);
82
83 jassert(size1 <= 1);
84 jassert(size2 == 0);
85
86 // read
87 if (size1 > 0)
88 juce::FloatVectorOperations::copy(outputBuffer, buffers[(size_t)start1].data(), (int)buffers[(size_t)start1].size());
89
90 abstractFifo->finishedRead(size1);
91 }
92
97 void flush()
98 {
99 // fill every buffer with 0
100 for (auto i = 0; i < numBuffers; i++)
101 {
102 std::fill(std::begin(buffers[i]), std::end(buffers[i]), 0);
103 }
104 }
105
112 {
113 return bufferSize;
114 }
115
116private:
117 //==============================================================================
118 size_t numBuffers = 5;
119 std::unique_ptr<juce::AbstractFifo> abstractFifo;
120 std::vector<std::vector<SampleType>> buffers;
121 size_t bufferSize;
122};
void push(const SampleType *dataToPush, size_t numSamples)
AudioBufferQueue(int hostRate=44100, int editorFramesPerSecond=30, int numSamplesPerBlock=441)
void pop(SampleType *outputBuffer)