From 80224cafaefdea020d349e7c4dc46b74736ce6b1 Mon Sep 17 00:00:00 2001 From: dimitriroli Date: Fri, 2 Feb 2018 11:59:40 +0000 Subject: [PATCH] Make setPlayHead in AudioProcessorGraph thread safe --- .../processors/juce_AudioProcessorGraph.cpp | 29 +++++++------------ .../processors/juce_AudioProcessorGraph.h | 1 - 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index f981311948..8f0fe3ddd5 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -36,10 +36,11 @@ struct GraphRenderSequence { FloatType** audioBuffers; MidiBuffer* midiBuffers; + AudioPlayHead* audioPlayHead; int numSamples; }; - void perform (AudioBuffer& buffer, MidiBuffer& midiMessages) + void perform (AudioBuffer& buffer, MidiBuffer& midiMessages, AudioPlayHead* audioPlayHead) { auto numSamples = buffer.getNumSamples(); auto maxSamples = renderingBuffer.getNumSamples(); @@ -53,11 +54,11 @@ struct GraphRenderSequence { AudioBuffer startAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples); midiMessages.clear (maxSamples, numSamples); - perform (startAudio, midiMessages); + perform (startAudio, midiMessages, audioPlayHead); } AudioBuffer endAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples, numSamples - maxSamples); - perform (endAudio, tempMIDI); + perform (endAudio, tempMIDI, audioPlayHead); return; } @@ -68,7 +69,7 @@ struct GraphRenderSequence currentMidiOutputBuffer.clear(); { - const Context context { renderingBuffer.getArrayOfWritePointers(), midiBuffers.begin(), numSamples }; + const Context context { renderingBuffer.getArrayOfWritePointers(), midiBuffers.begin(), audioPlayHead, numSamples }; for (auto* op : renderOps) op->perform (context); @@ -210,7 +211,7 @@ private: buffer.calloc ((size_t) bufferSize); } - void perform (const Context& c) + void perform (const Context& c) override { auto* data = c.audioBuffers[channel]; @@ -249,8 +250,10 @@ private: audioChannelsToUse.add (0); } - void perform (const Context& c) + void perform (const Context& c) override { + processor.setPlayHead (c.audioPlayHead); + for (int i = 0; i < totalChans; ++i) audioChannels[i] = c.audioBuffers[audioChannelsToUse.getUnchecked (i)]; @@ -1248,16 +1251,6 @@ void AudioProcessorGraph::setNonRealtime (bool isProcessingNonRealtime) noexcept n->getProcessor()->setNonRealtime (isProcessingNonRealtime); } -void AudioProcessorGraph::setPlayHead (AudioPlayHead* audioPlayHead) -{ - const ScopedLock sl (getCallbackLock()); - - AudioProcessor::setPlayHead (audioPlayHead); - - for (auto* n : nodes) - n->getProcessor()->setPlayHead (audioPlayHead); -} - double AudioProcessorGraph::getTailLengthSeconds() const { return 0; } bool AudioProcessorGraph::acceptsMidi() const { return true; } bool AudioProcessorGraph::producesMidi() const { return true; } @@ -1269,7 +1262,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& const ScopedLock sl (getCallbackLock()); if (renderSequenceFloat != nullptr) - renderSequenceFloat->perform (buffer, midiMessages); + renderSequenceFloat->perform (buffer, midiMessages, getPlayHead()); } void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) @@ -1277,7 +1270,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer& buffer, MidiBuffer& const ScopedLock sl (getCallbackLock()); if (renderSequenceDouble != nullptr) - renderSequenceDouble->perform (buffer, midiMessages); + renderSequenceDouble->perform (buffer, midiMessages, getPlayHead()); } //============================================================================== diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index 0362943cab..3b23bc5fa1 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -349,7 +349,6 @@ public: void reset() override; void setNonRealtime (bool) noexcept override; - void setPlayHead (AudioPlayHead*) override; double getTailLengthSeconds() const override; bool acceptsMidi() const override;