audio settings menu

This commit is contained in:
MihailRis 2024-03-12 23:49:42 +03:00
parent 9150af19ea
commit a971f6dccf
6 changed files with 80 additions and 3 deletions

View File

@ -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=Чувствительность Мыши

View File

@ -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<Stream> audio::get_associated_stream(speakerid_t id) {
auto found = streams.find(id);
if (found != streams.end()) {

View File

@ -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

View File

@ -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<MenuScreen>(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);

View File

@ -11,7 +11,42 @@
using namespace gui;
static void create_volume_trackbar(
std::shared_ptr<Panel> 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<TrackBar>(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));
}

View File

@ -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,