diff --git a/src/CardinalCommon.cpp b/src/CardinalCommon.cpp index e3d7948..6bc043f 100644 --- a/src/CardinalCommon.cpp +++ b/src/CardinalCommon.cpp @@ -54,6 +54,12 @@ # include #endif +namespace rack { +namespace settings { +int rateLimit = 0; +} +} + namespace patchUtils { diff --git a/src/CardinalCommon.hpp b/src/CardinalCommon.hpp index 99cee48..18859a6 100644 --- a/src/CardinalCommon.hpp +++ b/src/CardinalCommon.hpp @@ -27,9 +27,15 @@ namespace rack { + +namespace settings { +extern int rateLimit; +} + namespace ui { struct Menu; } + } namespace patchUtils diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 2eb83bb..b377fbb 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -376,6 +376,7 @@ public: fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f; fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f; fWindowParameters[kWindowParameterLockModulePositions] = 0.0f; + fWindowParameters[kWindowParameterUpdateRateLimit] = 0.0f; #endif // create unique temporary path for this instance @@ -751,6 +752,23 @@ protected: parameter.ranges.min = 0.0f; parameter.ranges.max = 1.0f; break; + case kWindowParameterUpdateRateLimit: + parameter.name = "Update rate limit"; + parameter.symbol = "rateLimit"; + parameter.hints = kParameterIsAutomatable|kParameterIsInteger; + parameter.ranges.def = 0.0f; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 2.0f; + parameter.enumValues.count = 3; + parameter.enumValues.restrictedMode = true; + parameter.enumValues.values = new ParameterEnumerationValue[3]; + parameter.enumValues.values[0].label = "None"; + parameter.enumValues.values[0].value = 0.0f; + parameter.enumValues.values[1].label = "2x"; + parameter.enumValues.values[1].value = 1.0f; + parameter.enumValues.values[2].label = "4x"; + parameter.enumValues.values[2].value = 2.0f; + break; } #endif } diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index 74d5266..b1a29f8 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -233,6 +233,7 @@ class CardinalUI : public CardinalBaseUI, rack::math::Vec fLastMousePos; ResizeHandle fResizeHandle; WindowParameters fWindowParameters; + int fRateLimitStep = 0; struct ScopedContext { CardinalPluginContext* const context; @@ -361,6 +362,10 @@ public: filebrowserhandle = nullptr; } + if (fWindowParameters.rateLimit != 0 && ++fRateLimitStep % (fWindowParameters.rateLimit * 2)) + return; + + fRateLimitStep = 0; repaint(); } @@ -416,6 +421,10 @@ public: case kWindowParameterLockModulePositions: fWindowParameters.lockModules = value > 0.5f; break; + case kWindowParameterUpdateRateLimit: + fWindowParameters.rateLimit = static_cast(value + 0.5f); + fRateLimitStep = 0; + break; default: return; } @@ -476,6 +485,10 @@ protected: case kWindowParameterLockModulePositions: fWindowParameters.lockModules = value > 0.5f; break; + case kWindowParameterUpdateRateLimit: + fWindowParameters.rateLimit = static_cast(value + 0.5f); + fRateLimitStep = 0; + break; default: return; } diff --git a/src/WindowParameters.hpp b/src/WindowParameters.hpp index 186bd6c..b41f16a 100644 --- a/src/WindowParameters.hpp +++ b/src/WindowParameters.hpp @@ -43,6 +43,7 @@ enum WindowParameterList { kWindowParameterWheelKnobControl, kWindowParameterWheelSensitivity, kWindowParameterLockModulePositions, + kWindowParameterUpdateRateLimit, kWindowParameterCount, }; @@ -56,6 +57,8 @@ struct WindowParameters { bool tooltips = true; bool knobScroll = false; bool lockModules = false; + // cardinal specific + int rateLimit = 0; }; struct WindowParametersCallback { diff --git a/src/override/MenuBar.cpp b/src/override/MenuBar.cpp index 9d75f1c..8598668 100644 --- a/src/override/MenuBar.cpp +++ b/src/override/MenuBar.cpp @@ -507,6 +507,21 @@ struct ViewButton : MenuButton { menu->addChild(knobScrollSensitivitySlider); menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules)); + + static const std::vector rateLimitLabels = { + "None", + "2x", + "4x", + }; + static const std::vector rateLimits = {0, 1, 2}; + menu->addChild(createSubmenuItem("Update rate limit", rateLimitLabels[settings::rateLimit], [=](ui::Menu* menu) { + for (int rateLimit : rateLimits) { + menu->addChild(createCheckMenuItem(rateLimitLabels[rateLimit], "", + [=]() {return settings::rateLimit == rateLimit;}, + [=]() {settings::rateLimit = rateLimit;} + )); + } + })); } }; diff --git a/src/override/Window.cpp b/src/override/Window.cpp index 6baa749..75e82ab 100644 --- a/src/override/Window.cpp +++ b/src/override/Window.cpp @@ -45,6 +45,7 @@ #include "DistrhoUI.hpp" #include "Application.hpp" +#include "../CardinalCommon.hpp" #include "../WindowParameters.hpp" #ifndef DGL_NO_SHARED_RESOURCES @@ -138,6 +139,7 @@ struct Window::Internal { double monitorRefreshRate = 60.0; // FIXME double frameTime = 0.0; double lastFrameDuration = 0.0; + int currentRateLimit = 0; std::map> fontCache; std::map> imageCache; @@ -593,6 +595,13 @@ void WindowParametersSave(rack::window::Window* const window) window->internal->callback->WindowParametersChanged(kWindowParameterLockModulePositions, rack::settings::lockModules); } + if (window->internal->params.rateLimit != rack::settings::rateLimit) + { + window->internal->params.rateLimit = rack::settings::rateLimit; + if (window->internal->callback != nullptr) + window->internal->callback->WindowParametersChanged(kWindowParameterUpdateRateLimit, + rack::settings::rateLimit); + } } void WindowParametersRestore(rack::window::Window* const window) @@ -606,6 +615,7 @@ void WindowParametersRestore(rack::window::Window* const window) rack::settings::tooltips = window->internal->params.tooltips; rack::settings::knobScroll = window->internal->params.knobScroll; rack::settings::lockModules = window->internal->params.lockModules; + rack::settings::rateLimit = window->internal->params.rateLimit; } void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback)