diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index d18f500b9b..068922c1ad 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -47,18 +47,21 @@ struct GraphRenderSequence if (numSamples > maxSamples) { - // being asked to render more samples than our buffers have, so slice things up... - tempMIDI.clear(); - tempMIDI.addEvents (midiMessages, maxSamples, numSamples, -maxSamples); - + // Being asked to render more samples than our buffers have, so divide the buffer into chunks + int chunkStartSample = 0; + while (chunkStartSample < numSamples) { - AudioBuffer startAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples); - midiMessages.clear (maxSamples, numSamples); - perform (startAudio, midiMessages, audioPlayHead); + auto chunkSize = jmin (maxSamples, numSamples - chunkStartSample); + + AudioBuffer audioChunk (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), chunkStartSample, chunkSize); + midiChunk.clear(); + midiChunk.addEvents (midiMessages, chunkStartSample, chunkSize, -chunkStartSample); + + perform (audioChunk, midiChunk, audioPlayHead); + + chunkStartSample += maxSamples; } - AudioBuffer endAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples, numSamples - maxSamples); - perform (endAudio, tempMIDI, audioPlayHead); return; } @@ -145,7 +148,7 @@ struct GraphRenderSequence const int defaultMIDIBufferSize = 512; - tempMIDI.ensureSize (defaultMIDIBufferSize); + midiChunk.ensureSize (defaultMIDIBufferSize); for (auto&& m : midiBuffers) m.ensureSize (defaultMIDIBufferSize); @@ -170,7 +173,7 @@ struct GraphRenderSequence MidiBuffer currentMidiOutputBuffer; Array midiBuffers; - MidiBuffer tempMIDI; + MidiBuffer midiChunk; private: //==============================================================================