From f69b9eb884a0fe722d3eb5021473e64367bdab31 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 25 Apr 2018 12:56:23 +0100 Subject: [PATCH] Add a config flag to juce_audio_processors for enabling LADSPA plugin hosting and enable it in AudioPluginHost --- extras/AudioPluginHost/AudioPluginHost.jucer | 3 +- .../JuceLibraryCode/AppConfig.h | 4 + .../format_types/juce_LADSPAPluginFormat.cpp | 450 ++++++++---------- .../juce_audio_processors.h | 21 +- 4 files changed, 227 insertions(+), 251 deletions(-) diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index b5ea0ce5fe..074a4754b8 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -211,7 +211,8 @@ + JUCE_PLUGINHOST_AU="1" JUCE_WEB_BROWSER="0" JUCE_PLUGINHOST_VST3="1" + JUCE_PLUGINHOST_LADSPA="1"/> diff --git a/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h b/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h index a319a11eb7..6b8cbf5efa 100644 --- a/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h +++ b/extras/AudioPluginHost/JuceLibraryCode/AppConfig.h @@ -152,6 +152,10 @@ #define JUCE_PLUGINHOST_AU 1 #endif +#ifndef JUCE_PLUGINHOST_LADSPA + #define JUCE_PLUGINHOST_LADSPA 1 +#endif + //============================================================================== // juce_audio_utils flags: diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index 2b2c44b85e..c5831e4cdb 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -47,7 +47,7 @@ class LADSPAModuleHandle : public ReferenceCountedObject { public: LADSPAModuleHandle (const File& f) - : file (f), moduleMain (nullptr) + : file (f) { getActiveModules().add (this); } @@ -68,9 +68,9 @@ public: static LADSPAModuleHandle* findOrCreateModule (const File& file) { - for (int i = getActiveModules().size(); --i >= 0;) + for (auto i = getActiveModules().size(); --i >= 0;) { - LADSPAModuleHandle* const module = getActiveModules().getUnchecked(i); + auto* module = getActiveModules().getUnchecked(i); if (module->file == file) return module; @@ -92,7 +92,7 @@ public: } File file; - LADSPA_Descriptor_Function moduleMain; + LADSPA_Descriptor_Function moduleMain = nullptr; private: DynamicLibrary module; @@ -101,7 +101,8 @@ private: { module.open (file.getFullPathName()); moduleMain = (LADSPA_Descriptor_Function) module.getFunction ("ladspa_descriptor"); - return moduleMain != nullptr; + + return (moduleMain != nullptr); } void close() @@ -116,172 +117,8 @@ private: class LADSPAPluginInstance : public AudioPluginInstance { public: - struct LADSPAParameter final : public Parameter - { - struct ParameterValue - { - inline ParameterValue() noexcept : scaled (0), unscaled (0) {} - inline ParameterValue (float s, float u) noexcept : scaled (s), unscaled (u) {} - - float scaled, unscaled; - }; - - LADSPAParameter (LADSPAPluginInstance& parent, - int parameterID, - const String& parameterName, - bool parameterIsAutomatable) - : pluginInstance (parent), - paramID (parameterID), - name (parameterName), - automatable (parameterIsAutomatable) - { - reset(); - } - - virtual float getValue() const override - { - if (pluginInstance.plugin != nullptr) - { - const ScopedLock sl (pluginInstance.lock); - - return paramValue.unscaled; - } - - return 0.0f; - } - - String getCurrentValueAsText() const override - { - if (auto* interface = pluginInstance.plugin) - { - const LADSPA_PortRangeHint& hint = interface->PortRangeHints[paramID]; - - if (LADSPA_IS_HINT_INTEGER (hint.HintDescriptor)) - return String ((int) paramValue.scaled); - - return String (paramValue.scaled, 4); - } - - return {}; - } - - virtual void setValue (float newValue) override - { - if (auto* interface = pluginInstance.plugin) - { - const ScopedLock sl (pluginInstance.lock); - - if (paramValue.unscaled != newValue) - paramValue = ParameterValue (getNewParamScaled (interface->PortRangeHints [paramID], newValue), newValue); - } - } - - float getDefaultValue() const override - { - return defaultValue; - } - - ParameterValue getDefaultParamValue() const - { - if (auto* interface = pluginInstance.plugin) - { - const LADSPA_PortRangeHint& hint = interface->PortRangeHints[paramID]; - const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; - - if (LADSPA_IS_HINT_HAS_DEFAULT (desc)) - { - if (LADSPA_IS_HINT_DEFAULT_0 (desc)) return ParameterValue(); - if (LADSPA_IS_HINT_DEFAULT_1 (desc)) return ParameterValue (1.0f, 1.0f); - if (LADSPA_IS_HINT_DEFAULT_100 (desc)) return ParameterValue (100.0f, 0.5f); - if (LADSPA_IS_HINT_DEFAULT_440 (desc)) return ParameterValue (440.0f, 0.5f); - - const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate() : 1.0f; - const float lower = hint.LowerBound * scale; - const float upper = hint.UpperBound * scale; - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_DEFAULT_MINIMUM (desc)) return ParameterValue (lower, 0.0f); - if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc) && LADSPA_IS_HINT_DEFAULT_MAXIMUM (desc)) return ParameterValue (upper, 1.0f); - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) - { - const bool useLog = LADSPA_IS_HINT_LOGARITHMIC (desc); - - if (LADSPA_IS_HINT_DEFAULT_LOW (desc)) return ParameterValue (scaledValue (lower, upper, 0.25f, useLog), 0.25f); - if (LADSPA_IS_HINT_DEFAULT_MIDDLE (desc)) return ParameterValue (scaledValue (lower, upper, 0.50f, useLog), 0.50f); - if (LADSPA_IS_HINT_DEFAULT_HIGH (desc)) return ParameterValue (scaledValue (lower, upper, 0.75f, useLog), 0.75f); - } - } - } - - return ParameterValue(); - } - - void reset() - { - paramValue = getDefaultParamValue(); - defaultValue = paramValue.unscaled; - } - - String getName (int /*maximumStringLength*/) const override - { - return name; - } - - String getLabel() const override - { - return {}; - } - - bool isAutomatable() const override - { - return automatable; - } - - static float scaledValue (float low, float high, float alpha, bool useLog) noexcept - { - if (useLog && low > 0 && high > 0) - return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha); - - return low + (high - low) * alpha; - } - - static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value) - { - return LADSPA_IS_HINT_INTEGER (desc) ? ((float) (int) value) : value; - } - - float getNewParamScaled (const LADSPA_PortRangeHint& hint, float newValue) const - { - const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; - - if (LADSPA_IS_HINT_TOGGLED (desc)) - return (newValue < 0.5f) ? 0.0f : 1.0f; - - const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate() : 1.0f; - const float lower = hint.LowerBound * scale; - const float upper = hint.UpperBound * scale; - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) - return toIntIfNecessary (desc, scaledValue (lower, upper, newValue, LADSPA_IS_HINT_LOGARITHMIC (desc))); - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) return toIntIfNecessary (desc, newValue); - if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) return toIntIfNecessary (desc, newValue * upper); - - return 0.0f; - } - - LADSPAPluginInstance& pluginInstance; - const int paramID; - const String name; - const bool automatable; - - ParameterValue paramValue; - float defaultValue = 0; - }; - LADSPAPluginInstance (const LADSPAModuleHandle::Ptr& m) - : module (m), plugin (nullptr), handle (nullptr), - initialised (false), tempBuffer (1, 1) + : module (m) { ++insideLADSPACallback; @@ -291,7 +128,7 @@ public: if (module->moduleMain != nullptr) { - plugin = module->moduleMain (shellLADSPAUIDToCreate); + plugin = module->moduleMain ((size_t) shellLADSPAUIDToCreate); if (plugin == nullptr) { @@ -307,7 +144,8 @@ public: return; } - const double sampleRate = getSampleRate() > 0 ? getSampleRate() : 44100.0; + const auto sampleRate = getSampleRate() > 0 ? getSampleRate() + : 44100.0; handle = plugin->instantiate (plugin, (uint32) sampleRate); @@ -346,24 +184,21 @@ public: for (unsigned int i = 0; i < plugin->PortCount; ++i) { - const LADSPA_PortDescriptor portDesc = plugin->PortDescriptors[i]; + const auto portDesc = plugin->PortDescriptors[i]; if ((portDesc & LADSPA_PORT_CONTROL) != 0) - addParameter (new LADSPAParameter (*this, - i, - String (plugin->PortNames[i]).trim(), - (portDesc & LADSPA_PORT_INPUT) != 0)); + addParameter (new LADSPAParameter (*this, (int) i, String (plugin->PortNames[i]).trim(), (portDesc & LADSPA_PORT_INPUT) != 0)); if ((portDesc & LADSPA_PORT_AUDIO) != 0) { - if ((portDesc & LADSPA_PORT_INPUT) != 0) inputs.add (i); - if ((portDesc & LADSPA_PORT_OUTPUT) != 0) outputs.add (i); + if ((portDesc & LADSPA_PORT_INPUT) != 0) inputs.add ((int) i); + if ((portDesc & LADSPA_PORT_OUTPUT) != 0) outputs.add ((int) i); } } for (auto* param : getParameters()) if (auto* ladspaParam = dynamic_cast (param)) - plugin->connect_port (handle, ladspaParam->paramID, &(ladspaParam->paramValue.scaled)); + plugin->connect_port (handle, (size_t) ladspaParam->paramID, &(ladspaParam->paramValue.scaled)); setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize); @@ -432,7 +267,7 @@ public: // dodgy hack to force some plugins to initialise the sample rate.. if (auto* firstParam = getParameters()[0]) { - const float old = firstParam->getValue(); + const auto old = firstParam->getValue(); firstParam->setValue ((old < 0.5f) ? 1.0f : 0.0f); firstParam->setValue (old); } @@ -450,23 +285,23 @@ public: tempBuffer.setSize (1, 1); } - void processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) + void processBlock (AudioBuffer& buffer, MidiBuffer&) { auto numSamples = buffer.getNumSamples(); if (initialised && plugin != nullptr && handle != nullptr) { for (int i = 0; i < inputs.size(); ++i) - plugin->connect_port (handle, inputs[i], + plugin->connect_port (handle, (size_t) inputs[i], i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); if (plugin->run != nullptr) { for (int i = 0; i < outputs.size(); ++i) - plugin->connect_port (handle, outputs.getUnchecked(i), + plugin->connect_port (handle, (size_t) outputs.getUnchecked(i), i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); - plugin->run (handle, numSamples); + plugin->run (handle, (size_t) numSamples); return; } @@ -476,9 +311,9 @@ public: tempBuffer.clear(); for (int i = 0; i < outputs.size(); ++i) - plugin->connect_port (handle, outputs.getUnchecked(i), tempBuffer.getWritePointer (i)); + plugin->connect_port (handle, (size_t) outputs.getUnchecked(i), tempBuffer.getWritePointer (i)); - plugin->run_adding (handle, numSamples); + plugin->run_adding (handle, (size_t) numSamples); for (int i = 0; i < outputs.size(); ++i) if (i < buffer.getNumChannels()) @@ -490,7 +325,7 @@ public: jassertfalse; // no callback to use? } - for (int i = getTotalNumInputChannels(), e = getTotalNumOutputChannels(); i < e; ++i) + for (auto i = getTotalNumInputChannels(), e = getTotalNumOutputChannels(); i < e; ++i) buffer.clear (i, 0, numSamples); } @@ -514,8 +349,8 @@ public: } //============================================================================== - int getNumPrograms() { return 0; } - int getCurrentProgram() { return 0; } + int getNumPrograms() { return 0; } + int getCurrentProgram() { return 0; } void setCurrentProgram (int) { @@ -524,87 +359,219 @@ public: ladspaParam->reset(); } - const String getProgramName (int index) - { - // XXX - return {}; - } - - void changeProgramName (int index, const String& newName) - { - // XXX - } + const String getProgramName (int) { return {}; } + void changeProgramName (int, const String&) {} //============================================================================== void getStateInformation (MemoryBlock& destData) { auto numParameters = getParameters().size(); - destData.setSize (sizeof (float) * numParameters); + destData.setSize (sizeof (float) * (size_t) numParameters); destData.fillWith (0); - float* const p = (float*) ((char*) destData.getData()); + auto* p = (float*) ((char*) destData.getData()); for (int i = 0; i < numParameters; ++i) if (auto* param = getParameters()[i]) p[i] = param->getValue(); } - void getCurrentProgramStateInformation (MemoryBlock& destData) - { - getStateInformation (destData); - } + void getCurrentProgramStateInformation (MemoryBlock& destData) { getStateInformation (destData); } + void setCurrentProgramStateInformation (const void* data, int sizeInBytes) { setStateInformation (data, sizeInBytes); } void setStateInformation (const void* data, int sizeInBytes) { - const float* p = static_cast (data); + ignoreUnused (sizeInBytes); + + auto* p = static_cast (data); for (int i = 0; i < getParameters().size(); ++i) if (auto* param = getParameters()[i]) param->setValue (p[i]); } - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) - { - setStateInformation (data, sizeInBytes); - } + bool hasEditor() const { return false; } + AudioProcessorEditor* createEditor() { return nullptr; } - bool hasEditor() const - { - return false; - } + bool isValid() const { return handle != nullptr; } - AudioProcessorEditor* createEditor() - { - return nullptr; - } + //============================================================================== + LADSPAModuleHandle::Ptr module; + const LADSPA_Descriptor* plugin = nullptr; - bool isValid() const +private: + //============================================================================== + struct LADSPAParameter final : public Parameter { - return handle != nullptr; - } + struct ParameterValue + { + inline ParameterValue() noexcept {} + inline ParameterValue (float s, float u) noexcept : scaled (s), unscaled (u) {} - LADSPAModuleHandle::Ptr module; - const LADSPA_Descriptor* plugin; + float scaled = 0, unscaled = 0; + }; -private: - LADSPA_Handle handle; + LADSPAParameter (LADSPAPluginInstance& parent, int parameterID, + const String& parameterName, bool parameterIsAutomatable) + : pluginInstance (parent), + paramID (parameterID), + name (parameterName), + automatable (parameterIsAutomatable) + { + reset(); + } + + virtual float getValue() const override + { + if (pluginInstance.plugin != nullptr) + { + const ScopedLock sl (pluginInstance.lock); + + return paramValue.unscaled; + } + + return 0.0f; + } + + String getCurrentValueAsText() const override + { + if (auto* interface = pluginInstance.plugin) + { + const auto& hint = interface->PortRangeHints[paramID]; + + if (LADSPA_IS_HINT_INTEGER (hint.HintDescriptor)) + return String ((int) paramValue.scaled); + + return String (paramValue.scaled, 4); + } + + return {}; + } + + virtual void setValue (float newValue) override + { + if (auto* interface = pluginInstance.plugin) + { + const ScopedLock sl (pluginInstance.lock); + + if (paramValue.unscaled != newValue) + paramValue = ParameterValue (getNewParamScaled (interface->PortRangeHints [paramID], newValue), newValue); + } + } + + float getDefaultValue() const override + { + return defaultValue; + } + + ParameterValue getDefaultParamValue() const + { + if (auto* interface = pluginInstance.plugin) + { + const auto& hint = interface->PortRangeHints[paramID]; + const auto& desc = hint.HintDescriptor; + + if (LADSPA_IS_HINT_HAS_DEFAULT (desc)) + { + if (LADSPA_IS_HINT_DEFAULT_0 (desc)) return {}; + if (LADSPA_IS_HINT_DEFAULT_1 (desc)) return { 1.0f, 1.0f }; + if (LADSPA_IS_HINT_DEFAULT_100 (desc)) return { 100.0f, 0.5f }; + if (LADSPA_IS_HINT_DEFAULT_440 (desc)) return { 440.0f, 0.5f }; + + const auto scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate() + : 1.0f; + const auto lower = hint.LowerBound * scale; + const auto upper = hint.UpperBound * scale; + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_DEFAULT_MINIMUM (desc)) return { lower, 0.0f }; + if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc) && LADSPA_IS_HINT_DEFAULT_MAXIMUM (desc)) return { upper, 1.0f }; + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) + { + auto useLog = LADSPA_IS_HINT_LOGARITHMIC (desc); + + if (LADSPA_IS_HINT_DEFAULT_LOW (desc)) return { scaledValue (lower, upper, 0.25f, useLog), 0.25f }; + if (LADSPA_IS_HINT_DEFAULT_MIDDLE (desc)) return { scaledValue (lower, upper, 0.50f, useLog), 0.50f }; + if (LADSPA_IS_HINT_DEFAULT_HIGH (desc)) return { scaledValue (lower, upper, 0.75f, useLog), 0.75f }; + } + } + } + + return {}; + } + + void reset() + { + paramValue = getDefaultParamValue(); + defaultValue = paramValue.unscaled; + } + + String getName (int /*maximumStringLength*/) const override { return name; } + String getLabel() const override { return {}; } + + bool isAutomatable() const override { return automatable; } + + static float scaledValue (float low, float high, float alpha, bool useLog) noexcept + { + if (useLog && low > 0 && high > 0) + return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha); + + return low + (high - low) * alpha; + } + + static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value) + { + return LADSPA_IS_HINT_INTEGER (desc) ? ((float) (int) value) : value; + } + + float getNewParamScaled (const LADSPA_PortRangeHint& hint, float newValue) const + { + const auto& desc = hint.HintDescriptor; + + if (LADSPA_IS_HINT_TOGGLED (desc)) + return (newValue < 0.5f) ? 0.0f : 1.0f; + + const auto scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) pluginInstance.getSampleRate() + : 1.0f; + const auto lower = hint.LowerBound * scale; + const auto upper = hint.UpperBound * scale; + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) + return toIntIfNecessary (desc, scaledValue (lower, upper, newValue, LADSPA_IS_HINT_LOGARITHMIC (desc))); + + if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) return toIntIfNecessary (desc, newValue); + if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) return toIntIfNecessary (desc, newValue * upper); + + return 0.0f; + } + + LADSPAPluginInstance& pluginInstance; + const int paramID; + const String name; + const bool automatable; + + ParameterValue paramValue; + float defaultValue = 0.0f; + }; + + //============================================================================== + LADSPA_Handle handle = nullptr; String name; CriticalSection lock; - bool initialised; - AudioBuffer tempBuffer; + bool initialised = false; + AudioBuffer tempBuffer { 1, 1 }; Array inputs, outputs; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginInstance) }; -//============================================================================== //============================================================================== LADSPAPluginFormat::LADSPAPluginFormat() {} LADSPAPluginFormat::~LADSPAPluginFormat() {} -void LADSPAPluginFormat::findAllTypesForFile (OwnedArray& results, - const String& fileOrIdentifier) +void LADSPAPluginFormat::findAllTypesForFile (OwnedArray& results, const String& fileOrIdentifier) { if (! fileMightContainThisPluginType (fileOrIdentifier)) return; @@ -619,14 +586,13 @@ void LADSPAPluginFormat::findAllTypesForFile (OwnedArray& res return; instance->initialise (44100.0, 512); - instance->fillInPluginDescription (desc); if (instance->module->moduleMain != nullptr) { for (int uid = 0;; ++uid) { - if (const LADSPA_Descriptor* plugin = instance->module->moduleMain (uid)) + if (auto* plugin = instance->module->moduleMain ((size_t) uid)) { desc.uid = uid; desc.name = plugin->Name != nullptr ? plugin->Name : "Unknown"; @@ -642,18 +608,16 @@ void LADSPAPluginFormat::findAllTypesForFile (OwnedArray& res } } -void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc, - double sampleRate, int blockSize, - void* userData, - void (*callback) (void*, AudioPluginInstance*, const String&)) +void LADSPAPluginFormat::createPluginInstance (const PluginDescription& desc, double sampleRate, int blockSize, + void* userData, void (*callback) (void*, AudioPluginInstance*, const String&)) { std::unique_ptr result; if (fileMightContainThisPluginType (desc.fileOrIdentifier)) { - File file (desc.fileOrIdentifier); + auto file = File (desc.fileOrIdentifier); - const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); + auto previousWorkingDirectory = File::getCurrentWorkingDirectory(); file.getParentDirectory().setAsCurrentWorkingDirectory(); const LADSPAModuleHandle::Ptr module (LADSPAModuleHandle::findOrCreateModule (file)); @@ -688,7 +652,7 @@ bool LADSPAPluginFormat::requiresUnblockedMessageThreadDuringCreation (const Plu bool LADSPAPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) { - const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); + auto f = File::createFileWithoutCheckingPath (fileOrIdentifier); return f.existsAsFile() && f.hasFileExtension (".so"); } @@ -723,7 +687,7 @@ void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& while (iter.next()) { - const File f (iter.getFile()); + auto f = iter.getFile(); bool isPlugin = false; if (fileMightContainThisPluginType (f.getFullPathName())) @@ -739,9 +703,7 @@ void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& FileSearchPath LADSPAPluginFormat::getDefaultLocationsToSearch() { - return FileSearchPath (SystemStats::getEnvironmentVariable ("LADSPA_PATH", - "/usr/lib/ladspa;/usr/local/lib/ladspa;~/.ladspa") - .replace (":", ";")); + return { SystemStats::getEnvironmentVariable ("LADSPA_PATH", "/usr/lib/ladspa;/usr/local/lib/ladspa;~/.ladspa").replace (":", ";") }; } } // namespace juce diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h index a5fcee5223..65d2dd7947 100644 --- a/modules/juce_audio_processors/juce_audio_processors.h +++ b/modules/juce_audio_processors/juce_audio_processors.h @@ -37,7 +37,7 @@ vendor: juce version: 5.3.1 name: JUCE audio processor classes - description: Classes for loading and playing VST, AU, or internally-generated audio processors. + description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. website: http://www.juce.com/juce license: GPL/Commercial @@ -60,7 +60,7 @@ /** Config: JUCE_PLUGINHOST_VST Enables the VST audio plugin hosting classes. - @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3 + @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3, JUCE_PLUGINHOST_LADSPA */ #ifndef JUCE_PLUGINHOST_VST #define JUCE_PLUGINHOST_VST 0 @@ -70,7 +70,7 @@ Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be installed on your machine. - @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU + @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_LADSPA */ #ifndef JUCE_PLUGINHOST_VST3 #define JUCE_PLUGINHOST_VST3 0 @@ -79,14 +79,23 @@ /** Config: JUCE_PLUGINHOST_AU Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. - @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3 + @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3, JUCE_PLUGINHOST_LADSPA */ #ifndef JUCE_PLUGINHOST_AU #define JUCE_PLUGINHOST_AU 0 #endif -#if ! (JUCE_PLUGINHOST_AU || JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) -// #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 flags if you're using this module!" +/** Config: JUCE_PLUGINHOST_LADSPA + Enables the LADSPA plugin hosting classes. This is Linux-only, of course. + + @see LADSPAPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3, JUCE_PLUGINHOST_AU + */ +#ifndef JUCE_PLUGINHOST_LADSPA + #define JUCE_PLUGINHOST_LADSPA 0 +#endif + +#if ! (JUCE_PLUGINHOST_AU || JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3 || JUCE_PLUGINHOST_LADSPA) +// #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 and/or JUCE_PLUGINHOST_LADSPA flags if you're using this module!" #endif #if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT || JUCE_IOS)