1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-28 02:30:05 +00:00

Make setPlayHead in AudioProcessorGraph thread safe

This commit is contained in:
dimitriroli 2018-02-02 11:59:40 +00:00 committed by Julian Storer
parent 3c0d634b4f
commit 80224cafae
2 changed files with 11 additions and 19 deletions

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());
}
//==============================================================================

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;