From b5e1c3d4c4ada0217c34484bc74b895a67155048 Mon Sep 17 00:00:00 2001 From: Lukasz Kozakiewicz Date: Thu, 8 Mar 2018 13:27:57 +0100 Subject: [PATCH] AudioProcessorGraph: start outputting audio only after the graph is prepared. --- .../processors/juce_AudioProcessorGraph.cpp | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) 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); } //==============================================================================