audio settings menu
This commit is contained in:
parent
9150af19ea
commit
a971f6dccf
@ -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=Чувствительность Мыши
|
||||
|
||||
@ -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()) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user