summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/AudioConfig.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2024-03-08 00:09:56 +0100
committerAki <please@ignore.pl>2024-03-08 00:21:55 +0100
commitc45d494472bf0b812c0cf9d57e00ef75e7c155d0 (patch)
tree9b2dedc2f4a659a9ac40d631118d5edd05934d8a /StarsEx/AudioConfig.cpp
parentb995b5de7ee3cccfdf93bc4ed4a56143a6463947 (diff)
downloadstarshatter-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/AudioConfig.cpp')
-rw-r--r--StarsEx/AudioConfig.cpp177
1 files changed, 86 insertions, 91 deletions
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);