Implement update rate limit
Closes #117 Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
d9fc8dafde
commit
c06768f70f
7 changed files with 71 additions and 0 deletions
|
|
@ -54,6 +54,12 @@
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace rack {
|
||||||
|
namespace settings {
|
||||||
|
int rateLimit = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace patchUtils
|
namespace patchUtils
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,15 @@
|
||||||
|
|
||||||
namespace rack
|
namespace rack
|
||||||
{
|
{
|
||||||
|
|
||||||
|
namespace settings {
|
||||||
|
extern int rateLimit;
|
||||||
|
}
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
struct Menu;
|
struct Menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace patchUtils
|
namespace patchUtils
|
||||||
|
|
|
||||||
|
|
@ -376,6 +376,7 @@ public:
|
||||||
fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f;
|
fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f;
|
||||||
fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f;
|
fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f;
|
||||||
fWindowParameters[kWindowParameterLockModulePositions] = 0.0f;
|
fWindowParameters[kWindowParameterLockModulePositions] = 0.0f;
|
||||||
|
fWindowParameters[kWindowParameterUpdateRateLimit] = 0.0f;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// create unique temporary path for this instance
|
// create unique temporary path for this instance
|
||||||
|
|
@ -751,6 +752,23 @@ protected:
|
||||||
parameter.ranges.min = 0.0f;
|
parameter.ranges.min = 0.0f;
|
||||||
parameter.ranges.max = 1.0f;
|
parameter.ranges.max = 1.0f;
|
||||||
break;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -233,6 +233,7 @@ class CardinalUI : public CardinalBaseUI,
|
||||||
rack::math::Vec fLastMousePos;
|
rack::math::Vec fLastMousePos;
|
||||||
ResizeHandle fResizeHandle;
|
ResizeHandle fResizeHandle;
|
||||||
WindowParameters fWindowParameters;
|
WindowParameters fWindowParameters;
|
||||||
|
int fRateLimitStep = 0;
|
||||||
|
|
||||||
struct ScopedContext {
|
struct ScopedContext {
|
||||||
CardinalPluginContext* const context;
|
CardinalPluginContext* const context;
|
||||||
|
|
@ -361,6 +362,10 @@ public:
|
||||||
filebrowserhandle = nullptr;
|
filebrowserhandle = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fWindowParameters.rateLimit != 0 && ++fRateLimitStep % (fWindowParameters.rateLimit * 2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
fRateLimitStep = 0;
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -416,6 +421,10 @@ public:
|
||||||
case kWindowParameterLockModulePositions:
|
case kWindowParameterLockModulePositions:
|
||||||
fWindowParameters.lockModules = value > 0.5f;
|
fWindowParameters.lockModules = value > 0.5f;
|
||||||
break;
|
break;
|
||||||
|
case kWindowParameterUpdateRateLimit:
|
||||||
|
fWindowParameters.rateLimit = static_cast<int>(value + 0.5f);
|
||||||
|
fRateLimitStep = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -476,6 +485,10 @@ protected:
|
||||||
case kWindowParameterLockModulePositions:
|
case kWindowParameterLockModulePositions:
|
||||||
fWindowParameters.lockModules = value > 0.5f;
|
fWindowParameters.lockModules = value > 0.5f;
|
||||||
break;
|
break;
|
||||||
|
case kWindowParameterUpdateRateLimit:
|
||||||
|
fWindowParameters.rateLimit = static_cast<int>(value + 0.5f);
|
||||||
|
fRateLimitStep = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ enum WindowParameterList {
|
||||||
kWindowParameterWheelKnobControl,
|
kWindowParameterWheelKnobControl,
|
||||||
kWindowParameterWheelSensitivity,
|
kWindowParameterWheelSensitivity,
|
||||||
kWindowParameterLockModulePositions,
|
kWindowParameterLockModulePositions,
|
||||||
|
kWindowParameterUpdateRateLimit,
|
||||||
kWindowParameterCount,
|
kWindowParameterCount,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -56,6 +57,8 @@ struct WindowParameters {
|
||||||
bool tooltips = true;
|
bool tooltips = true;
|
||||||
bool knobScroll = false;
|
bool knobScroll = false;
|
||||||
bool lockModules = false;
|
bool lockModules = false;
|
||||||
|
// cardinal specific
|
||||||
|
int rateLimit = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WindowParametersCallback {
|
struct WindowParametersCallback {
|
||||||
|
|
|
||||||
|
|
@ -507,6 +507,21 @@ struct ViewButton : MenuButton {
|
||||||
menu->addChild(knobScrollSensitivitySlider);
|
menu->addChild(knobScrollSensitivitySlider);
|
||||||
|
|
||||||
menu->addChild(createBoolPtrMenuItem("Lock module positions", "", &settings::lockModules));
|
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 "DistrhoUI.hpp"
|
||||||
#include "Application.hpp"
|
#include "Application.hpp"
|
||||||
|
#include "../CardinalCommon.hpp"
|
||||||
#include "../WindowParameters.hpp"
|
#include "../WindowParameters.hpp"
|
||||||
|
|
||||||
#ifndef DGL_NO_SHARED_RESOURCES
|
#ifndef DGL_NO_SHARED_RESOURCES
|
||||||
|
|
@ -138,6 +139,7 @@ struct Window::Internal {
|
||||||
double monitorRefreshRate = 60.0; // FIXME
|
double monitorRefreshRate = 60.0; // FIXME
|
||||||
double frameTime = 0.0;
|
double frameTime = 0.0;
|
||||||
double lastFrameDuration = 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<FontWithOriginalContext>> fontCache;
|
||||||
std::map<std::string, std::shared_ptr<ImageWithOriginalContext>> imageCache;
|
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,
|
window->internal->callback->WindowParametersChanged(kWindowParameterLockModulePositions,
|
||||||
rack::settings::lockModules);
|
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)
|
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::tooltips = window->internal->params.tooltips;
|
||||||
rack::settings::knobScroll = window->internal->params.knobScroll;
|
rack::settings::knobScroll = window->internal->params.knobScroll;
|
||||||
rack::settings::lockModules = window->internal->params.lockModules;
|
rack::settings::lockModules = window->internal->params.lockModules;
|
||||||
|
rack::settings::rateLimit = window->internal->params.rateLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback)
|
void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue