diff --git a/examples/Plugins/ArpeggiatorPluginDemo.h b/examples/Plugins/ArpeggiatorPluginDemo.h index 803630f1b1..bcf6006d9a 100644 --- a/examples/Plugins/ArpeggiatorPluginDemo.h +++ b/examples/Plugins/ArpeggiatorPluginDemo.h @@ -79,7 +79,7 @@ public: void processBlock (AudioBuffer& buffer, MidiBuffer& midi) override { - // the audio buffer in a midi effect will have zero channels! + // A pure MIDI plugin shouldn't be provided any audio data jassert (buffer.getNumChannels() == 0); // however we use the buffer to get timing information diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 9270ebe99d..e519bedf9f 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -268,7 +268,16 @@ private: for (int i = 0; i < totalChans; ++i) audioChannels[i] = c.audioBuffers[audioChannelsToUse.getUnchecked (i)]; - AudioBuffer buffer (audioChannels, totalChans, c.numSamples); + auto numAudioChannels = [this] + { + if (const auto* proc = node->getProcessor()) + if (proc->getTotalNumInputChannels() == 0 && proc->getTotalNumOutputChannels() == 0) + return 0; + + return totalChans; + }(); + + AudioBuffer buffer (audioChannels, numAudioChannels, c.numSamples); const ScopedLock lock (processor.getCallbackLock()); diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index 7b6ab003a3..24cb4c1864 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -155,17 +155,27 @@ public: void prepare (double newSampleRate, int newBlockSize, AudioProcessorGraph*, ProcessingPrecision); void unprepare(); + bool hasNoConnections() const noexcept { return inputs.isEmpty() && outputs.isEmpty(); } + template void processBlock (AudioBuffer& audio, MidiBuffer& midi) { + if (hasNoConnections()) + return; + const ScopedLock lock (processorLock); + processor->processBlock (audio, midi); } template void processBlockBypassed (AudioBuffer& audio, MidiBuffer& midi) { + if (hasNoConnections()) + return; + const ScopedLock lock (processorLock); + processor->processBlockBypassed (audio, midi); }