From 82ff443a0beab6a282ff19e13b0cbc3bbd2b609f Mon Sep 17 00:00:00 2001 From: santievil Date: Sun, 8 Mar 2026 21:25:38 +0100 Subject: [PATCH 1/3] Add frame delay --- .../CoreInfiniteEngine.h | 2 +- .../infinite-color-engine/InfiniteSmoothing.h | 7 ++- sources/base/HyperHdrInstance.cpp | 2 +- sources/base/schema/schema-smoothing.json | 13 +++++ .../CoreInfiniteEngine.cpp | 4 +- .../InfiniteSmoothing.cpp | 52 +++++++++++++++++-- www/i18n/cs.json | 1 + www/i18n/de.json | 1 + www/i18n/en.json | 1 + www/i18n/es.json | 1 + www/i18n/fr.json | 1 + www/i18n/it.json | 1 + www/i18n/nl.json | 1 + www/i18n/pl.json | 1 + www/i18n/ro.json | 1 + www/i18n/ru.json | 1 + www/i18n/sv.json | 1 + www/i18n/tr.json | 1 + www/i18n/vi.json | 1 + www/i18n/zh-CN.json | 1 + 20 files changed, 84 insertions(+), 10 deletions(-) diff --git a/include/infinite-color-engine/CoreInfiniteEngine.h b/include/infinite-color-engine/CoreInfiniteEngine.h index cbf69bfe8..082a14892 100644 --- a/include/infinite-color-engine/CoreInfiniteEngine.h +++ b/include/infinite-color-engine/CoreInfiniteEngine.h @@ -30,7 +30,7 @@ class CoreInfiniteEngine : public QObject int getSuggestedInterval(); bool getAntiFlickeringFilterState(); - unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, bool pause); + unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause); void setCurrentSmoothingConfigParams(unsigned cfgID); void incomingColors(std::vector&& _ledBuffer); void setProcessingEnabled(bool enabled); diff --git a/include/infinite-color-engine/InfiniteSmoothing.h b/include/infinite-color-engine/InfiniteSmoothing.h index d645ed036..36c3e7f99 100644 --- a/include/infinite-color-engine/InfiniteSmoothing.h +++ b/include/infinite-color-engine/InfiniteSmoothing.h @@ -36,7 +36,7 @@ class InfiniteSmoothing : public QObject bool isEnabled() const; void incomingColors(std::vector&& nonlinearRgbColors, std::optional minimalBacklight); - unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, bool pause); + unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause); void setCurrentSmoothingConfigParams(unsigned cfgID); bool selectConfig(unsigned cfgId); int getSuggestedInterval(); @@ -80,6 +80,7 @@ private slots: float smoothingFactor; float stiffness; float damping; + float updateDelayFrames; float y_limit; }; @@ -95,4 +96,8 @@ private slots: long long _lastSentFrame; bool _antiFlickeringFilter; float _minimalBacklight; + std::vector> _frameDelayBuffers; + std::vector _lastDelayFrames; + std::vector> _frameDelayTimestamps; + }; diff --git a/sources/base/HyperHdrInstance.cpp b/sources/base/HyperHdrInstance.cpp index d5ff7ddfd..22b904ca0 100644 --- a/sources/base/HyperHdrInstance.cpp +++ b/sources/base/HyperHdrInstance.cpp @@ -385,7 +385,7 @@ QJsonObject HyperHdrInstance::getAverageColor() unsigned HyperHdrInstance::addEffectConfig(unsigned id, int settlingTime_ms, double ledUpdateFrequency_hz, bool pause) { - return _infinite->addCustomSmoothingConfig(id, settlingTime_ms, ledUpdateFrequency_hz, pause); + return _infinite->addCustomSmoothingConfig(id, settlingTime_ms, ledUpdateFrequency_hz, 0, pause); } int HyperHdrInstance::getLedCount() const diff --git a/sources/base/schema/schema-smoothing.json b/sources/base/schema/schema-smoothing.json index 6c1c393dc..d8f4b5f69 100644 --- a/sources/base/schema/schema-smoothing.json +++ b/sources/base/schema/schema-smoothing.json @@ -135,6 +135,19 @@ "default" : true, "required" : true, "propertyOrder" : 10 + }, + "updateDelay" : + { + "type" : "integer", + "format": "stepper", + "step" : 1, + "title" : "edt_conf_smooth_updateDelay_title", + "minimum" : 0, + "maximum": 100, + "default" : 0, + "append" : "edt_append_frames", + "required" : true, + "propertyOrder" : 11 } }, "additionalProperties" : false diff --git a/sources/infinite-color-engine/CoreInfiniteEngine.cpp b/sources/infinite-color-engine/CoreInfiniteEngine.cpp index 64d5f7d41..450fa1bd2 100644 --- a/sources/infinite-color-engine/CoreInfiniteEngine.cpp +++ b/sources/infinite-color-engine/CoreInfiniteEngine.cpp @@ -57,9 +57,9 @@ bool CoreInfiniteEngine::getAntiFlickeringFilterState() return _smoothing->getAntiFlickeringFilterState(); } -unsigned CoreInfiniteEngine::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, bool pause) +unsigned CoreInfiniteEngine::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause) { - return _smoothing->addCustomSmoothingConfig(cfgID, settlingTime_ms, ledUpdateFrequency_hz, pause); + return _smoothing->addCustomSmoothingConfig(cfgID, settlingTime_ms, ledUpdateFrequency_hz, ledUpdateDelay_fr, pause); } void CoreInfiniteEngine::setCurrentSmoothingConfigParams(unsigned cfgID) diff --git a/sources/infinite-color-engine/InfiniteSmoothing.cpp b/sources/infinite-color-engine/InfiniteSmoothing.cpp index d2d7f2eb4..e2d7add6c 100644 --- a/sources/infinite-color-engine/InfiniteSmoothing.cpp +++ b/sources/infinite-color-engine/InfiniteSmoothing.cpp @@ -187,15 +187,16 @@ void InfiniteSmoothing::handleSignalInstanceSettingsChanged(settings::type type, .smoothingFactor = static_cast(obj["smoothingFactor"].toDouble(0.1)), .stiffness = static_cast(obj["stiffness"].toDouble(200)), .damping = static_cast(obj["damping"].toDouble(26)), + .updateDelayFrames = static_cast(obj["updateDelay"].toDouble(0.0)), .y_limit = static_cast(obj["y_limit"].toDouble()) } ); const auto& cfg = _configurations[SMOOTHING_USER_CONFIG]; Info(_log, "Updating user config ({:d}) => type: {:s}, pause: {:s}, settlingTime: {:d}ms, interval: {:d}ms ({:d}Hz)" - ", antiFlickeringFilter: {:s}, smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, y_limit: {:f}", + ", antiFlickeringFilter: {:s}, smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:f}, y_limit: {:f}", SMOOTHING_USER_CONFIG, (EnumSmoothingTypeToString(cfg->type)), (cfg->pause) ? "true" : "false", int(cfg->settlingTime), int(cfg->updateInterval), int(1000.0 / cfg->updateInterval), - ((_antiFlickeringFilter) ? "enabled": "disabled"), cfg->smoothingFactor, cfg->stiffness, cfg->damping, cfg->y_limit + ((_antiFlickeringFilter) ? "enabled": "disabled"), cfg->smoothingFactor, cfg->stiffness, cfg->damping, cfg->updateDelayFrames, cfg->y_limit ); if (_currentConfigId == SMOOTHING_USER_CONFIG) @@ -245,7 +246,15 @@ void InfiniteSmoothing::updateLeds() { QMutexLocker locker(&_dataSynchro); if (!isEnabled()) + { + // Disable queues + if (_frameDelayBuffers.size() > _currentConfigId) + { + _frameDelayBuffers[_currentConfigId].clear(); + } + return; + } timeNow = InternalClock::now(); _interpolator->updateCurrentColors(timeNow); @@ -267,9 +276,42 @@ void InfiniteSmoothing::updateLeds() if (!nonlinearRgbColors->empty() && !finished) { + float currentDelay = _configurations[_currentConfigId]->updateDelayFrames; + + // Only queue if delay + if (currentDelay > 0.0f) + { + if (_frameDelayBuffers.size() <= _currentConfigId) + { + _frameDelayBuffers.resize(_currentConfigId + 1); + } + auto& buffer = _frameDelayBuffers[_currentConfigId]; + buffer.push_back(nonlinearRgbColors); + + if (buffer.size() <= static_cast(currentDelay)) + return; + + nonlinearRgbColors = std::move(buffer.front()); + buffer.pop_front(); + } + else + { + if (_frameDelayBuffers.size() > _currentConfigId) + { + _frameDelayBuffers[_currentConfigId].clear(); + } + } + _lastSentFrame = timeNow; queueColors(std::move(nonlinearRgbColors)); } + else + { + if (_frameDelayBuffers.size() > _currentConfigId) + { + _frameDelayBuffers[_currentConfigId].clear(); + } + } } void InfiniteSmoothing::queueColors(SharedOutputColors&& nonlinearRgbLedColors) @@ -310,7 +352,7 @@ unsigned InfiniteSmoothing::addConfig(int settlingTime_ms, double ledUpdateFrequ return static_cast(_configurations.size() - 1); } -unsigned InfiniteSmoothing::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, bool pause) +unsigned InfiniteSmoothing::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause) { int64_t interval = (ledUpdateFrequency_hz > std::numeric_limits::epsilon()) ? static_cast(1000.0 / ledUpdateFrequency_hz) : 10; @@ -364,14 +406,14 @@ bool InfiniteSmoothing::selectConfig(unsigned cfgId) const auto& cfg = _configurations[_currentConfigId]; Info(_log, "Selecting config ({:d}) => type: {:s}, pause: {:s}, settlingTime: {:d}ms, interval: {:d}ms ({:d}Hz). Smoothing is currently: {:s} and antiFlickeringFilter is: {:s}" - ", smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, y_limit: {:f}", + ", smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:f}, y_limit: {:f}", _currentConfigId, (EnumSmoothingTypeToString(cfg->type)), (!cfg->pause) ? "true" : "false", int(cfg->settlingTime), int(cfg->updateInterval), int(1000.0 / cfg->updateInterval), (_enabled) ? "enabled" : "disabled", ((_antiFlickeringFilter) ? "enabled" : "disabled"), - cfg->smoothingFactor, cfg->stiffness, cfg->damping, cfg->y_limit); + cfg->smoothingFactor, cfg->stiffness, cfg->damping, cfg->updateDelayFrames, cfg->y_limit); return result; } diff --git a/www/i18n/cs.json b/www/i18n/cs.json index 8c8f9e88b..5b2a49395 100644 --- a/www/i18n/cs.json +++ b/www/i18n/cs.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Korekce jasu HDR", "edt_conf_monitor_nits_expl": "SDR cílový jas použitý pro převod HDR na SDR. Pokud 0, zakáže konverzi barev hardwaru při zachování zrychleného škálování.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Zakázat při uzamčení", "edt_conf_gen_disableOnLocked_expl": "Vypněte zpracování, když uživatel uzamkne systém.", "edt_conf_gen_disableLedsStartup_title": "Vypněte LED při startu", diff --git a/www/i18n/de.json b/www/i18n/de.json index aa09996d2..f7f099176 100644 --- a/www/i18n/de.json +++ b/www/i18n/de.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "HDR-Helligkeitskorrektur", "edt_conf_monitor_nits_expl": "SDR-Zielhelligkeit, die für die Konvertierung von HDR in SDR verwendet wird. Bei 0 wird die Hardware-Farbkonvertierung deaktiviert und gleichzeitig die beschleunigte Skalierung beibehalten.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Deaktivieren bei gesperrtem System oder ausgeschaltetem Monitor", "edt_conf_gen_disableOnLocked_expl": "Stoppt die Verarbeitung des Software‑Grabbers bei System­sperre oder ausgeschaltetem Monitor.", "edt_conf_gen_disableLedsStartup_title": "Schalten Sie die LEDs beim Start aus", diff --git a/www/i18n/en.json b/www/i18n/en.json index aa3497fe8..0ba906613 100644 --- a/www/i18n/en.json +++ b/www/i18n/en.json @@ -1220,6 +1220,7 @@ "edt_conf_monitor_nits_title": "HDR brightness correction", "edt_conf_monitor_nits_expl": "SDR target brightness used for HDR to SDR conversion. If 0, it disables hardware color conversion while maintaining accelerated scaling.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Disable on OS lock or monitor off", "edt_conf_gen_disableOnLocked_expl": "Stops software grabber processing during OS lock or monitor‑off events. A restart is required for the changes to take effect.", "edt_conf_gen_disableLedsStartup_title": "Turn off LEDs at startup", diff --git a/www/i18n/es.json b/www/i18n/es.json index 2974473e3..ce101be15 100644 --- a/www/i18n/es.json +++ b/www/i18n/es.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Corrección de brillo HDR", "edt_conf_monitor_nits_expl": "Brillo objetivo SDR utilizado para la conversión HDR a SDR. Si es 0, deshabilita la conversión de color del hardware mientras mantiene el escalado acelerado.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Deshabilitar cuando está bloqueado", "edt_conf_gen_disableOnLocked_expl": "Desactivar el procesamiento cuando el usuario haya bloqueado el sistema.", "edt_conf_gen_disableLedsStartup_title": "Apague los LED al inicio", diff --git a/www/i18n/fr.json b/www/i18n/fr.json index 8244d17b9..fd59f7469 100644 --- a/www/i18n/fr.json +++ b/www/i18n/fr.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Correction de la luminosité HDR", "edt_conf_monitor_nits_expl": "Luminosité cible SDR utilisée pour la conversion HDR en SDR. Si 0, il désactive la conversion matérielle des couleurs tout en maintenant une mise à l'échelle accélérée.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Désactiver lorsque le système est verrouillé ou que l’écran est éteint", "edt_conf_gen_disableOnLocked_expl": "Interrompt le traitement du grabber logiciel lors du verrouillage du système ou de l’extinction de l’écran.", "edt_conf_gen_disableLedsStartup_title": "Éteignez les LED au démarrage", diff --git a/www/i18n/it.json b/www/i18n/it.json index 17ed9b5c3..aca373336 100644 --- a/www/i18n/it.json +++ b/www/i18n/it.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Correzione luminosità HDR", "edt_conf_monitor_nits_expl": "Luminosità target SDR utilizzata per la conversione da HDR a SDR. Se 0, disabilita la conversione del colore hardware mantenendo il ridimensionamento accelerato.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Disabilita quando bloccato", "edt_conf_gen_disableOnLocked_expl": "Disattiva l'elaborazione quando l'utente ha bloccato il sistema.", "edt_conf_gen_disableLedsStartup_title": "Spegnere i LED all'avvio", diff --git a/www/i18n/nl.json b/www/i18n/nl.json index c6a54010d..bc97d9389 100644 --- a/www/i18n/nl.json +++ b/www/i18n/nl.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "HDR-helderheidscorrectie", "edt_conf_monitor_nits_expl": "SDR-doelhelderheid gebruikt voor conversie van HDR naar SDR. Indien 0, wordt de hardwarekleurconversie uitgeschakeld terwijl de versnelde schaling behouden blijft.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Uitschakelen wanneer vergrendeld", "edt_conf_gen_disableOnLocked_expl": "Schakel de verwerking uit wanneer de gebruiker het systeem heeft vergrendeld.", "edt_conf_gen_disableLedsStartup_title": "Schakel de LED's uit bij het opstarten", diff --git a/www/i18n/pl.json b/www/i18n/pl.json index 21f636991..055ea7e18 100644 --- a/www/i18n/pl.json +++ b/www/i18n/pl.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Korekta jasności HDR", "edt_conf_monitor_nits_expl": "Docelowa jasność SDR używana do konwersji HDR na SDR. Jeśli wynosi 0, wyłącza sprzętową konwersję kolorów przy jednoczesnym zachowaniu przyspieszonego skalowania.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Wyłącz przy zablokowanym systemie lub wyłączonym monitorze", "edt_conf_gen_disableOnLocked_expl": "Zatrzymuje działanie grabbera programowego podczas blokady systemu lub wyłączenia monitora.", "edt_conf_gen_disableLedsStartup_title": "Wyłącz diody LED przy uruchomieniu", diff --git a/www/i18n/ro.json b/www/i18n/ro.json index 037e679d9..e807e737d 100644 --- a/www/i18n/ro.json +++ b/www/i18n/ro.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Corecția luminozității HDR", "edt_conf_monitor_nits_expl": "Luminozitatea țintă SDR utilizată pentru conversia HDR în SDR. Dacă este 0, dezactivează conversia hardware a culorilor, menținând în același timp scalarea accelerată.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Dezactivați când este blocat", "edt_conf_gen_disableOnLocked_expl": "Opriți procesarea când utilizatorul a blocat sistemul.", "edt_conf_gen_disableLedsStartup_title": "Opriți LED-urile la pornire", diff --git a/www/i18n/ru.json b/www/i18n/ru.json index 61916d4e2..ca3be9fdf 100644 --- a/www/i18n/ru.json +++ b/www/i18n/ru.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Коррекция яркости HDR", "edt_conf_monitor_nits_expl": "Целевая яркость SDR, используемая для преобразования HDR в SDR. Если значение равно 0, это отключает аппаратное преобразование цвета при сохранении ускоренного масштабирования.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Отключить при блокировке", "edt_conf_gen_disableOnLocked_expl": "Отключить обработку когда пользователь заблокировал систему.", "edt_conf_gen_disableLedsStartup_title": "Выключить светодиоды при запуске", diff --git a/www/i18n/sv.json b/www/i18n/sv.json index b635156b2..2e4c83430 100644 --- a/www/i18n/sv.json +++ b/www/i18n/sv.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Korrigering av HDR-ljusstyrka", "edt_conf_monitor_nits_expl": "SDR-målljusstyrka som används för konvertering av HDR till SDR. Om 0, inaktiverar det hårdvarufärgkonvertering samtidigt som accelererad skalning bibehålls.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Inaktivera när den är låst", "edt_conf_gen_disableOnLocked_expl": "Stäng av bearbetning när användaren har låst systemet.", "edt_conf_gen_disableLedsStartup_title": "Stäng av lysdioderna vid start", diff --git a/www/i18n/tr.json b/www/i18n/tr.json index 5e1212e66..d76317fc7 100644 --- a/www/i18n/tr.json +++ b/www/i18n/tr.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "HDR parlaklık düzeltmesi", "edt_conf_monitor_nits_expl": "HDR'den SDR'ye dönüştürme için kullanılan SDR hedef parlaklığı. 0 ise, hızlandırılmış ölçeklendirmeyi korurken donanım renk dönüşümünü devre dışı bırakır.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Kilitlendiğinde devre dışı bırak", "edt_conf_gen_disableOnLocked_expl": "Kullanıcı sistemi kilitlediğinde işlemeyi kapatın.", "edt_conf_gen_disableLedsStartup_title": "Başlangıçta LED'leri kapatın", diff --git a/www/i18n/vi.json b/www/i18n/vi.json index ec2e643a7..f35353453 100644 --- a/www/i18n/vi.json +++ b/www/i18n/vi.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "Chỉnh sửa độ sáng HDR", "edt_conf_monitor_nits_expl": "Độ sáng mục tiêu SDR được sử dụng để chuyển đổi HDR sang SDR. Nếu bằng 0, nó sẽ vô hiệu hóa chuyển đổi màu phần cứng trong khi vẫn duy trì tỷ lệ tăng tốc.", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "Tắt khi bị khóa", "edt_conf_gen_disableOnLocked_expl": "Tắt xử lý khi người dùng đã khóa hệ thống.", "edt_conf_gen_disableLedsStartup_title": "Tắt đèn LED khi khởi động", diff --git a/www/i18n/zh-CN.json b/www/i18n/zh-CN.json index 6b41c1bd9..672b2d3ec 100644 --- a/www/i18n/zh-CN.json +++ b/www/i18n/zh-CN.json @@ -1214,6 +1214,7 @@ "edt_conf_monitor_nits_title": "HDR亮度校正", "edt_conf_monitor_nits_expl": "用于 HDR 到 SDR 转换的 SDR 目标亮度。如果为 0,则禁用硬件颜色转换,同时保持加速缩放。", "edt_append_nits": "nits", + "edt_append_frames": "Frames", "edt_conf_gen_disableOnLocked_title": "锁定时禁用", "edt_conf_gen_disableOnLocked_expl": "当用户锁定系统时关闭处理。", "edt_conf_gen_disableLedsStartup_title": "启动时关闭 LED", From dddd0f2bad6ee917e1bf054eff8c2fecd97d1564 Mon Sep 17 00:00:00 2001 From: santievil Date: Sun, 8 Mar 2026 21:37:24 +0100 Subject: [PATCH 2/3] Add deque --- include/infinite-color-engine/InfiniteSmoothing.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/infinite-color-engine/InfiniteSmoothing.h b/include/infinite-color-engine/InfiniteSmoothing.h index 36c3e7f99..f882ff380 100644 --- a/include/infinite-color-engine/InfiniteSmoothing.h +++ b/include/infinite-color-engine/InfiniteSmoothing.h @@ -22,6 +22,7 @@ #include #include #include +#include class HyperHdrInstance; From cd7a571f1fea031367fe6be38f4f58969b432617 Mon Sep 17 00:00:00 2001 From: santievil Date: Mon, 9 Mar 2026 07:56:07 +0100 Subject: [PATCH 3/3] Convert to int. Remove trash --- .../CoreInfiniteEngine.h | 2 +- .../infinite-color-engine/InfiniteSmoothing.h | 9 +- .../CoreInfiniteEngine.cpp | 2 +- .../InfiniteSmoothing.cpp | 135 ++++++++---------- 4 files changed, 62 insertions(+), 86 deletions(-) diff --git a/include/infinite-color-engine/CoreInfiniteEngine.h b/include/infinite-color-engine/CoreInfiniteEngine.h index 082a14892..5ccc68bc5 100644 --- a/include/infinite-color-engine/CoreInfiniteEngine.h +++ b/include/infinite-color-engine/CoreInfiniteEngine.h @@ -30,7 +30,7 @@ class CoreInfiniteEngine : public QObject int getSuggestedInterval(); bool getAntiFlickeringFilterState(); - unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause); + unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, int ledUpdateDelay_fr, bool pause); void setCurrentSmoothingConfigParams(unsigned cfgID); void incomingColors(std::vector&& _ledBuffer); void setProcessingEnabled(bool enabled); diff --git a/include/infinite-color-engine/InfiniteSmoothing.h b/include/infinite-color-engine/InfiniteSmoothing.h index f882ff380..b824bf7ba 100644 --- a/include/infinite-color-engine/InfiniteSmoothing.h +++ b/include/infinite-color-engine/InfiniteSmoothing.h @@ -37,7 +37,7 @@ class InfiniteSmoothing : public QObject bool isEnabled() const; void incomingColors(std::vector&& nonlinearRgbColors, std::optional minimalBacklight); - unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause); + unsigned addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, int ledUpdateDelay_fr, bool pause); void setCurrentSmoothingConfigParams(unsigned cfgID); bool selectConfig(unsigned cfgId); int getSuggestedInterval(); @@ -81,7 +81,7 @@ private slots: float smoothingFactor; float stiffness; float damping; - float updateDelayFrames; + int updateDelayFrames; float y_limit; }; @@ -97,8 +97,5 @@ private slots: long long _lastSentFrame; bool _antiFlickeringFilter; float _minimalBacklight; - std::vector> _frameDelayBuffers; - std::vector _lastDelayFrames; - std::vector> _frameDelayTimestamps; - + std::deque _frameDelayBuffer; }; diff --git a/sources/infinite-color-engine/CoreInfiniteEngine.cpp b/sources/infinite-color-engine/CoreInfiniteEngine.cpp index 450fa1bd2..e1e6958e6 100644 --- a/sources/infinite-color-engine/CoreInfiniteEngine.cpp +++ b/sources/infinite-color-engine/CoreInfiniteEngine.cpp @@ -57,7 +57,7 @@ bool CoreInfiniteEngine::getAntiFlickeringFilterState() return _smoothing->getAntiFlickeringFilterState(); } -unsigned CoreInfiniteEngine::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause) +unsigned CoreInfiniteEngine::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, int ledUpdateDelay_fr, bool pause) { return _smoothing->addCustomSmoothingConfig(cfgID, settlingTime_ms, ledUpdateFrequency_hz, ledUpdateDelay_fr, pause); } diff --git a/sources/infinite-color-engine/InfiniteSmoothing.cpp b/sources/infinite-color-engine/InfiniteSmoothing.cpp index e2d7add6c..14c196cc0 100644 --- a/sources/infinite-color-engine/InfiniteSmoothing.cpp +++ b/sources/infinite-color-engine/InfiniteSmoothing.cpp @@ -187,14 +187,14 @@ void InfiniteSmoothing::handleSignalInstanceSettingsChanged(settings::type type, .smoothingFactor = static_cast(obj["smoothingFactor"].toDouble(0.1)), .stiffness = static_cast(obj["stiffness"].toDouble(200)), .damping = static_cast(obj["damping"].toDouble(26)), - .updateDelayFrames = static_cast(obj["updateDelay"].toDouble(0.0)), + .updateDelayFrames = static_cast(obj["updateDelay"].toInt(0)), .y_limit = static_cast(obj["y_limit"].toDouble()) } ); const auto& cfg = _configurations[SMOOTHING_USER_CONFIG]; Info(_log, "Updating user config ({:d}) => type: {:s}, pause: {:s}, settlingTime: {:d}ms, interval: {:d}ms ({:d}Hz)" - ", antiFlickeringFilter: {:s}, smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:f}, y_limit: {:f}", + ", antiFlickeringFilter: {:s}, smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:d}, y_limit: {:f}", SMOOTHING_USER_CONFIG, (EnumSmoothingTypeToString(cfg->type)), (cfg->pause) ? "true" : "false", int(cfg->settlingTime), int(cfg->updateInterval), int(1000.0 / cfg->updateInterval), ((_antiFlickeringFilter) ? "enabled": "disabled"), cfg->smoothingFactor, cfg->stiffness, cfg->damping, cfg->updateDelayFrames, cfg->y_limit ); @@ -238,80 +238,59 @@ void InfiniteSmoothing::incomingColors(std::vector&& nonlinearRgbColors, } void InfiniteSmoothing::updateLeds() -{ - SharedOutputColors nonlinearRgbColors; - bool finished = false; - long long timeNow = 0; - // critical section - { - QMutexLocker locker(&_dataSynchro); - if (!isEnabled()) - { - // Disable queues - if (_frameDelayBuffers.size() > _currentConfigId) - { - _frameDelayBuffers[_currentConfigId].clear(); - } - - return; - } - - timeNow = InternalClock::now(); - _interpolator->updateCurrentColors(timeNow); - - nonlinearRgbColors = _interpolator->getCurrentColors(_minimalBacklight); - - if (!_interpolator->isAnimationComplete()) - { - _coolDown = SMOOTHING_COOLDOWN_PHASE; - } - else if (!_continuousOutput) - { - if (_coolDown > 0) - _coolDown--; - else if (std::abs(timeNow - _lastSentFrame) < 1000) - finished = true; - } - } - - if (!nonlinearRgbColors->empty() && !finished) - { - float currentDelay = _configurations[_currentConfigId]->updateDelayFrames; - - // Only queue if delay - if (currentDelay > 0.0f) - { - if (_frameDelayBuffers.size() <= _currentConfigId) - { - _frameDelayBuffers.resize(_currentConfigId + 1); - } - auto& buffer = _frameDelayBuffers[_currentConfigId]; - buffer.push_back(nonlinearRgbColors); - - if (buffer.size() <= static_cast(currentDelay)) - return; - - nonlinearRgbColors = std::move(buffer.front()); - buffer.pop_front(); - } - else - { - if (_frameDelayBuffers.size() > _currentConfigId) - { - _frameDelayBuffers[_currentConfigId].clear(); - } - } - - _lastSentFrame = timeNow; - queueColors(std::move(nonlinearRgbColors)); - } - else - { - if (_frameDelayBuffers.size() > _currentConfigId) - { - _frameDelayBuffers[_currentConfigId].clear(); - } - } +{ + SharedOutputColors nonlinearRgbColors; + long long timeNow = 0; + bool finished = false; + + // critical section + { + QMutexLocker locker(&_dataSynchro); + + if (!isEnabled()) + { + _frameDelayBuffer.clear(); + return; + } + + timeNow = InternalClock::now(); + _interpolator->updateCurrentColors(timeNow); + nonlinearRgbColors = _interpolator->getCurrentColors(_minimalBacklight); + + if (!_interpolator->isAnimationComplete()) + { + _coolDown = SMOOTHING_COOLDOWN_PHASE; + } + else if (!_continuousOutput) + { + if (_coolDown > 0) + _coolDown--; + else if (std::abs(timeNow - _lastSentFrame) < 1000) + finished = true; + } + } + + if (nonlinearRgbColors->empty() || finished) + { + _frameDelayBuffer.clear(); + return; + } + + // Global delay in frames + size_t currentDelay = static_cast(_configurations[_currentConfigId]->updateDelayFrames); + + if (currentDelay > 0) + { + _frameDelayBuffer.push_back(nonlinearRgbColors); + if (_frameDelayBuffer.size() <= currentDelay) + return; + + nonlinearRgbColors = std::move(_frameDelayBuffer.front()); + _frameDelayBuffer.pop_front(); + } + + _lastSentFrame = InternalClock::now(); + queueColors(std::move(nonlinearRgbColors)); } void InfiniteSmoothing::queueColors(SharedOutputColors&& nonlinearRgbLedColors) @@ -352,7 +331,7 @@ unsigned InfiniteSmoothing::addConfig(int settlingTime_ms, double ledUpdateFrequ return static_cast(_configurations.size() - 1); } -unsigned InfiniteSmoothing::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, double ledUpdateDelay_fr, bool pause) +unsigned InfiniteSmoothing::addCustomSmoothingConfig(unsigned cfgID, int settlingTime_ms, double ledUpdateFrequency_hz, int ledUpdateDelay_fr, bool pause) { int64_t interval = (ledUpdateFrequency_hz > std::numeric_limits::epsilon()) ? static_cast(1000.0 / ledUpdateFrequency_hz) : 10; @@ -406,7 +385,7 @@ bool InfiniteSmoothing::selectConfig(unsigned cfgId) const auto& cfg = _configurations[_currentConfigId]; Info(_log, "Selecting config ({:d}) => type: {:s}, pause: {:s}, settlingTime: {:d}ms, interval: {:d}ms ({:d}Hz). Smoothing is currently: {:s} and antiFlickeringFilter is: {:s}" - ", smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:f}, y_limit: {:f}", + ", smoothingFactor: {:f}, stiffness: {:f}, damping: {:f}, updateDelayFrames: {:d}, y_limit: {:f}", _currentConfigId, (EnumSmoothingTypeToString(cfg->type)), (!cfg->pause) ? "true" : "false", int(cfg->settlingTime), int(cfg->updateInterval),