From 456c161343c8bd0969c89e7c271fe029708f12e6 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Mon, 26 Mar 2018 09:54:40 +0100 Subject: [PATCH 1/4] Fixed a parameter change recursion issue in the VST and AU wrappers --- .../juce_audio_plugin_client/AU/juce_AU_Wrapper.mm | 12 ++++++++++++ .../VST/juce_VST_Wrapper.cpp | 14 ++++++++++++++ 2 files changed, 26 insertions(+) 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 1d0e9d0f4a..417b1910b9 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -131,6 +131,8 @@ public: isBypassed (false), mapper (*juceFilter) { + inParameterChangedCallback = false; + #ifdef JucePlugin_PreferredChannelConfigurations short configs[][2] = {JucePlugin_PreferredChannelConfigurations}; const int numConfigs = sizeof (configs) / sizeof (short[2]); @@ -963,6 +965,8 @@ public: if (auto* param = juceFilter->getParameters()[index]) { param->setValue (value); + + inParameterChangedCallback = true; param->sendValueChangedMessageToListeners (value); } else @@ -1085,6 +1089,12 @@ public: void audioProcessorParameterChanged (AudioProcessor*, int index, float /*newValue*/) override { + if (inParameterChangedCallback.get()) + { + inParameterChangedCallback = false; + return; + } + sendAUEvent (kAudioUnitEvent_ParameterValueChange, index); } @@ -1665,6 +1675,8 @@ private: int totalInChannels, totalOutChannels; HeapBlock pulledSucceeded; + ThreadLocalValue inParameterChangedCallback; + //============================================================================== Array channelInfo; Array> supportedInputLayouts, supportedOutputLayouts; 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 8831d6263f..df83c1e5d3 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -260,6 +260,8 @@ public: : hostCallback (cb), processor (af) { + inParameterChangedCallback = false; + // VST-2 does not support disabling buses: so always enable all of them processor->enableAllBuses(); @@ -723,6 +725,8 @@ public: if (auto* param = processor->getParameters()[index]) { param->setValue (value); + + inParameterChangedCallback = true; param->sendValueChangedMessageToListeners (value); } else @@ -740,6 +744,12 @@ public: void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { + if (inParameterChangedCallback.get()) + { + inParameterChangedCallback = false; + return; + } + if (hostCallback != nullptr) hostCallback (&vstEffect, hostOpcodeParameterChanged, index, 0, 0, newValue); } @@ -1477,6 +1487,8 @@ private: HeapBlock cachedInArrangement, cachedOutArrangement; + ThreadLocalValue inParameterChangedCallback; + static JuceVSTWrapper* getWrapper (VstEffectInterface* v) noexcept { return static_cast (v->effectPointer); } bool isProcessLevelOffline() @@ -1828,6 +1840,8 @@ private: { auto value = param->getValueForText (String::fromUTF8 ((char*) args.ptr)); param->setValue (value); + + inParameterChangedCallback = true; param->sendValueChangedMessageToListeners (value); return 1; From 791c7c5ea40245e8f8215fdc04278f1cddd3e1f3 Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 5 Apr 2018 12:21:48 +0100 Subject: [PATCH 2/4] Projucer: Fixed a bug where the OSX base SDK version was not being set due to an extra "SDK" being added to the end of the version string --- .../Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 0b29b1a299..d62b3b92ad 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -1656,7 +1656,7 @@ public: String getOSXDeploymentTarget (const XcodeBuildConfiguration& config, String* sdkRoot = nullptr) const { - auto sdk = config.getOSXSDKVersionString() + " SDK"; + auto sdk = config.getOSXSDKVersionString(); auto sdkCompat = config.getOSXDeploymentTargetString(); // The AUv3 target always needs to be at least 10.11 From 49c4f0c0f30ef4992d9dc6d5ee6e283a6ed205ec Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 5 Apr 2018 13:00:42 +0100 Subject: [PATCH 3/4] Projucer: Don't set the OSX SDK version if using default --- .../Source/ProjectSaving/jucer_ProjectExport_Xcode.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index d62b3b92ad..d37049a33a 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -516,8 +516,14 @@ protected: String getCustomXcodeFlagsString() const { return customXcodeFlags.get(); } - String getOSXSDKVersionString() const { return osxSDKVersion.get(); } String getOSXDeploymentTargetString() const { return osxDeploymentTarget.get(); } + String getOSXSDKVersionString() const + { + if (osxSDKVersion.isUsingDefault()) + return {}; + + return osxSDKVersion.get(); + } String getCodeSignIdentityString() const { return codeSignIdentity.get(); } bool isUsingDefaultCodeSignIdentity() const { return codeSignIdentity.isUsingDefault(); } @@ -1668,8 +1674,8 @@ public: for (int ver = oldestAllowedDeploymentTarget; ver <= currentSDKVersion; ++ver) { - if (sdk == getSDKName (ver) && sdkRoot != nullptr) *sdkRoot = String ("macosx10." + String (ver)); - if (sdkCompat == getSDKName (ver)) deploymentTarget = "10." + String (ver); + if (sdk.isNotEmpty() && (sdk == getSDKName (ver) && sdkRoot != nullptr)) *sdkRoot = String ("macosx10." + String (ver)); + if (sdkCompat == getSDKName (ver)) deploymentTarget = "10." + String (ver); } return deploymentTarget; From dfc2eb9760c9fb760041b98d2ef1990959ee4bef Mon Sep 17 00:00:00 2001 From: ed Date: Thu, 5 Apr 2018 14:38:16 +0100 Subject: [PATCH 4/4] Projucer: Clarified the OSX base SDK version that will be used if the "Default" option is selected --- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index d37049a33a..d9bc14782a 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -412,7 +412,7 @@ protected: XcodeBuildConfiguration (Project& p, const ValueTree& t, const bool isIOS, const ProjectExporter& e) : BuildConfiguration (p, t, e), iOS (isIOS), - osxSDKVersion (config, Ids::osxSDK, getUndoManager(), String (osxVersionDefault) + " SDK"), + osxSDKVersion (config, Ids::osxSDK, getUndoManager()), osxDeploymentTarget (config, Ids::osxCompatibility, getUndoManager(), String (osxVersionDefault) + " SDK"), iosDeploymentTarget (config, Ids::iosCompatibility, getUndoManager(), iosVersionDefault), osxArchitecture (config, Ids::osxArchitecture, getUndoManager(), osxArch_Default), @@ -465,7 +465,8 @@ protected: } props.add (new ChoicePropertyComponent (osxSDKVersion, "OSX Base SDK Version", sdkVersionNames, versionValues), - "The version of OSX to link against in the Xcode build."); + "The version of OSX to link against in the Xcode build. If \"Default\" is selected then the field will be left " + "empty and the Xcode default will be used."); props.add (new ChoicePropertyComponent (osxDeploymentTarget, "OSX Deployment Target", osxVersionNames, versionValues), "The minimum version of OSX that the target binary will be compatible with."); @@ -516,14 +517,8 @@ protected: String getCustomXcodeFlagsString() const { return customXcodeFlags.get(); } + String getOSXSDKVersionString() const { return osxSDKVersion.get(); } String getOSXDeploymentTargetString() const { return osxDeploymentTarget.get(); } - String getOSXSDKVersionString() const - { - if (osxSDKVersion.isUsingDefault()) - return {}; - - return osxSDKVersion.get(); - } String getCodeSignIdentityString() const { return codeSignIdentity.get(); } bool isUsingDefaultCodeSignIdentity() const { return codeSignIdentity.isUsingDefault(); }