From a971f6dccf88e511eb5ad81ee37a2f6d195d4756 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 12 Mar 2024 23:49:42 +0300 Subject: [PATCH] audio settings menu --- res/texts/ru_RU.txt | 6 +++++ src/audio/audio.cpp | 4 ++++ src/audio/audio.h | 17 +++++++++++++- src/engine.cpp | 16 +++++++++++-- src/frontend/menu/menu_settings.cpp | 36 +++++++++++++++++++++++++++++ src/frontend/screens.cpp | 4 ++++ 6 files changed, 80 insertions(+), 3 deletions(-) diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index 095c874d..25278d13 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -23,6 +23,7 @@ menu.Controls=Управление menu.Back to Main Menu=Вернуться в Меню menu.Settings=Настройки menu.Content=Контент +menu.Audio=Звук world.Seed=Зерно world.Name=Название @@ -41,6 +42,11 @@ settings.Fog Curve=Кривая Тумана settings.Backlight=Подсветка settings.V-Sync=Вертикальная Синхронизация settings.Camera Shaking=Тряска Камеры +settings.Master Volume=Общая Громкость +settings.Regular Sounds=Обычные Звуки +settings.UI Sounds=Звуки Интерфейса +settings.Ambient=Фон +settings.Music=Музыка settings.FOV=Поле Зрения settings.Mouse Sensitivity=Чувствительность Мыши diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index ebcd4e9c..b85e4eb1 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -356,6 +356,10 @@ Channel* audio::get_channel(int index) { return channels.at(index).get(); } +Channel* audio::get_channel(const std::string& name) { + return get_channel(get_channel_index(name)); +} + std::shared_ptr audio::get_associated_stream(speakerid_t id) { auto found = streams.find(id); if (found != streams.end()) { diff --git a/src/audio/audio.h b/src/audio/audio.h index 63407cb4..12abf9d7 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -55,6 +55,16 @@ namespace audio { /// @brief Get channel name const std::string& getName() const; + inline void setPaused(bool flag) { + if (flag == paused) + return; + if (flag) { + pause(); + } else { + resume(); + } + } + /// @brief Pause all speakers in channel void pause(); @@ -472,10 +482,15 @@ namespace audio { extern int get_channel_index(const std::string& name); /// @brief Get channel by index. 0 - is master channel - /// @param name channel index + /// @param index channel index /// @return channel or nullptr extern Channel* get_channel(int index); + /// @brief Get channel by name. + /// @param name channel name + /// @return channel or nullptr + extern Channel* get_channel(const std::string& name); + /// @brief Get stream associated with speaker /// @param id speaker id /// @return stream or nullptr diff --git a/src/engine.cpp b/src/engine.cpp index 5fde1605..0ef8d9de 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -114,6 +114,19 @@ void Engine::updateHotkeys() { } } +inline constexpr float sqr(float x) { + return x*x; +} + +static void updateAudio(double delta, const AudioSettings& settings) { + audio::get_channel("master")->setVolume(sqr(settings.volumeMaster)); + audio::get_channel("regular")->setVolume(sqr(settings.volumeRegular)); + audio::get_channel("ui")->setVolume(sqr(settings.volumeUI)); + audio::get_channel("ambient")->setVolume(sqr(settings.volumeAmbient)); + audio::get_channel("music")->setVolume(sqr(settings.volumeMusic)); + audio::update(delta); +} + void Engine::mainloop() { setScreen(std::make_shared(this)); @@ -125,8 +138,7 @@ void Engine::mainloop() { assert(screen != nullptr); updateTimers(); updateHotkeys(); - - audio::update(delta); + updateAudio(delta, settings.audio); gui->act(delta); screen->update(delta); diff --git a/src/frontend/menu/menu_settings.cpp b/src/frontend/menu/menu_settings.cpp index 4135ebaa..1baeb1c3 100644 --- a/src/frontend/menu/menu_settings.cpp +++ b/src/frontend/menu/menu_settings.cpp @@ -11,7 +11,42 @@ using namespace gui; +static void create_volume_trackbar( + std::shared_ptr panel, + const std::wstring& name, + float* field +) { + panel->add(menus::create_label([=]() { + return langs::get(name, L"settings")+L": " + + std::to_wstring(int(*field*100))+L"%"; + })); + + auto trackbar = std::make_shared(0.0, 1.0, 1.0, 0.01, 5); + trackbar->setSupplier([=]() { + return *field; + }); + trackbar->setConsumer([=](double value) { + *field = value; + }); + panel->add(trackbar); +} + +void create_audio_settings_panel(Engine* engine) { + auto menu = engine->getGUI()->getMenu(); + auto panel = menus::create_page(engine, "settings-audio", 400, 0.0f, 1); + + auto& settings = engine->getSettings().audio; + create_volume_trackbar(panel, L"Master Volume", &settings.volumeMaster); + create_volume_trackbar(panel, L"Regular Sounds", &settings.volumeRegular); + create_volume_trackbar(panel, L"UI Sounds", &settings.volumeUI); + create_volume_trackbar(panel, L"Ambient", &settings.volumeAmbient); + create_volume_trackbar(panel, L"Music", &settings.volumeMusic); + panel->add(guiutil::backButton(menu)); +} + void menus::create_settings_panel(Engine* engine) { + create_audio_settings_panel(engine); + auto menu = engine->getGUI()->getMenu(); auto panel = menus::create_page(engine, "settings", 400, 0.0f, 1); @@ -125,6 +160,7 @@ void menus::create_settings_panel(Engine* engine) { util::str2wstr_utf8(langName), "languages", menu)); + panel->add(guiutil::gotoButton(L"Audio", "settings-audio", menu)); panel->add(guiutil::gotoButton(L"Controls", "controls", menu)); panel->add(guiutil::backButton(menu)); } diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index e3688888..9911603d 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -153,6 +153,10 @@ void LevelScreen::update(float delta) { auto player = controller->getPlayer(); auto camera = player->camera; + + bool paused = hud->isPause(); + audio::get_channel("regular")->setPaused(paused); + audio::get_channel("ambient")->setPaused(paused); audio::set_listener( camera->position-camera->dir, player->hitbox->velocity,