From 8ec069cabe6ce65ce203eefa042afda1e91262f0 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Thu, 19 Apr 2018 09:34:20 +0100 Subject: [PATCH] Fixed a race condition in AudioProcessorGraph --- .../processors/juce_AudioProcessorGraph.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index c5fab185bd..4e699993b8 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -1045,7 +1045,6 @@ bool AudioProcessorGraph::isAnInputTo (Node& src, Node& dst, int recursionCheck) return false; } - bool AudioProcessorGraph::canConnect (Node* source, int sourceChannel, Node* dest, int destChannel) const noexcept { bool sourceIsMIDI = sourceChannel == midiChannelIndex; @@ -1212,8 +1211,11 @@ void AudioProcessorGraph::buildRenderingSequence() RenderSequenceBuilder builderD (*this, *newSequenceD); } - newSequenceF->prepareBuffers (getBlockSize()); - newSequenceD->prepareBuffers (getBlockSize()); + { + const ScopedLock sl (getCallbackLock()); + newSequenceF->prepareBuffers (getBlockSize()); + newSequenceD->prepareBuffers (getBlockSize()); + } if (anyNodesNeedPreparing()) { @@ -1295,10 +1297,10 @@ 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, +template +static void processBlockForBuffer (AudioBuffer& buffer, MidiBuffer& midiMessages, AudioProcessorGraph& graph, - GraphRenderSequence* renderSequence, + ScopedPointer& renderSequence, Atomic& isPrepared) { if (graph.isNonRealtime()) @@ -1333,7 +1335,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) handleAsyncUpdate(); - processBlockForBuffer (buffer, midiMessages, *this, renderSequenceFloat.get(), isPrepared); + processBlockForBuffer (buffer, midiMessages, *this, renderSequenceFloat, isPrepared); } void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) @@ -1341,7 +1343,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) handleAsyncUpdate(); - processBlockForBuffer (buffer, midiMessages, *this, renderSequenceDouble.get(), isPrepared); + processBlockForBuffer (buffer, midiMessages, *this, renderSequenceDouble, isPrepared); } //==============================================================================