Browse Source

AudioProcessorGraph: start outputting audio only after the graph is prepared.

tags/2021-05-28
Lukasz Kozakiewicz 8 years ago
parent
commit
b5e1c3d4c4
1 changed files with 39 additions and 6 deletions
  1. +39
    -6
      modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp

+ 39
- 6
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp View File

@@ -1256,20 +1256,53 @@ bool AudioProcessorGraph::producesMidi() const { return tru
void AudioProcessorGraph::getStateInformation (juce::MemoryBlock&) {}
void AudioProcessorGraph::setStateInformation (const void*, int) {}
template <typename Type>
static void processBlockForBuffer (AudioBuffer<Type>& buffer, MidiBuffer& midiMessages,
AudioProcessorGraph& graph,
GraphRenderSequence<Type>* renderSequence,
Atomic<int>& 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<float>& buffer, MidiBuffer& midiMessages)
{
const ScopedLock sl (getCallbackLock());
if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread())
handleAsyncUpdate();
if (renderSequenceFloat != nullptr)
renderSequenceFloat->perform (buffer, midiMessages, getPlayHead());
processBlockForBuffer<float> (buffer, midiMessages, *this, renderSequenceFloat, isPrepared);
}
void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
{
const ScopedLock sl (getCallbackLock());
if (isPrepared.get() == 0 && MessageManager::getInstance()->isThisTheMessageThread())
handleAsyncUpdate();
if (renderSequenceDouble != nullptr)
renderSequenceDouble->perform (buffer, midiMessages, getPlayHead());
processBlockForBuffer<double> (buffer, midiMessages, *this, renderSequenceDouble, isPrepared);
}
//==============================================================================


Loading…
Cancel
Save