Implement update rate limit
Closes #117 Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
d9fc8dafde
commit
c06768f70f
|
@ -54,6 +54,12 @@
|
|||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
namespace rack {
|
||||
namespace settings {
|
||||
int rateLimit = 0;
|
||||
}
|
||||
}
|
||||
|
||||
namespace patchUtils
|
||||
{
|
||||
|
||||
|
|
|
@ -27,9 +27,15 @@
|
|||
|
||||
namespace rack
|
||||
{
|
||||
|
||||
namespace settings {
|
||||
extern int rateLimit;
|
||||
}
|
||||
|
||||
namespace ui {
|
||||
struct Menu;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace patchUtils
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;}
|
||||
));
|
||||
}
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue