diff --git a/extras/Introjucer/JuceLibraryCode/BinaryData.cpp b/extras/Introjucer/JuceLibraryCode/BinaryData.cpp index ee5da55a81..159c38352b 100644 --- a/extras/Introjucer/JuceLibraryCode/BinaryData.cpp +++ b/extras/Introjucer/JuceLibraryCode/BinaryData.cpp @@ -374,18 +374,21 @@ static const unsigned char temp_binary_data_4[] = "\r\n" "void FILTERCLASSNAME::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages)\r\n" "{\r\n" +" const int totalNumInputChannels = getTotalNumInputChannels();\r\n" +" const int totalNumOutputChannels = getTotalNumOutputChannels();\r\n" +"\r\n" " // In case we have more outputs than inputs, this code clears any output\r\n" " // channels that didn't contain input data, (because these aren't\r\n" " // guaranteed to be empty - they may contain garbage).\r\n" -" // I've added this to avoid people getting screaming feedback\r\n" -" // when they first compile the plugin, but obviously you don't need to\r\n" -" // this code if your algorithm already fills all the output channels.\r\n" -" for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i)\r\n" +" // This is here to avoid people getting screaming feedback\r\n" +" // when they first compile a plugin, but obviously you don't need to keep\r\n" +" // this code if your algorithm always overwrites all the output channels.\r\n" +" for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i)\r\n" " buffer.clear (i, 0, buffer.getNumSamples());\r\n" "\r\n" " // This is the place where you'd normally do the guts of your plugin's\r\n" " // audio processing...\r\n" -" for (int channel = 0; channel < getNumInputChannels(); ++channel)\r\n" +" for (int channel = 0; channel < totalNumInputChannels; ++channel)\r\n" " {\r\n" " float* channelData = buffer.getWritePointer (channel);\r\n" "\r\n" @@ -3813,7 +3816,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw case 0xafccbd3f: numBytes = 3189; return jucer_AudioComponentTemplate_cpp; case 0x27c5a93a: numBytes = 1180; return jucer_AudioPluginEditorTemplate_cpp; case 0x4d0721bf: numBytes = 1012; return jucer_AudioPluginEditorTemplate_h; - case 0x51b49ac5: numBytes = 4216; return jucer_AudioPluginFilterTemplate_cpp; + case 0x51b49ac5: numBytes = 4359; return jucer_AudioPluginFilterTemplate_cpp; case 0x488afa0a: numBytes = 2188; return jucer_AudioPluginFilterTemplate_h; case 0xabad7041: numBytes = 2161; return jucer_ComponentTemplate_cpp; case 0xfc72fe86: numBytes = 2141; return jucer_ComponentTemplate_h; diff --git a/extras/Introjucer/JuceLibraryCode/BinaryData.h b/extras/Introjucer/JuceLibraryCode/BinaryData.h index b217720d2c..68eabebc99 100644 --- a/extras/Introjucer/JuceLibraryCode/BinaryData.h +++ b/extras/Introjucer/JuceLibraryCode/BinaryData.h @@ -22,7 +22,7 @@ namespace BinaryData const int jucer_AudioPluginEditorTemplate_hSize = 1012; extern const char* jucer_AudioPluginFilterTemplate_cpp; - const int jucer_AudioPluginFilterTemplate_cppSize = 4216; + const int jucer_AudioPluginFilterTemplate_cppSize = 4359; extern const char* jucer_AudioPluginFilterTemplate_h; const int jucer_AudioPluginFilterTemplate_hSize = 2188; diff --git a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp index 61fa3b206a..8b4ccffc2f 100644 --- a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp +++ b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp @@ -93,18 +93,21 @@ void FILTERCLASSNAME::releaseResources() void FILTERCLASSNAME::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { + const int totalNumInputChannels = getTotalNumInputChannels(); + const int totalNumOutputChannels = getTotalNumOutputChannels(); + // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). - // I've added this to avoid people getting screaming feedback - // when they first compile the plugin, but obviously you don't need to - // this code if your algorithm already fills all the output channels. - for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) + // This is here to avoid people getting screaming feedback + // when they first compile a plugin, but obviously you don't need to keep + // this code if your algorithm always overwrites all the output channels. + for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); // This is the place where you'd normally do the guts of your plugin's // audio processing... - for (int channel = 0; channel < getNumInputChannels(); ++channel) + for (int channel = 0; channel < totalNumInputChannels; ++channel) { float* channelData = buffer.getWritePointer (channel); diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp index e61dd61d3f..a3240a431d 100644 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp @@ -498,8 +498,8 @@ public: midiTransport = new CEffectMIDITransport (&mMIDIWorld); midiEvents.ensureSize (2048); - channels.calloc (jmax (juceFilter->getNumInputChannels(), - juceFilter->getNumOutputChannels())); + channels.calloc (jmax (juceFilter->getTotalNumInputChannels(), + juceFilter->getTotalNumOutputChannels())); juceFilter->setPlayHead (this); juceFilter->addListener (this); @@ -539,14 +539,14 @@ public: #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS const int numMidiEventsComingIn = midiEvents.getNumEvents(); - (void) numMidiEventsComingIn; + ignoreUnused (numMidiEventsComingIn); #endif { const ScopedLock sl (juceFilter->getCallbackLock()); - const int numIn = juceFilter->getNumInputChannels(); - const int numOut = juceFilter->getNumOutputChannels(); + const int numIn = juceFilter->getTotalNumInputChannels(); + const int numOut = juceFilter->getTotalNumOutputChannels(); const int totalChans = jmax (numIn, numOut); if (juceFilter->isSuspended()) diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index b3aaf25fd5..d42534cb66 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -379,8 +379,8 @@ public: desc.category = AudioUnitFormatHelpers::getCategory (componentDesc.componentType); desc.manufacturerName = manufacturer; desc.version = version; - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); + desc.numInputChannels = getTotalNumInputChannels(); + desc.numOutputChannels = getTotalNumOutputChannels(); desc.isInstrument = (componentDesc.componentType == kAudioUnitType_MusicDevice); } @@ -578,7 +578,7 @@ public: else { // Plugin not working correctly, so just bypass.. - for (int i = 0; i < getNumOutputChannels(); ++i) + for (int i = getTotalNumOutputChannels(); --i >= 0;) buffer.clear (i, 0, buffer.getNumSamples()); } @@ -597,7 +597,7 @@ public: //============================================================================== const String getInputChannelName (int index) const override { - if (isPositiveAndBelow (index, getNumInputChannels())) + if (isPositiveAndBelow (index, getTotalNumInputChannels())) return "Input " + String (index + 1); return String(); @@ -605,14 +605,14 @@ public: const String getOutputChannelName (int index) const override { - if (isPositiveAndBelow (index, getNumOutputChannels())) + if (isPositiveAndBelow (index, getTotalNumOutputChannels())) return "Output " + String (index + 1); return String(); } - bool isInputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumInputChannels()); } - bool isOutputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumOutputChannels()); } + bool isInputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getTotalNumInputChannels()); } + bool isOutputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getTotalNumOutputChannels()); } //============================================================================== int getNumParameters() override { return parameters.size(); } diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index f9863345d8..6457de14f6 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -225,8 +225,8 @@ public: desc.category = getCategory(); desc.manufacturerName = plugin != nullptr ? String (plugin->Maker) : String(); desc.version = getVersion(); - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); + desc.numInputChannels = getTotalNumInputChannels(); + desc.numOutputChannels = getTotalNumOutputChannels(); desc.isInstrument = false; } @@ -327,16 +327,16 @@ public: jassertfalse; // no callback to use? } - for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) + for (int i = getTotalNumInputChannels(), e = getTotalNumOutputChannels(); i < e; ++i) buffer.clear (i, 0, numSamples); } - bool isInputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } - bool isOutputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } + bool isInputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getTotalNumInputChannels()); } + bool isOutputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getTotalNumOutputChannels()); } const String getInputChannelName (const int index) const { - if (isPositiveAndBelow (index, getNumInputChannels())) + if (isPositiveAndBelow (index, getTotalNumInputChannels())) return String (plugin->PortNames [inputs [index]]).trim(); return String(); @@ -344,7 +344,7 @@ public: const String getOutputChannelName (const int index) const { - if (isPositiveAndBelow (index, getNumInputChannels())) + if (isPositiveAndBelow (index, getTotalNumInputChannels())) return String (plugin->PortNames [outputs [index]]).trim(); return String(); diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 5402615364..4ceb5b70ad 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -1665,8 +1665,8 @@ public: createPluginDescription (description, module->file, company, module->name, *info, info2, infoW, - getNumInputChannels(), - getNumOutputChannels()); + getTotalNumInputChannels(), + getTotalNumOutputChannels()); } void* getPlatformSpecificData() override { return component; } @@ -1808,7 +1808,7 @@ public: updateTimingInformation (data, getSampleRate()); - for (int i = getNumInputChannels(); i < buffer.getNumChannels(); ++i) + for (int i = getTotalNumInputChannels(); i < buffer.getNumChannels(); ++i) buffer.clear (i, 0, numSamples); associateTo (data, buffer); @@ -1845,18 +1845,14 @@ public: bool isInputChannelStereoPair (int channelIndex) const override { - if (channelIndex < 0 || channelIndex >= getNumInputChannels()) - return false; - - return getBusInfo (true, true).channelCount == 2; + return isPositiveAndBelow (channelIndex, getTotalNumInputChannels()) + && getBusInfo (true, true).channelCount == 2; } bool isOutputChannelStereoPair (int channelIndex) const override { - if (channelIndex < 0 || channelIndex >= getNumOutputChannels()) - return false; - - return getBusInfo (false, true).channelCount == 2; + return isPositiveAndBelow (channelIndex, getTotalNumOutputChannels()) + && getBusInfo (false, true).channelCount == 2; } bool acceptsMidi() const override { return getBusInfo (true, false).channelCount > 0; } diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 8cd0619aaf..2f7e99df70 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -815,8 +815,8 @@ public: } desc.version = getVersion(); - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); + desc.numInputChannels = getTotalNumInputChannels(); + desc.numOutputChannels = getTotalNumOutputChannels(); desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0); } @@ -1017,7 +1017,7 @@ public: //============================================================================== const String getInputChannelName (int index) const override { - if (index >= 0 && index < getNumInputChannels()) + if (isValidChannel (index, true)) { VstPinProperties pinProps; if (dispatch (effGetInputProperties, index, 0, &pinProps, 0.0f) != 0) @@ -1029,7 +1029,7 @@ public: bool isInputChannelStereoPair (int index) const override { - if (index < 0 || index >= getNumInputChannels()) + if (! isValidChannel (index, true)) return false; VstPinProperties pinProps; @@ -1041,7 +1041,7 @@ public: const String getOutputChannelName (int index) const override { - if (index >= 0 && index < getNumOutputChannels()) + if (isValidChannel (index, false)) { VstPinProperties pinProps; if (dispatch (effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0) @@ -1053,7 +1053,7 @@ public: bool isOutputChannelStereoPair (int index) const override { - if (index < 0 || index >= getNumOutputChannels()) + if (! isValidChannel (index, false)) return false; VstPinProperties pinProps; @@ -1063,9 +1063,10 @@ public: return true; } - bool isValidChannel (int index, bool isInput) const + bool isValidChannel (int index, bool isInput) const noexcept { - return isPositiveAndBelow (index, isInput ? getNumInputChannels() : getNumOutputChannels()); + return isPositiveAndBelow (index, isInput ? getTotalNumInputChannels() + : getTotalNumOutputChannels()); } //============================================================================== @@ -1686,7 +1687,7 @@ private: else { // Not initialised, so just bypass.. - for (int i = 0; i < getNumOutputChannels(); ++i) + for (int i = getTotalNumOutputChannels(); --i >= 0;) buffer.clear (i, 0, buffer.getNumSamples()); }