Skip to content

Instantly share code, notes, and snippets.

@adamski
Last active December 29, 2016 13:08
Show Gist options
  • Save adamski/bd84f8dd924189ad498af7dfe0b1c9b7 to your computer and use it in GitHub Desktop.
Save adamski/bd84f8dd924189ad498af7dfe0b1c9b7 to your computer and use it in GitHub Desktop.
/*
==============================================================================
AudioBufferFIFO.h
Created: 29 Dec 2016 9:22:50am
Author: Adam Wilson
==============================================================================
*/
#ifndef AUDIOBUFFERFIFO_H_INCLUDED
#define AUDIOBUFFERFIFO_H_INCLUDED
#include "../JuceLibraryCode/JuceHeader.h"
template<typename FloatType>
class AudioBufferFIFO : public AbstractFifo
{
public:
AudioBufferFIFO (int channels, int buffersize) :
AbstractFifo (buffersize)
{
buffer.setSize (channels, buffersize);
}
void addToFifo (const FloatType** samples, int numSamples)
{
jassert (getFreeSpace() > numSamples);
int start1, size1, start2, size2;
prepareToWrite (numSamples, start1, size1, start2, size2);
if (size1 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
buffer.copyFrom (channel, start1, samples[channel], size1);
if (size2 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
buffer.copyFrom (channel, start2, samples[channel] + size1, size2);
finishedWrite (size1 + size2);
}
void addToFifo (const juce::AudioBuffer<FloatType>& samples, int numSamples=-1)
{
const int addSamples = numSamples < 0 ? samples.getNumSamples() : numSamples;
jassert (getFreeSpace() > addSamples);
int start1, size1, start2, size2;
prepareToWrite (addSamples, start1, size1, start2, size2);
if (size1 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
buffer.copyFrom (channel, start1, samples.getReadPointer (channel), size1);
if (size2 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
buffer.copyFrom (channel, start2, samples.getReadPointer (channel, size1), size2);
finishedWrite (size1 + size2);
}
void readFromFifo (FloatType** samples, int numSamples)
{
jassert (getNumReady() > numSamples);
int start1, size1, start2, size2;
prepareToRead (numSamples, start1, size1, start2, size2);
if (size1 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
juce::FloatVectorOperations::copy (samples [channel],
buffer.getReadPointer (channel, start1),
size1);
if (size2 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
juce::FloatVectorOperations::copy (samples [channel] + size1,
buffer.getReadPointer (channel, start2),
size2);
finishedRead (size1 + size2);
}
void readFromFifo (juce::AudioBuffer<FloatType>& samples, int numSamples=-1)
{
const int readSamples = numSamples > 0 ? numSamples : samples.getNumSamples();
jassert (getNumReady() >= readSamples);
int start1, size1, start2, size2;
prepareToRead (readSamples, start1, size1, start2, size2);
if (size1 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
samples.copyFrom (channel, 0, buffer.getReadPointer (channel, start1), size1);
if (size2 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
samples.copyFrom (channel, size1, buffer.getReadPointer (channel, start2), size2);
finishedRead (size1 + size2);
}
void readFromFifo (const juce::AudioSourceChannelInfo& info, int numSamples=-1)
{
const int readSamples = numSamples > 0 ? numSamples : info.numSamples;
jassert (getNumReady() >= readSamples);
int start1, size1, start2, size2;
prepareToRead (readSamples, start1, size1, start2, size2);
if (size1 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
info.buffer->copyFrom (channel, info.startSample, buffer.getReadPointer (channel, start1), size1);
if (size2 > 0)
for (int channel = 0; channel < buffer.getNumChannels(); ++channel)
info.buffer->copyFrom (channel, info.startSample + size1, buffer.getReadPointer (channel, start2), size2);
finishedRead (size1 + size2);
}
int getNumChannels () const {
return buffer.getNumChannels();
}
private:
/*< The actual audio buffer */
juce::AudioBuffer<FloatType> buffer;
};
#endif // AUDIOBUFFERFIFO_H_INCLUDED
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment