diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index 24418b6943..caba2707ab 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -367,6 +367,19 @@ public: void* getPlatformSpecificData() { return audioUnit; } const String getName() const { return pluginName; } + + bool silenceInProducesSilenceOut() const + { + Float64 tail = 0; + UInt32 tailSize = sizeof (tail); + + if (audioUnit != 0) + AudioUnitGetProperty (audioUnit, kAudioUnitProperty_TailTime, kAudioUnitScope_Global, + 0, &tail, &tailSize); + + return tail <= 0; + } + bool acceptsMidi() const { return wantsMidiMessages; } bool producesMidi() const { return producesMidiMessages; } diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 4c4f4e99a8..73f5844ae7 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -871,8 +871,8 @@ public: setLatencySamples (effect->initialDelay); } - void* getPlatformSpecificData() { return effect; } - const String getName() const { return name; } + void* getPlatformSpecificData() { return effect; } + const String getName() const { return name; } int getUID() const { @@ -884,8 +884,13 @@ public: return uid; } - bool acceptsMidi() const { return wantsMidiMessages; } - bool producesMidi() const { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } + bool silenceInProducesSilenceOut() const + { + return effect == nullptr || (effect->flags & effFlagsNoSoundInStop) != 0; + } + + bool acceptsMidi() const { return wantsMidiMessages; } + bool producesMidi() const { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } //============================================================================== void prepareToPlay (double rate, int samplesPerBlockExpected) diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index 26ede7d66e..e6b23d0790 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -239,6 +239,9 @@ public: */ void setLatencySamples (int newLatency); + /** Returns true if a silent input always produces a silent output (i.e. it has no tail). */ + virtual bool silenceInProducesSilenceOut() const = 0; + /** Returns true if the processor wants midi messages. */ virtual bool acceptsMidi() const = 0; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 5e74e16529..76366e8c4c 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -1322,6 +1322,7 @@ const String AudioProcessorGraph::getOutputChannelName (int channelIndex) const bool AudioProcessorGraph::isInputChannelStereoPair (int /*index*/) const { return true; } bool AudioProcessorGraph::isOutputChannelStereoPair (int /*index*/) const { return true; } +bool AudioProcessorGraph::silenceInProducesSilenceOut() const { return false; } bool AudioProcessorGraph::acceptsMidi() const { return true; } bool AudioProcessorGraph::producesMidi() const { return true; } void AudioProcessorGraph::getStateInformation (juce::MemoryBlock& /*destData*/) {} @@ -1423,6 +1424,11 @@ void AudioProcessorGraph::AudioGraphIOProcessor::processBlock (AudioSampleBuffer } } +bool AudioProcessorGraph::AudioGraphIOProcessor::silenceInProducesSilenceOut() const +{ + return isOutput(); +} + bool AudioProcessorGraph::AudioGraphIOProcessor::acceptsMidi() const { return type == midiOutputNode; diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index 67a56f63ec..de8b74c2be 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -320,6 +320,7 @@ public: const String getOutputChannelName (int channelIndex) const; bool isInputChannelStereoPair (int index) const; bool isOutputChannelStereoPair (int index) const; + bool silenceInProducesSilenceOut() const; bool acceptsMidi() const; bool producesMidi() const; @@ -364,6 +365,7 @@ public: const String getOutputChannelName (int channelIndex) const; bool isInputChannelStereoPair (int index) const; bool isOutputChannelStereoPair (int index) const; + bool silenceInProducesSilenceOut() const; bool acceptsMidi() const; bool producesMidi() const;