Browse Source

Fixed dropped MIDI messages in AudioProcessorGraph with large buffer sizes

tags/2021-05-28
ed 6 years ago
parent
commit
81fbbdfe20
1 changed files with 14 additions and 11 deletions
  1. +14
    -11
      modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp

+ 14
- 11
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp View File

@@ -47,18 +47,21 @@ struct GraphRenderSequence
if (numSamples > maxSamples) 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<FloatType> startAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples);
midiMessages.clear (maxSamples, numSamples);
perform (startAudio, midiMessages, audioPlayHead);
auto chunkSize = jmin (maxSamples, numSamples - chunkStartSample);
AudioBuffer<FloatType> audioChunk (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), chunkStartSample, chunkSize);
midiChunk.clear();
midiChunk.addEvents (midiMessages, chunkStartSample, chunkSize, -chunkStartSample);
perform (audioChunk, midiChunk, audioPlayHead);
chunkStartSample += maxSamples;
} }
AudioBuffer<FloatType> endAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples, numSamples - maxSamples);
perform (endAudio, tempMIDI, audioPlayHead);
return; return;
} }
@@ -145,7 +148,7 @@ struct GraphRenderSequence
const int defaultMIDIBufferSize = 512; const int defaultMIDIBufferSize = 512;
tempMIDI.ensureSize (defaultMIDIBufferSize);
midiChunk.ensureSize (defaultMIDIBufferSize);
for (auto&& m : midiBuffers) for (auto&& m : midiBuffers)
m.ensureSize (defaultMIDIBufferSize); m.ensureSize (defaultMIDIBufferSize);
@@ -170,7 +173,7 @@ struct GraphRenderSequence
MidiBuffer currentMidiOutputBuffer; MidiBuffer currentMidiOutputBuffer;
Array<MidiBuffer> midiBuffers; Array<MidiBuffer> midiBuffers;
MidiBuffer tempMIDI;
MidiBuffer midiChunk;
private: private:
//============================================================================== //==============================================================================


Loading…
Cancel
Save