diff --git a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp index 9902788301..4dfbf7995a 100644 --- a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp +++ b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.cpp @@ -93,6 +93,11 @@ bool FILTERCLASSNAME::silenceInProducesSilenceOut() const return false; } +double FILTERCLASSNAME::getTailLengthSeconds() const +{ + return 0.0; +} + int FILTERCLASSNAME::getNumPrograms() { return 0; diff --git a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h index 8bbaea3bc5..875f1375f5 100644 --- a/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h +++ b/extras/Introjucer/Source/BinaryData/jucer_AudioPluginFilterTemplate.h @@ -53,6 +53,7 @@ public: bool acceptsMidi() const; bool producesMidi() const; bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; //============================================================================== int getNumPrograms(); diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index 3d73d01f35..c77b815a3f 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -45,7 +45,6 @@ namespace Value getPluginWantsMidiInput (Project& project) { return project.getProjectValue ("pluginWantsMidiIn"); } Value getPluginProducesMidiOut (Project& project) { return project.getProjectValue ("pluginProducesMidiOut"); } Value getPluginSilenceInProducesSilenceOut (Project& project) { return project.getProjectValue ("pluginSilenceInIsSilenceOut"); } - Value getPluginTailLengthSeconds (Project& project) { return project.getProjectValue ("pluginTailLength"); } Value getPluginEditorNeedsKeyFocus (Project& project) { return project.getProjectValue ("pluginEditorRequiresKeys"); } Value getPluginAUExportPrefix (Project& project) { return project.getProjectValue ("pluginAUExportPrefix"); } Value getPluginAUCocoaViewClassName (Project& project) { return project.getProjectValue ("pluginAUViewClass"); } @@ -138,7 +137,6 @@ namespace flags.set ("JucePlugin_WantsMidiInput", valueToBool (getPluginWantsMidiInput (project))); flags.set ("JucePlugin_ProducesMidiOutput", valueToBool (getPluginProducesMidiOut (project))); flags.set ("JucePlugin_SilenceInProducesSilenceOut", valueToBool (getPluginSilenceInProducesSilenceOut (project))); - flags.set ("JucePlugin_TailLengthSeconds", String (static_cast (getPluginTailLengthSeconds (project).getValue()))); flags.set ("JucePlugin_EditorRequiresKeyboardFocus", valueToBool (getPluginEditorNeedsKeyFocus (project))); flags.set ("JucePlugin_Version", project.getVersionString()); flags.set ("JucePlugin_VersionCode", project.getVersionAsHex()); diff --git a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp index d182f23a67..afc173ddb7 100644 --- a/extras/Introjucer/Source/Project/jucer_ProjectType.cpp +++ b/extras/Introjucer/Source/Project/jucer_ProjectType.cpp @@ -188,7 +188,6 @@ public: setValueIfVoid (getPluginWantsMidiInput (project), false); setValueIfVoid (getPluginProducesMidiOut (project), false); setValueIfVoid (getPluginSilenceInProducesSilenceOut (project), false); - setValueIfVoid (getPluginTailLengthSeconds (project), 0); setValueIfVoid (getPluginEditorNeedsKeyFocus (project), false); setValueIfVoid (getPluginAUExportPrefix (project), sanitisedProjectName + "AU"); setValueIfVoid (getPluginAUCocoaViewClassName (project), sanitisedProjectName + "AU_V1"); @@ -238,9 +237,6 @@ public: props.add (new BooleanPropertyComponent (getPluginSilenceInProducesSilenceOut (project), "Silence", "Silence in produces silence out"), "Enable this if your plugin has no tail - i.e. if passing a silent buffer to it will always result in a silent buffer being produced."); - props.add (new TextPropertyComponent (getPluginTailLengthSeconds (project), "Tail Length (in seconds)", 12, false), - "This indicates the length, in seconds, of the plugin's tail. This information may or may not be used by the host."); - props.add (new BooleanPropertyComponent (getPluginEditorNeedsKeyFocus (project), "Key Focus", "Plugin editor requires keyboard focus"), "Enable this if your plugin needs keyboard input - some hosts can be a bit funny about keyboard focus.."); diff --git a/extras/audio plugin demo/JuceLibraryCode/AppConfig.h b/extras/audio plugin demo/JuceLibraryCode/AppConfig.h index ef2869f59f..fd2c54acf6 100644 --- a/extras/audio plugin demo/JuceLibraryCode/AppConfig.h +++ b/extras/audio plugin demo/JuceLibraryCode/AppConfig.h @@ -212,9 +212,6 @@ #ifndef JucePlugin_SilenceInProducesSilenceOut #define JucePlugin_SilenceInProducesSilenceOut 0 #endif -#ifndef JucePlugin_TailLengthSeconds - #define JucePlugin_TailLengthSeconds 0 -#endif #ifndef JucePlugin_EditorRequiresKeyboardFocus #define JucePlugin_EditorRequiresKeyboardFocus 1 #endif diff --git a/extras/audio plugin demo/Source/PluginProcessor.cpp b/extras/audio plugin demo/Source/PluginProcessor.cpp index a5129e93aa..f1995bcd33 100644 --- a/extras/audio plugin demo/Source/PluginProcessor.cpp +++ b/extras/audio plugin demo/Source/PluginProcessor.cpp @@ -377,6 +377,11 @@ bool JuceDemoPluginAudioProcessor::silenceInProducesSilenceOut() const return false; } +double JuceDemoPluginAudioProcessor::getTailLengthSeconds() const +{ + return 0.0; +} + //============================================================================== // This creates new instances of the plugin.. AudioProcessor* JUCE_CALLTYPE createPluginFilter() diff --git a/extras/audio plugin demo/Source/PluginProcessor.h b/extras/audio plugin demo/Source/PluginProcessor.h index ac8929d34d..3a4cf0d258 100644 --- a/extras/audio plugin demo/Source/PluginProcessor.h +++ b/extras/audio plugin demo/Source/PluginProcessor.h @@ -51,6 +51,7 @@ public: bool acceptsMidi() const; bool producesMidi() const; bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; //============================================================================== int getNumPrograms() { return 0; } diff --git a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index 6e845bbb01..d27b2f5171 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -441,7 +441,7 @@ public: //============================================================================== ComponentResult Version() { return JucePlugin_VersionCode; } bool SupportsTail() { return true; } - Float64 GetTailTime() { return (JucePlugin_TailLengthSeconds); } + Float64 GetTailTime() { return juceFilter->getTailLengthSeconds(); } Float64 GetSampleRate() { return GetOutput(0)->GetStreamFormat().mSampleRate; } Float64 GetLatency() diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 82e961e818..6484f655cc 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -292,7 +292,7 @@ public: canProcessReplacing (true); isSynth ((JucePlugin_IsSynth) != 0); - noTail (((JucePlugin_SilenceInProducesSilenceOut) != 0) && (JucePlugin_TailLengthSeconds <= 0)); + noTail (filter->getTailLengthSeconds() <= 0); setInitialDelay (filter->getLatencySamples()); programsAreChunks (true); diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index 85d1d75462..966a45094d 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -75,10 +75,6 @@ #error "You need to define the JucePlugin_EditorRequiresKeyboardFocus value!" #endif -#ifndef JucePlugin_TailLengthSeconds - #error "You need to define the JucePlugin_TailLengthSeconds value!" -#endif - //============================================================================== #if _WIN64 || (__LP64__ && (defined(__APPLE_CPP__) || defined(__APPLE_CC__))) #undef JucePlugin_Build_RTAS diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index ad41389193..ef5cb5f5d5 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -376,6 +376,11 @@ public: const String getName() const { return pluginName; } bool silenceInProducesSilenceOut() const + { + return getTailLengthSeconds() <= 0; + } + + double getTailLengthSeconds() const { Float64 tail = 0; UInt32 tailSize = sizeof (tail); @@ -384,7 +389,7 @@ public: AudioUnitGetProperty (audioUnit, kAudioUnitProperty_TailTime, kAudioUnitScope_Global, 0, &tail, &tailSize); - return tail <= 0; + return tail; } bool acceptsMidi() const { return wantsMidiMessages; } diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index e45a22e437..5647851f6c 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -892,6 +892,20 @@ public: return effect == nullptr || (effect->flags & effFlagsNoSoundInStop) != 0; } + double getTailLengthSeconds() const + { + if (effect == nullptr) + return 0.0; + + const double sampleRate = getSampleRate(); + + if (sampleRate <= 0) + return 0.0; + + VstIntPtr samples = dispatch (effGetTailSize, 0, 0, 0, 0); + return samples / sampleRate; + } + bool acceptsMidi() const { return wantsMidiMessages; } bool producesMidi() const { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index 74104d1ac0..e919bcf29d 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -250,9 +250,12 @@ public: */ void setLatencySamples (int newLatency); - /** Returns true if a silent input always produces a silent output (i.e. it has no tail). */ + /** Returns true if a silent input always produces a silent output. */ virtual bool silenceInProducesSilenceOut() const = 0; + /** Returns the length of the filter's tail, in seconds. */ + virtual double getTailLengthSeconds() 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 f32055fa81..7001d5985b 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -1328,6 +1328,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; } +double AudioProcessorGraph::getTailLengthSeconds() const { return 0; } bool AudioProcessorGraph::acceptsMidi() const { return true; } bool AudioProcessorGraph::producesMidi() const { return true; } void AudioProcessorGraph::getStateInformation (juce::MemoryBlock& /*destData*/) {} diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index 14ef440407..d4139ecd9e 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -321,6 +321,7 @@ public: bool isInputChannelStereoPair (int index) const; bool isOutputChannelStereoPair (int index) const; bool silenceInProducesSilenceOut() const; + double getTailLengthSeconds() const; bool acceptsMidi() const; bool producesMidi() const;