diff --git a/tui/src/tui_settings.cpp b/tui/src/tui_settings.cpp index 39e7cc8..f0a77c2 100644 --- a/tui/src/tui_settings.cpp +++ b/tui/src/tui_settings.cpp @@ -19,7 +19,7 @@ const std::vector kAppearanceSettings = { const std::vector kGeneralSettings = { {SettingId::InputTrim, "Input trim", "Applies gain before every analyzer."}, - {SettingId::RefreshRate, "Refresh rate", "Controls how often the terminal display is published."}, + {SettingId::RefreshRate, "Refresh rate", "120 FPS is experimental and depends heavily on the terminal."}, }; const std::vector kSpectrumSettings = { @@ -305,7 +305,9 @@ TuiSettings normalizeSettings(TuiSettings settings) { }), settings.themeId.end()); if (settings.themeId.empty()) settings.themeId = "Default"; settings.inputTrimDb = std::clamp(snap(settings.inputTrimDb, 0.5f), -12.0f, 12.0f); - settings.refreshRate = settings.refreshRate <= 30 ? 30 : 60; + settings.refreshRate = settings.refreshRate <= 30 + ? 30 + : settings.refreshRate <= 60 ? 60 : 120; settings.rackLayout = normalizeRackLayout(std::move(settings.rackLayout)); settings.spectrumTiltDbPerOctave = std::clamp( snap(settings.spectrumTiltDbPerOctave, 0.1f), -2.0f, 8.0f); @@ -430,7 +432,8 @@ std::string settingValue(const TuiSettings& settings, SettingId setting) { return (settings.inputTrimDb > 0.0f ? "+" : "") + trimFloat(settings.inputTrimDb, 1) + " dB"; case SettingId::RefreshRate: - return std::to_string(settings.refreshRate) + " FPS"; + return std::to_string(settings.refreshRate) + " FPS" + + (settings.refreshRate == 120 ? " (experimental)" : ""); case SettingId::SpectrumPeakReadout: return boolValue(settings.spectrumPeakReadout); case SettingId::SpectrumTilt: @@ -503,7 +506,15 @@ bool adjustSetting(TuiSettings& settings, SettingId setting, int direction) { settings.inputTrimDb += direction > 0 ? 0.5f : -0.5f; break; case SettingId::RefreshRate: - settings.refreshRate = settings.refreshRate == 60 ? 30 : 60; + if (direction > 0) { + settings.refreshRate = settings.refreshRate == 30 + ? 60 + : settings.refreshRate == 60 ? 120 : 30; + } else { + settings.refreshRate = settings.refreshRate == 120 + ? 60 + : settings.refreshRate == 60 ? 30 : 120; + } break; case SettingId::SpectrumPeakReadout: settings.spectrumPeakReadout = !settings.spectrumPeakReadout; diff --git a/tui/test/tui_tests.cpp b/tui/test/tui_tests.cpp index 39180fd..be66a9f 100644 --- a/tui/test/tui_tests.cpp +++ b/tui/test/tui_tests.cpp @@ -477,6 +477,20 @@ void testSettingsModelAndPersistence() { Prism::Tui::settingsForPage(Prism::Tui::SettingsPage::General).size() == 2, "settings should expose shallow category pages"); Prism::Tui::TuiSettings adjusted; + require(Prism::Tui::adjustSetting( + adjusted, Prism::Tui::SettingId::RefreshRate, 1) && + adjusted.refreshRate == 120 && + Prism::Tui::settingValue( + adjusted, Prism::Tui::SettingId::RefreshRate).find("experimental") != + std::string::npos, + "refresh settings should expose an explicit experimental 120 FPS mode"); + require(Prism::Tui::adjustSetting( + adjusted, Prism::Tui::SettingId::RefreshRate, 1) && + adjusted.refreshRate == 30 && + Prism::Tui::adjustSetting( + adjusted, Prism::Tui::SettingId::RefreshRate, -1) && + adjusted.refreshRate == 120, + "refresh settings should cycle through 30, 60, and 120 FPS in both directions"); require(Prism::Tui::adjustSetting( adjusted, Prism::Tui::SettingId::InputTrim, 1) && adjusted.inputTrimDb == 0.5f,