20 AudioFifo (choc::buffer::ChannelCount numChannels,
21 choc::buffer::FrameCount numFrames)
22 : fifo ((
int) numFrames)
24 setSize (numChannels, numFrames);
27 void setSize (choc::buffer::ChannelCount numChannels,
28 choc::buffer::FrameCount numFrames)
31 buffer.resize ({ numChannels, numFrames });
34 int getFreeSpace()
const noexcept {
return fifo.
getFreeSpace(); }
35 int getNumReady()
const noexcept {
return fifo.
getNumReady(); }
37 choc::buffer::ChannelCount getNumChannels()
const noexcept {
return buffer.getNumChannels(); }
38 void reset()
noexcept { fifo.
reset(); }
40 void ensureFreeSpace (
int numFrames)
42 auto freeSpace = getFreeSpace();
44 if (numFrames > freeSpace)
46 auto required = numFrames - freeSpace;
47 jassert (required <= getNumReady());
52 bool write (choc::buffer::ChannelArrayView<float> block)
54 jassert (block.getNumChannels() <= buffer.getNumChannels());
56 int numSamples = (
int) block.getNumFrames();
57 int start1, size1, start2, size2;
60 if (size1 + size2 < numSamples)
63 auto fifo1 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start1, (choc::buffer::FrameCount) (start1 + size1) });
64 auto block1 = block.getStart ((choc::buffer::FrameCount) size1);
65 copyIntersectionAndClearOutside (fifo1, block1);
69 auto fifo2 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start2, (choc::buffer::FrameCount) (start2 + size2) });
70 auto block2 = block.getFrameRange ({ (choc::buffer::FrameCount) size1, (choc::buffer::FrameCount) (size1 + size2) });
71 copyIntersectionAndClearOutside (fifo2, block2);
78 bool writeSilence (choc::buffer::FrameCount numFrames)
83 int start1, size1, start2, size2;
84 fifo.
prepareToWrite ((
int) numFrames, start1, size1, start2, size2);
86 if (size1 + size2 < (
int) numFrames)
89 choc::buffer::FrameRange fifo1 { (choc::buffer::FrameCount) start1, (choc::buffer::FrameCount) (start1 + size1) };
90 buffer.getFrameRange (fifo1).clear();
94 choc::buffer::FrameRange fifo2 { (choc::buffer::FrameCount) start2, (choc::buffer::FrameCount) (start2 + size2) };
95 buffer.getFrameRange (fifo2).clear();
102 bool readAdding (choc::buffer::ChannelArrayView<float> dest)
104 jassert (dest.getNumChannels() <= buffer.getNumChannels());
106 auto numFrames = (
int) dest.getNumFrames();
107 int start1, size1, start2, size2;
108 fifo.
prepareToRead (numFrames, start1, size1, start2, size2);
110 if (size1 + size2 < numFrames)
113 auto fifo1 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start1, (choc::buffer::FrameCount) (start1 + size1) });
114 auto block1 = dest.getStart ((choc::buffer::FrameCount) size1);
119 auto fifo2 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start2, (choc::buffer::FrameCount) (start2 + size2) });
120 auto block2 = dest.getFrameRange ({ (choc::buffer::FrameCount) size1, (choc::buffer::FrameCount) (size1 + size2) });
128 bool readOverwriting (choc::buffer::ChannelArrayView<float> dest)
130 jassert (dest.getNumChannels() <= buffer.getNumChannels());
132 auto numFrames = (
int) dest.getNumFrames();
133 int start1, size1, start2, size2;
134 fifo.
prepareToRead (numFrames, start1, size1, start2, size2);
136 if (size1 + size2 < numFrames)
139 auto fifo1 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start1, (choc::buffer::FrameCount) (start1 + size1) });
140 auto block1 = dest.getStart ((choc::buffer::FrameCount) size1);
141 copy (block1, fifo1);
145 auto fifo2 = buffer.getFrameRange ({ (choc::buffer::FrameCount) start2, (choc::buffer::FrameCount) (start2 + size2) });
146 auto block2 = dest.getFrameRange ({ (choc::buffer::FrameCount) size1, (choc::buffer::FrameCount) (size1 + size2) });
147 copy (block2, fifo2);
154 void removeSamples (
int numSamples)
161 choc::buffer::ChannelArrayBuffer<float> buffer;