How do I wrap a Sampler/Synthesiser inside of an AudioSource?

Solved, but I believe it’s still messy - a ResamplingAudioProcessor would be nice.

PluginProcessor.cpp:

void PluginProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
    resamplingAudioSource->setResamplingRatio (
        samplerAudioSource.getOriginalSampleRate () / sampleRate
    );

    resamplingAudioSource->prepareToPlay (samplesPerBlock, sampleRate);
}

...

void PluginProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)
{
    buffer.clear ();

    samplerAudioSource.setBlockMidiMessages (midiMessages);

    AudioSourceChannelInfo channelInfo (buffer);
    resamplingAudioSource->getNextAudioBlock (channelInfo);
}

And in the SamplerAudioSource:

class SamplerAudioSource:    public AudioSource
{
public:
    SamplerAudioSource ()
        : audioChannelCount (DEFAULT_CHANNEL_COUNT),
          midiMessages (nullptr)
    {
        sampler.setCurrentPlaybackSampleRate (DEFAULT_SAMPLE_RATE);
    }

    ...

    void getNextAudioBlock (const AudioSourceChannelInfo& channelInfo) override
    {
        AudioSampleBuffer& outBuffer = *channelInfo.buffer;

        int samplesCount = channelInfo.numSamples,
            outBufferStartIndex = channelInfo.startSample;

        renderingBuffer.clear ();
        sampler.renderNextBlock (renderingBuffer, *midiMessages, 0, samplesCount);

        // not part of JUCE - this simply copies the renderingBuffer onto outBuffer
        AudioBufferUtils::copySamples (
            renderingBuffer,
            0,
            outBuffer,
            outBufferStartIndex,
            audioChannelCount,
            samplesCount
        );
    }

    //==============================================================================

    int getOriginalSampleRate ()
    {
        return sampler.getSampleRate ();
    }

    void setBlockMidiMessages (MidiBuffer& messages)
    {
        midiMessages = &messages;
    }

private:
    Sampler sampler;

    ...

    int audioChannelCount;
    AudioSampleBuffer renderingBuffer;
    MidiBuffer* midiMessages;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SamplerAudioSource);
};
1 Like