Browse Source

Fixed a race condition in AudioProcessorGraph

tags/2021-05-28
Tom Poole 7 years ago
parent
commit
8ec069cabe
1 changed files with 10 additions and 8 deletions
  1. +10
    -8
      modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp

+ 10
- 8
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp View File

@@ -1045,7 +1045,6 @@ bool AudioProcessorGraph::isAnInputTo (Node& src, Node& dst, int recursionCheck)
return false; return false;
} }
bool AudioProcessorGraph::canConnect (Node* source, int sourceChannel, Node* dest, int destChannel) const noexcept bool AudioProcessorGraph::canConnect (Node* source, int sourceChannel, Node* dest, int destChannel) const noexcept
{ {
bool sourceIsMIDI = sourceChannel == midiChannelIndex; bool sourceIsMIDI = sourceChannel == midiChannelIndex;
@@ -1212,8 +1211,11 @@ void AudioProcessorGraph::buildRenderingSequence()
RenderSequenceBuilder<RenderSequenceDouble> builderD (*this, *newSequenceD); RenderSequenceBuilder<RenderSequenceDouble> builderD (*this, *newSequenceD);
} }
newSequenceF->prepareBuffers (getBlockSize());
newSequenceD->prepareBuffers (getBlockSize());
{
const ScopedLock sl (getCallbackLock());
newSequenceF->prepareBuffers (getBlockSize());
newSequenceD->prepareBuffers (getBlockSize());
}
if (anyNodesNeedPreparing()) if (anyNodesNeedPreparing())
{ {
@@ -1295,10 +1297,10 @@ bool AudioProcessorGraph::producesMidi() const { return tru
void AudioProcessorGraph::getStateInformation (juce::MemoryBlock&) {} void AudioProcessorGraph::getStateInformation (juce::MemoryBlock&) {}
void AudioProcessorGraph::setStateInformation (const void*, int) {} void AudioProcessorGraph::setStateInformation (const void*, int) {}
template <typename Type>
static void processBlockForBuffer (AudioBuffer<Type>& buffer, MidiBuffer& midiMessages,
template <typename FloatType, typename SequenceType>
static void processBlockForBuffer (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages,
AudioProcessorGraph& graph, AudioProcessorGraph& graph,
GraphRenderSequence<Type>* renderSequence,
ScopedPointer<SequenceType>& renderSequence,
Atomic<int>& isPrepared) Atomic<int>& isPrepared)
{ {
if (graph.isNonRealtime()) if (graph.isNonRealtime())
@@ -1333,7 +1335,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer<float>& buffer, MidiBuffer&
if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread())
handleAsyncUpdate(); handleAsyncUpdate();
processBlockForBuffer<float> (buffer, midiMessages, *this, renderSequenceFloat.get(), isPrepared);
processBlockForBuffer<float> (buffer, midiMessages, *this, renderSequenceFloat, isPrepared);
} }
void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages) void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
@@ -1341,7 +1343,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer&
if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread()) if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread())
handleAsyncUpdate(); handleAsyncUpdate();
processBlockForBuffer<double> (buffer, midiMessages, *this, renderSequenceDouble.get(), isPrepared);
processBlockForBuffer<double> (buffer, midiMessages, *this, renderSequenceDouble, isPrepared);
} }
//============================================================================== //==============================================================================


Loading…
Cancel
Save