Browse Source

Make setPlayHead in AudioProcessorGraph thread safe

tags/2021-05-28
dimitriroli Julian Storer 8 years ago
parent
commit
80224cafae
2 changed files with 11 additions and 19 deletions
  1. +11
    -18
      modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp
  2. +0
    -1
      modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h

+ 11
- 18
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp View File

@@ -36,10 +36,11 @@ struct GraphRenderSequence
{
FloatType** audioBuffers;
MidiBuffer* midiBuffers;
AudioPlayHead* audioPlayHead;
int numSamples;
};
void perform (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages)
void perform (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages, AudioPlayHead* audioPlayHead)
{
auto numSamples = buffer.getNumSamples();
auto maxSamples = renderingBuffer.getNumSamples();
@@ -53,11 +54,11 @@ struct GraphRenderSequence
{
AudioBuffer<FloatType> startAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples);
midiMessages.clear (maxSamples, numSamples);
perform (startAudio, midiMessages);
perform (startAudio, midiMessages, audioPlayHead);
}
AudioBuffer<FloatType> 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<float>& buffer, MidiBuffer&
const ScopedLock sl (getCallbackLock());
if (renderSequenceFloat != nullptr)
renderSequenceFloat->perform (buffer, midiMessages);
renderSequenceFloat->perform (buffer, midiMessages, getPlayHead());
}
void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
@@ -1277,7 +1270,7 @@ void AudioProcessorGraph::processBlock (AudioBuffer<double>& buffer, MidiBuffer&
const ScopedLock sl (getCallbackLock());
if (renderSequenceDouble != nullptr)
renderSequenceDouble->perform (buffer, midiMessages);
renderSequenceDouble->perform (buffer, midiMessages, getPlayHead());
}
//==============================================================================


+ 0
- 1
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h View File

@@ -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;


Loading…
Cancel
Save