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);
};
