diff --git a/CHANGELOG.md b/CHANGELOG.md index c44f5801..0270a6d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,11 @@ All notable changes to this project will be documented in this file. ## [UNRELEASED] +- Added "Muff Clipper" module. - Added "Smoothing" parameter for "Muff Drive" module. - Added new factory presets. +- Added option to skip parameter tree refreshes for AUv3 hosts. - Fixed parameter name changes not showing up in some CLAP hosts. -- Fixed crashes when loading AUv3 plugin state in GarageBand. ## [1.1.0] 2022-11-21 - Added support for the CLAP plugin format (with parameter modulation). diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b697ce5..ec1e4bde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.15) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "Minimum OS X deployment target") -project(BYOD VERSION 1.1.1) +project(BYOD VERSION 1.1.2) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_STANDARD 17) diff --git a/modules/JUCE b/modules/JUCE index dbf67e29..ff3cb774 160000 --- a/modules/JUCE +++ b/modules/JUCE @@ -1 +1 @@ -Subproject commit dbf67e298e2f0937cc855f74e7a9c1edbe436840 +Subproject commit ff3cb774291a440c88a0efc55a08912e3116fb21 diff --git a/src/gui/toolbar/SettingsButton.cpp b/src/gui/toolbar/SettingsButton.cpp index 96d7f0e0..1894b8af 100644 --- a/src/gui/toolbar/SettingsButton.cpp +++ b/src/gui/toolbar/SettingsButton.cpp @@ -2,6 +2,7 @@ #include "BYOD.h" #include "gui/pedalboard/BoardViewport.h" #include "processors/chain/ProcessorChainPortMagnitudesHelper.h" +#include "state/ParamForwardManager.h" namespace { @@ -28,7 +29,7 @@ SettingsButton::SettingsButton (BYOD& processor, chowdsp::OpenGLHelper* oglHelpe globalSettingChanged (openglID); setImages (Drawable::createFromImageData (BinaryData::cogsolid_svg, BinaryData::cogsolid_svgSize).get()); - onClick = [=] + onClick = [this] { showSettingsMenu(); }; } @@ -52,9 +53,15 @@ void SettingsButton::showSettingsMenu() { PopupMenu menu; - cableVizMenu (menu, 100); - defaultZoomMenu (menu, 200); - openGLManu (menu, 300); + addPluginSettingMenuOption ("Cable Visualizations", ProcessorChainPortMagnitudesHelper::cableVizOnOffID, menu, 100); + + if (openGLHelper != nullptr && openGLHelper->isOpenGLAvailable()) + addPluginSettingMenuOption ("Use OpenGL", openglID, menu, 200); + + if (pluginSettings->hasProperty (ParamForwardManager::refreshParamTreeID)) + addPluginSettingMenuOption ("Refresh Parameter Tree", ParamForwardManager::refreshParamTreeID, menu, 300); + + defaultZoomMenu (menu, 400); menu.addSeparator(); menu.addItem ("View Source Code", [] @@ -77,20 +84,6 @@ void SettingsButton::showSettingsMenu() menu.showMenuAsync (options); } -void SettingsButton::cableVizMenu (PopupMenu& menu, int itemID) -{ - const auto isCurrentlyOn = pluginSettings->getProperty (ProcessorChainPortMagnitudesHelper::cableVizOnOffID); - - PopupMenu::Item item; - item.itemID = ++itemID; - item.text = "Cable Visualizations"; - item.action = [=] - { pluginSettings->setProperty (ProcessorChainPortMagnitudesHelper::cableVizOnOffID, ! isCurrentlyOn); }; - item.colour = isCurrentlyOn ? onColour : offColour; - - menu.addItem (item); -} - void SettingsButton::defaultZoomMenu (PopupMenu& menu, int itemID) { PopupMenu defaultZoomMenu; @@ -103,7 +96,7 @@ void SettingsButton::defaultZoomMenu (PopupMenu& menu, int itemID) PopupMenu::Item item; item.itemID = ++itemID; item.text = String (int (zoomLevel * 100.0)) + "%"; - item.action = [=] + item.action = [this, zoomLevel] { pluginSettings->setProperty (BoardViewport::defaultZoomSettingID, zoomLevel); }; item.colour = isWithin (zoomLevel, curDefaultZoomLevel, 0.001) ? onColour : offColour; @@ -113,25 +106,22 @@ void SettingsButton::defaultZoomMenu (PopupMenu& menu, int itemID) menu.addSubMenu ("Default Zoom", defaultZoomMenu); } -void SettingsButton::openGLManu (PopupMenu& menu, int itemID) +void SettingsButton::copyDiagnosticInfo() { - if (openGLHelper == nullptr || ! openGLHelper->isOpenGLAvailable()) - return; + Logger::writeToLog ("Copying diagnostic info..."); + SystemClipboard::copyTextToClipboard (chowdsp::PluginDiagnosticInfo::getDiagnosticsString (proc)); +} - const auto isCurrentlyOn = pluginSettings->getProperty (openglID); +void SettingsButton::addPluginSettingMenuOption (const String& name, const SettingID& id, PopupMenu& menu, int itemID) +{ + const auto isCurrentlyOn = pluginSettings->getProperty (id); PopupMenu::Item item; - item.itemID = ++itemID; - item.text = "Use OpenGL"; - item.action = [=] - { pluginSettings->setProperty (openglID, ! isCurrentlyOn); }; + item.itemID = itemID; + item.text = name; + item.action = [this, id, isCurrentlyOn] + { pluginSettings->setProperty (id, ! isCurrentlyOn); }; item.colour = isCurrentlyOn ? onColour : offColour; menu.addItem (item); } - -void SettingsButton::copyDiagnosticInfo() -{ - Logger::writeToLog ("Copying diagnostic info..."); - SystemClipboard::copyTextToClipboard (chowdsp::PluginDiagnosticInfo::getDiagnosticsString (proc)); -} diff --git a/src/gui/toolbar/SettingsButton.h b/src/gui/toolbar/SettingsButton.h index 333df8ec..31b46b84 100644 --- a/src/gui/toolbar/SettingsButton.h +++ b/src/gui/toolbar/SettingsButton.h @@ -18,10 +18,9 @@ class SettingsButton : public DrawableButton, private: void showSettingsMenu(); - void cableVizMenu (PopupMenu& menu, int itemID); void defaultZoomMenu (PopupMenu& menu, int itemID); - void openGLManu (PopupMenu& menu, int itemID); void copyDiagnosticInfo(); + void addPluginSettingMenuOption (const String& name, const SettingID& id, PopupMenu& menu, int itemID); const BYOD& proc; chowdsp::OpenGLHelper* openGLHelper; diff --git a/src/processors/other/ShimmerReverb.cpp b/src/processors/other/ShimmerReverb.cpp index 73043fb0..41eda1cc 100644 --- a/src/processors/other/ShimmerReverb.cpp +++ b/src/processors/other/ShimmerReverb.cpp @@ -96,7 +96,7 @@ void ShimmerReverb::prepare (double sampleRate, int samplesPerBlock) }; sizeParam.setRampLength (0.2); sizeParam.prepare (sampleRate, samplesPerBlock); - + feedbackParam.mappingFunction = [] (float x) { const auto delayMs = 1000.0f * std::pow (10000.0f / 1000.0f, x); diff --git a/src/state/ParamForwardManager.cpp b/src/state/ParamForwardManager.cpp index 977763a3..69aea89f 100644 --- a/src/state/ParamForwardManager.cpp +++ b/src/state/ParamForwardManager.cpp @@ -3,6 +3,15 @@ ParamForwardManager::ParamForwardManager (AudioProcessorValueTreeState& vts, ProcessorChain& procChain) : chowdsp::ForwardingParametersManager (vts), chain (procChain) { + // In some AUv3 hosts (cough, cough, GarageBand), sending parameter info change notifications + // causes the host to crash. Since there's no way for the plugin to determine which AUv3 + // host it's running in, we give the user an option to disable these notifications. + // @TODO: get rid of this option once GarageBand fixes the crash on their end. + if (vts.processor.wrapperType == AudioProcessor::WrapperType::wrapperType_AudioUnitv3) + pluginSettings->addProperties<&ParamForwardManager::deferHostNotificationsGlobalSettingChanged> ( + { { refreshParamTreeID, true } }, *this); + deferHostNotificationsGlobalSettingChanged (refreshParamTreeID); + callbacks += { chain.processorAddedBroadcaster.connect<&ParamForwardManager::processorAdded> (this), chain.processorRemovedBroadcaster.connect<&ParamForwardManager::processorRemoved> (this), @@ -82,3 +91,14 @@ void ParamForwardManager::processorRemoved (const BaseProcessor* proc) } } } + +void ParamForwardManager::deferHostNotificationsGlobalSettingChanged (SettingID settingID) +{ + if (settingID != refreshParamTreeID) + return; + + if (pluginSettings->getProperty (refreshParamTreeID)) + deferHostNotifs.reset(); + else + deferHostNotifs.emplace (*this); +} diff --git a/src/state/ParamForwardManager.h b/src/state/ParamForwardManager.h index e666e77c..8616455c 100644 --- a/src/state/ParamForwardManager.h +++ b/src/state/ParamForwardManager.h @@ -2,8 +2,11 @@ #include "processors/chain/ProcessorChain.h" -class ParamForwardManager : public chowdsp::ForwardingParametersManager +class ParamForwardManager : public chowdsp::ForwardingParametersManager, + public chowdsp::TrackedByBroadcasters { + using SettingID = chowdsp::GlobalPluginSettings::SettingID; + public: ParamForwardManager (AudioProcessorValueTreeState& vts, ProcessorChain& chain); ~ParamForwardManager(); @@ -15,10 +18,17 @@ class ParamForwardManager : public chowdsp::ForwardingParametersManager deferHostNotifs {}; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamForwardManager) };