1
Fork 0

Implement update rate limit

Closes #117

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-01-18 09:50:50 +00:00
parent d9fc8dafde
commit c06768f70f
No known key found for this signature in database
GPG Key ID: CDBAA37ABC74FBA0
7 changed files with 71 additions and 0 deletions

View File

@ -54,6 +54,12 @@
# include <unistd.h>
#endif
namespace rack {
namespace settings {
int rateLimit = 0;
}
}
namespace patchUtils
{

View File

@ -27,9 +27,15 @@
namespace rack
{
namespace settings {
extern int rateLimit;
}
namespace ui {
struct Menu;
}
}
namespace patchUtils

View File

@ -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
}

View File

@ -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<int>(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<int>(value + 0.5f);
fRateLimitStep = 0;
break;
default:
return;
}

View File

@ -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 {

View File

@ -507,6 +507,21 @@ struct ViewButton : MenuButton {
menu->addChild(knobScrollSensitivitySlider);
menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules));
static const std::vector<std::string> rateLimitLabels = {
"None",
"2x",
"4x",
};
static const std::vector<int> 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;}
));
}
}));
}
};

View File

@ -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<std::string, std::shared_ptr<FontWithOriginalContext>> fontCache;
std::map<std::string, std::shared_ptr<ImageWithOriginalContext>> 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)