diff options
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()); } |