Browse Source

Implement update rate limit

Closes #117

Signed-off-by: falkTX <falktx@falktx.com>
tags/22.02
falkTX 3 years ago
parent
commit
c06768f70f
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
7 changed files with 71 additions and 0 deletions
  1. +6
    -0
      src/CardinalCommon.cpp
  2. +6
    -0
      src/CardinalCommon.hpp
  3. +18
    -0
      src/CardinalPlugin.cpp
  4. +13
    -0
      src/CardinalUI.cpp
  5. +3
    -0
      src/WindowParameters.hpp
  6. +15
    -0
      src/override/MenuBar.cpp
  7. +10
    -0
      src/override/Window.cpp

+ 6
- 0
src/CardinalCommon.cpp View File

@@ -54,6 +54,12 @@
# include <unistd.h>
#endif

namespace rack {
namespace settings {
int rateLimit = 0;
}
}

namespace patchUtils
{



+ 6
- 0
src/CardinalCommon.hpp View File

@@ -27,9 +27,15 @@

namespace rack
{

namespace settings {
extern int rateLimit;
}

namespace ui {
struct Menu;
}

}

namespace patchUtils


+ 18
- 0
src/CardinalPlugin.cpp 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
}


+ 13
- 0
src/CardinalUI.cpp 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;
}


+ 3
- 0
src/WindowParameters.hpp 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 {


+ 15
- 0
src/override/MenuBar.cpp 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;}
));
}
}));
}
};



+ 10
- 0
src/override/Window.cpp 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)


Loading…
Cancel
Save