Sorry, I overread that you are sending midi in the packets. So only you can estimate if the synthesis works with lacking information.
But for audio you have to consider, a signal containing a frequncy of 200 Hz must be at least 48000 samples/sec / 200 1/sec = 240 samples. And musically if you cut off everything below 200 Hz is a high loss.
The AbstractFifo is not the codesample on the page but an actual class you can aggregate.
The main feature is to call prepareToRead and prepareToWrite, which calculates the proper indices where to write to and where to read from the buffer. And it’s abstract, because the actual memory is up to you.
To have multiple readers from the fifo will be tricky. You need to figure you, which parts run synchronous. Or if nothing else helps, you copy into several fifos one for each reader.
I copy a complete AudioBufferFifo class I use very often, maybe it’s usefull:
template<typename FloatType>
class AudioBufferFIFO
{
public:
AudioBufferFIFO (int channels, int buffersize) :
fifo (buffersize)
{
buffer.setSize (channels, buffersize);
}
void addToFifo (const FloatType** samples, int numSamples)
{
jassert (getFreeSpace() > numSamples);
int start1, size1, start2, size2;
fifo.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);
fifo.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;
fifo.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);
fifo.finishedWrite (size1 + size2);
}
void readFromFifo (FloatType** samples, int numSamples)
{
jassert (getNumReady() > numSamples);
int start1, size1, start2, size2;
fifo.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);
fifo.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;
fifo.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);
fifo.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;
fifo.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);
fifo.finishedRead (size1 + size2);
}
int getNumChannels () const {
return buffer.getNumChannels();
}
private:
AbstractFIFO fifo;
/*< The actual audio buffer */
juce::AudioBuffer<FloatType> buffer;
};