Browse Source

Allow to disable the workaround "unconsumed messages getting stuck in the future".

Because this workaround is causing MIDI events drops at low block size settings.
pull/1934/head
Sebastien Andary 3 years ago
parent
commit
e6cb593b75
4 changed files with 19 additions and 5 deletions
  1. +1
    -0
      include/settings.hpp
  2. +3
    -0
      src/app/MenuBar.cpp
  3. +8
    -5
      src/midi.cpp
  4. +7
    -0
      src/settings.cpp

+ 1
- 0
include/settings.hpp View File

@@ -61,6 +61,7 @@ extern float knobLinearSensitivity;
extern float knobScrollSensitivity; extern float knobScrollSensitivity;
extern float sampleRate; extern float sampleRate;
extern int threadCount; extern int threadCount;
extern bool disableDawTimeWarpWorkaround;
extern bool tooltips; extern bool tooltips;
extern bool cpuMeter; extern bool cpuMeter;
extern bool lockModules; extern bool lockModules;


+ 3
- 0
src/app/MenuBar.cpp View File

@@ -548,6 +548,9 @@ struct EngineButton : MenuButton {
)); ));
} }
})); }));
menu->addChild(createCheckMenuItem("Disable DAW time warp workaround", "",
[=]() { return settings::disableDawTimeWarpWorkaround; },
[=]() { settings::disableDawTimeWarpWorkaround ^= true; }));
} }
}; };




+ 8
- 5
src/midi.cpp View File

@@ -7,6 +7,7 @@
#include <string.hpp> #include <string.hpp>
#include <system.hpp> #include <system.hpp>
#include <context.hpp> #include <context.hpp>
#include <settings.hpp>
#include <engine/Engine.hpp> #include <engine/Engine.hpp>




@@ -339,11 +340,13 @@ bool InputQueue::tryPop(Message* messageOut, int64_t maxFrame) {
return true; return true;
} }


// If next MIDI message is too far in the future, clear the queue.
// This solves the issue of unconsumed messages getting stuck in the future when a DAW rewinds the engine frame.
int futureFrames = 2 * APP->engine->getBlockFrames();
if (msg.getFrame() - maxFrame > futureFrames) {
internal->queue.clear();
if (!rack::settings::disableDawTimeWarpWorkaround) {
// If next MIDI message is too far in the future, clear the queue.
// This solves the issue of unconsumed messages getting stuck in the future when a DAW rewinds the engine frame.
int futureFrames = 2 * APP->engine->getBlockFrames();
if (msg.getFrame() - maxFrame > futureFrames) {
internal->queue.clear();
}
} }
return false; return false;
} }


+ 7
- 0
src/settings.cpp View File

@@ -36,6 +36,7 @@ float knobLinearSensitivity = 0.001f;
float knobScrollSensitivity = 0.001f; float knobScrollSensitivity = 0.001f;
float sampleRate = 0; float sampleRate = 0;
int threadCount = 1; int threadCount = 1;
bool disableDawTimeWarpWorkaround = false;
bool tooltips = true; bool tooltips = true;
bool cpuMeter = false; bool cpuMeter = false;
bool lockModules = false; bool lockModules = false;
@@ -137,6 +138,8 @@ json_t* toJson() {


json_object_set_new(rootJ, "threadCount", json_integer(threadCount)); json_object_set_new(rootJ, "threadCount", json_integer(threadCount));


json_object_set_new(rootJ, "disableDawTimeWarpWorkaround", json_boolean(disableDawTimeWarpWorkaround));

json_object_set_new(rootJ, "tooltips", json_boolean(tooltips)); json_object_set_new(rootJ, "tooltips", json_boolean(tooltips));


json_object_set_new(rootJ, "cpuMeter", json_boolean(cpuMeter)); json_object_set_new(rootJ, "cpuMeter", json_boolean(cpuMeter));
@@ -305,6 +308,10 @@ void fromJson(json_t* rootJ) {
if (threadCountJ) if (threadCountJ)
threadCount = json_integer_value(threadCountJ); threadCount = json_integer_value(threadCountJ);


json_t* disableDawTimeWarpWorkaroundJ = json_object_get(rootJ, "disableDawTimeWarpWorkaround");
if (disableDawTimeWarpWorkaroundJ)
disableDawTimeWarpWorkaround = json_boolean_value(disableDawTimeWarpWorkaroundJ);

json_t* tooltipsJ = json_object_get(rootJ, "tooltips"); json_t* tooltipsJ = json_object_get(rootJ, "tooltips");
if (tooltipsJ) if (tooltipsJ)
tooltips = json_boolean_value(tooltipsJ); tooltips = json_boolean_value(tooltipsJ);


Loading…
Cancel
Save