diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 4ac6f22e85..336038dc17 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -1256,20 +1256,53 @@ bool AudioProcessorGraph::producesMidi() const { return tru void AudioProcessorGraph::getStateInformation (juce::MemoryBlock&) {} void AudioProcessorGraph::setStateInformation (const void*, int) {} +template +static void processBlockForBuffer (AudioBuffer& buffer, MidiBuffer& midiMessages, + AudioProcessorGraph& graph, + GraphRenderSequence* renderSequence, + Atomic& isPrepared) +{ + if (graph.isNonRealtime()) + { + while (isPrepared.get() == 0) + Thread::sleep (1); + + const ScopedLock sl (graph.getCallbackLock()); + + if (renderSequence != nullptr) + renderSequence->perform (buffer, midiMessages, graph.getPlayHead()); + } + else + { + const ScopedLock sl (graph.getCallbackLock()); + + if (isPrepared.get() == 1) + { + if (renderSequence != nullptr) + renderSequence->perform (buffer, midiMessages, graph.getPlayHead()); + } + else + { + buffer.clear(); + midiMessages.clear(); + } + } +} + void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) { - const ScopedLock sl (getCallbackLock()); + if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) + handleAsyncUpdate(); - if (renderSequenceFloat != nullptr) - renderSequenceFloat->perform (buffer, midiMessages, getPlayHead()); + processBlockForBuffer (buffer, midiMessages, *this, renderSequenceFloat, isPrepared); } void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) { - const ScopedLock sl (getCallbackLock()); + if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) + handleAsyncUpdate(); - if (renderSequenceDouble != nullptr) - renderSequenceDouble->perform (buffer, midiMessages, getPlayHead()); + processBlockForBuffer (buffer, midiMessages, *this, renderSequenceDouble, isPrepared); } //==============================================================================