diff options
author | Aki <please@ignore.pl> | 2024-03-08 00:09:56 +0100 |
---|---|---|
committer | Aki <please@ignore.pl> | 2024-03-08 00:21:55 +0100 |
commit | c45d494472bf0b812c0cf9d57e00ef75e7c155d0 (patch) | |
tree | 9b2dedc2f4a659a9ac40d631118d5edd05934d8a /StarsEx | |
parent | b995b5de7ee3cccfdf93bc4ed4a56143a6463947 (diff) | |
download | starshatter-c45d494472bf0b812c0cf9d57e00ef75e7c155d0.zip starshatter-c45d494472bf0b812c0cf9d57e00ef75e7c155d0.tar.gz starshatter-c45d494472bf0b812c0cf9d57e00ef75e7c155d0.tar.bz2 |
You can now adjust master volumes in settings
Changes may not take effect until restarting the game. It seems some
singletons are initialized when needed, then they are reused for each
mission, but have sound volume assigned at awkward times.
Diffstat (limited to 'StarsEx')
-rw-r--r-- | StarsEx/AudDlg.cpp | 22 | ||||
-rw-r--r-- | StarsEx/AudDlg.h | 4 | ||||
-rw-r--r-- | StarsEx/AudioConfig.cpp | 177 | ||||
-rw-r--r-- | StarsEx/AudioConfig.h | 10 | ||||
-rw-r--r-- | StarsEx/test/AudioConfig.cpp | 12 |
5 files changed, 133 insertions, 92 deletions
diff --git a/StarsEx/AudDlg.cpp b/StarsEx/AudDlg.cpp index 35eb56b..829b987 100644 --- a/StarsEx/AudDlg.cpp +++ b/StarsEx/AudDlg.cpp @@ -62,6 +62,10 @@ AudDlg::RegisterControls() menu_music_slider = (Slider*) FindControl(205); game_music_slider = (Slider*) FindControl(206); + master_volume_slider = (Slider*) FindControl(207); + music_volume_slider = (Slider*) FindControl(208); + world_volume_slider = (Slider*) FindControl(209); + apply = (Button*) FindControl(1); REGISTER_CLIENT(EID_CLICK, apply, AudDlg, OnApply); @@ -113,6 +117,15 @@ AudDlg::Show() if (game_music_slider) game_music_slider->SetValue(audio->GetGameMusic()); + + if (master_volume_slider) + master_volume_slider->SetValue(audio->GetMasterVolume()); + + if (music_volume_slider) + music_volume_slider->SetValue(audio->GetMusicVolume()); + + if (world_volume_slider) + world_volume_slider->SetValue(audio->GetWorldVolume()); } if (vid_btn) vid_btn->SetButtonState(0); @@ -183,6 +196,15 @@ AudDlg::Apply() if (game_music_slider) audio->SetGameMusic(game_music_slider->GetValue()); + if (master_volume_slider) + audio->SetMasterVolume(master_volume_slider->GetValue()); + + if (music_volume_slider) + audio->SetMusicVolume(music_volume_slider->GetValue()); + + if (world_volume_slider) + audio->SetWorldVolume(world_volume_slider->GetValue()); + audio->Save(); } diff --git a/StarsEx/AudDlg.h b/StarsEx/AudDlg.h index 35658f0..88ed35c 100644 --- a/StarsEx/AudDlg.h +++ b/StarsEx/AudDlg.h @@ -62,6 +62,10 @@ protected: Slider* menu_music_slider; Slider* game_music_slider; + Slider* master_volume_slider; + Slider* music_volume_slider; + Slider* world_volume_slider; + Button* aud_btn; Button* vid_btn; Button* opt_btn; diff --git a/StarsEx/AudioConfig.cpp b/StarsEx/AudioConfig.cpp index 8d4d74a..b025c41 100644 --- a/StarsEx/AudioConfig.cpp +++ b/StarsEx/AudioConfig.cpp @@ -13,6 +13,8 @@ #include "AudioConfig.h" +#include <algorithm> + #include "DataLoader.h" #include "ParseUtil.h" #include "Button.h" @@ -20,27 +22,30 @@ // +--------------------------------------------------------------------+ -static AudioConfig* audio_config = 0; +static AudioConfig* audio_config = nullptr; // +--------------------------------------------------------------------+ -AudioConfig::AudioConfig() - : menu_music(90), - game_music(90), - efx_volume(90), - gui_volume(90), - wrn_volume(90), - vox_volume(90), - training(false) +AudioConfig::AudioConfig() : + master_volume(100), + music_volume(100), + world_volume(100), + menu_music(80), + game_music(80), + efx_volume(80), + gui_volume(80), + wrn_volume(80), + vox_volume(80), + training(false) { if (!audio_config) - audio_config = this; + audio_config = this; } AudioConfig::~AudioConfig() { if (audio_config == this) - audio_config = 0; + audio_config = nullptr; } // +--------------------------------------------------------------------+ @@ -50,14 +55,14 @@ AudioConfig::Initialize() { audio_config = new AudioConfig; if (audio_config) - audio_config->Load(); + audio_config->Load(); } void AudioConfig::Close() { delete audio_config; - audio_config = 0; + audio_config = nullptr; } AudioConfig* @@ -68,12 +73,19 @@ AudioConfig::GetInstance() // +--------------------------------------------------------------------+ +static constexpr +int +denormalize(const double& v) +{ + return -50 * (100.0 - v); +} + int AudioConfig::MenuMusic() { if (audio_config) - return -50 * (100 - audio_config->menu_music); - + return denormalize( + audio_config->menu_music * (audio_config->music_volume / 100.0) * (audio_config->master_volume / 100.0)); return 0; } @@ -83,7 +95,8 @@ AudioConfig::GameMusic() int vol = 0; if (audio_config) { - vol = -50 * (100 - audio_config->game_music); + vol = denormalize( + audio_config->game_music * (audio_config->music_volume / 100.0) * (audio_config->master_volume / 100.0)); if (audio_config->training) vol -= 2000; @@ -98,7 +111,8 @@ AudioConfig::EfxVolume() int vol = 0; if (audio_config) { - vol = -50 * (100 - audio_config->efx_volume); + vol = denormalize( + audio_config->efx_volume * (audio_config->world_volume / 100.0) * (audio_config->master_volume / 100.0)); if (audio_config->training) vol -= 2000; @@ -111,8 +125,7 @@ int AudioConfig::GuiVolume() { if (audio_config) - return -50 * (100 - audio_config->gui_volume); - + return denormalize(audio_config->gui_volume * (audio_config->master_volume / 100.0)); return 0; } @@ -122,7 +135,8 @@ AudioConfig::WrnVolume() int vol = 0; if (audio_config) { - vol = -50 * (100 - audio_config->wrn_volume); + vol = denormalize( + audio_config->wrn_volume * (audio_config->world_volume / 100.0) * (audio_config->master_volume / 100.0)); if (audio_config->training) vol -= 2000; @@ -137,7 +151,8 @@ AudioConfig::VoxVolume() int vol = 0; if (audio_config) { - vol = -50 * (100 - audio_config->vox_volume); + vol = denormalize( + audio_config->vox_volume * (audio_config->world_volume / 100.0) * (audio_config->master_volume / 100.0)); if (audio_config->training && vol < -750) vol = -750; @@ -162,59 +177,59 @@ AudioConfig::SetTraining(bool t) // +--------------------------------------------------------------------+ void -AudioConfig::SetMenuMusic(int v) +AudioConfig::SetMasterVolume(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; + master_volume = std::clamp(v, 0, 100); + Button::SetVolume(GuiVolume()); +} - menu_music = v; +void +AudioConfig::SetMusicVolume(int v) +{ + music_volume = std::clamp(v, 0, 100); } void -AudioConfig::SetGameMusic(int v) +AudioConfig::SetWorldVolume(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; + world_volume = std::clamp(v, 0, 100); +} - game_music = v; +void +AudioConfig::SetMenuMusic(int v) +{ + menu_music = std::clamp(v, 0, 100); } void -AudioConfig::SetEfxVolume(int v) +AudioConfig::SetGameMusic(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; + game_music = std::clamp(v, 0, 100); +} - efx_volume = v; +void +AudioConfig::SetEfxVolume(int v) +{ + efx_volume = std::clamp(v, 0, 100); } void AudioConfig::SetGuiVolume(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; - - gui_volume = v; - Button::SetVolume(-50 * (100 - gui_volume)); + gui_volume = std::clamp(v, 0, 100); + Button::SetVolume(GuiVolume()); } void AudioConfig::SetWrnVolume(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; - - wrn_volume = v; - Button::SetVolume(-50 * (100 - wrn_volume)); + wrn_volume = std::clamp(v, 0, 100); } void AudioConfig::SetVoxVolume(int v) { - if (v < 0) v = 0; - else if (v > 100) v = 100; - - vox_volume = v; + vox_volume = std::clamp(v, 0, 100); } // +--------------------------------------------------------------------+ @@ -274,72 +289,49 @@ AudioConfig::Load() TermDef* def = term->isDef(); if (def) { - if (def->name()->value() == "menu_music") { + if (def->name()->value() == "master_volume") { GetDefNumber(v, def, filename); + SetMasterVolume(v); + } - if (v < 0 || v > 100) { - Print("WARNING: Invalid menu_music (%d) in '%s'\n", v, filename); - } - else { - menu_music = v; - } + if (def->name()->value() == "music_volume") { + GetDefNumber(v, def, filename); + SetMusicVolume(v); } - else if (def->name()->value() == "game_music") { + if (def->name()->value() == "world_volume") { + GetDefNumber(v, def, filename); + SetWorldVolume(v); + } + + if (def->name()->value() == "menu_music") { GetDefNumber(v, def, filename); + SetMenuMusic(v); + } - if (v < 0 || v > 100) { - Print("WARNING: Invalid game_music (%d) in '%s'\n", v, filename); - } - else { - game_music = v; - } + else if (def->name()->value() == "game_music") { + GetDefNumber(v, def, filename); + SetGameMusic(v); } else if (def->name()->value() == "efx_volume") { GetDefNumber(v, def, filename); - - if (v < 0 || v > 100) { - Print("WARNING: Invalid efx_volume (%d) in '%s'\n", v, filename); - } - else { - efx_volume = v; - } + SetEfxVolume(v); } else if (def->name()->value() == "gui_volume") { GetDefNumber(v, def, filename); - - if (v < 0 || v > 100) { - Print("WARNING: Invalid gui_volume (%d) in '%s'\n", v, filename); - } - else { - gui_volume = v; - - Button::SetVolume(-50 * (100 - gui_volume)); - } + SetGuiVolume(v); } else if (def->name()->value() == "wrn_volume") { GetDefNumber(v, def, filename); - - if (v < 0 || v > 100) { - Print("WARNING: Invalid wrn_volume (%d) in '%s'\n", v, filename); - } - else { - wrn_volume = v; - } + SetWrnVolume(v); } else if (def->name()->value() == "vox_volume") { GetDefNumber(v, def, filename); - - if (v < 0 || v > 100) { - Print("WARNING: Invalid vox_volume (%d) in '%s'\n", v, filename); - } - else { - vox_volume = v; - } + SetVoxVolume(v); } else @@ -366,6 +358,9 @@ AudioConfig::Save() fopen_s(&f, "audio.cfg", "wb"); if (f) { fprintf(f, "AUDIO\n\n"); + fprintf(f, "master_volume: %3d\n", master_volume); + fprintf(f, "music_volume: %3d\n", music_volume); + fprintf(f, "world_volume: %3d\n\n", world_volume); fprintf(f, "menu_music: %3d\n", menu_music); fprintf(f, "game_music: %3d\n\n", game_music); fprintf(f, "efx_volume: %3d\n", efx_volume); diff --git a/StarsEx/AudioConfig.h b/StarsEx/AudioConfig.h index f721592..1f01868 100644 --- a/StarsEx/AudioConfig.h +++ b/StarsEx/AudioConfig.h @@ -40,6 +40,9 @@ public: static int Silence(); static void SetTraining(bool t); + int GetMasterVolume() const { return master_volume; } + int GetMusicVolume() const { return music_volume; } + int GetWorldVolume() const { return world_volume; } int GetMenuMusic() const { return menu_music; } int GetGameMusic() const { return game_music; } int GetEfxVolume() const { return efx_volume; } @@ -47,6 +50,9 @@ public: int GetWrnVolume() const { return wrn_volume; } int GetVoxVolume() const { return vox_volume; } + void SetMasterVolume(int v); + void SetMusicVolume(int v); + void SetWorldVolume(int v); void SetMenuMusic(int v); void SetGameMusic(int v); void SetEfxVolume(int v); @@ -55,6 +61,10 @@ public: void SetVoxVolume(int v); protected: + int master_volume; + int music_volume; + int world_volume; + int menu_music; int game_music; diff --git a/StarsEx/test/AudioConfig.cpp b/StarsEx/test/AudioConfig.cpp index f6a05d4..8de3b68 100644 --- a/StarsEx/test/AudioConfig.cpp +++ b/StarsEx/test/AudioConfig.cpp @@ -9,8 +9,18 @@ TEST(StarsEx, AudioConfig) ASSERT_EQ(&audio, AudioConfig::GetInstance()); audio.SetMenuMusic(100); ASSERT_EQ(0, AudioConfig::MenuMusic()); - audio.SetMenuMusic(50); + audio.SetMasterVolume(50); ASSERT_EQ(-2500, AudioConfig::MenuMusic()); + audio.SetMusicVolume(50); + ASSERT_EQ(-3750, AudioConfig::MenuMusic()); audio.SetMenuMusic(0); ASSERT_EQ(-5000, AudioConfig::MenuMusic()); + audio.SetEfxVolume(100); + ASSERT_EQ(-2500, AudioConfig::EfxVolume()); + audio.SetMasterVolume(100); + ASSERT_EQ(0, AudioConfig::EfxVolume()); + audio.SetWorldVolume(20); + ASSERT_EQ(-4000, AudioConfig::EfxVolume()); + audio.SetEfxVolume(50); + ASSERT_EQ(-4500, AudioConfig::EfxVolume()); } |