Separate out GamePreviewVolume from UIVolume

Fixes issue #20651
This commit is contained in:
Henrik Rydgård
2025-07-20 09:55:56 +02:00
parent 5db95efbcf
commit a7196af1f6
5 changed files with 28 additions and 16 deletions
+6
View File
@@ -769,6 +769,11 @@ static int DefaultAchievementVolume() {
return MultiplierToVolume100((float)g_Config.iLegacyAchievementVolume / 10.0f);
}
static int DefaultGamePreviewVolume() {
// This was previously controlled by the UI volume, so transfer the default value over.
return g_Config.iUIVolume;
}
static const ConfigSetting soundSettings[] = {
ConfigSetting("Enable", &g_Config.bEnableSound, true, CfgFlag::PER_GAME),
ConfigSetting("ExtraAudioBuffering", &g_Config.bExtraAudioBuffering, false, CfgFlag::DEFAULT),
@@ -786,6 +791,7 @@ static const ConfigSetting soundSettings[] = {
ConfigSetting("AltSpeedRelativeVolume", &g_Config.iAltSpeedVolume, VOLUMEHI_FULL, CfgFlag::PER_GAME),
ConfigSetting("AchievementVolume", &g_Config.iAchievementVolume, &DefaultAchievementVolume, CfgFlag::PER_GAME),
ConfigSetting("UIVolume", &g_Config.iUIVolume, 75, CfgFlag::DEFAULT),
ConfigSetting("GamePreviewVolume", &g_Config.iGamePreviewVolume, &DefaultGamePreviewVolume, CfgFlag::DEFAULT),
ConfigSetting("AudioDevice", &g_Config.sAudioDevice, "", CfgFlag::DEFAULT),
ConfigSetting("AutoAudioDevice", &g_Config.bAutoAudioDevice, true, CfgFlag::DEFAULT),
+1
View File
@@ -298,6 +298,7 @@ public:
int iGameVolume;
int iReverbVolume;
int iUIVolume;
int iGamePreviewVolume; // Volume for the game preview sound in the game grid.
int iAchievementVolume;
int iAltSpeedVolume;
+14 -14
View File
@@ -273,19 +273,19 @@ private:
BackgroundAudio g_BackgroundAudio;
BackgroundAudio::BackgroundAudio() {
buffer = new int[BUFSIZE]();
buffer_ = new int[BUFSIZE]();
sndLoadPending_.store(false);
}
BackgroundAudio::~BackgroundAudio() {
delete at3Reader_;
delete[] buffer;
delete[] buffer_;
}
void BackgroundAudio::Clear(bool hard) {
if (!hard) {
fadingOut_ = true;
volume_ = 1.0f;
volumeFader_ = 1.0f;
return;
}
if (at3Reader_) {
@@ -313,7 +313,7 @@ void BackgroundAudio::SetGame(const Path &path) {
sndLoadPending_ = true;
fadingOut_ = false;
}
volume_ = 1.0f;
volumeFader_ = 1.0f;
bgGamePath_ = path;
}
@@ -335,30 +335,30 @@ bool BackgroundAudio::Play() {
sz = std::min(BUFSIZE / 2, sz);
if (at3Reader_) {
if (at3Reader_->Read(buffer, sz)) {
if (at3Reader_->Read(buffer_, sz)) {
if (fadingOut_) {
float vol = volume_;
float vol = volumeFader_;
// TODO: This isn't optimized. But hardly matters...
for (int i = 0; i < sz * 2; i += 2) {
const float v = vol;
buffer[i] = (int)((float)buffer[i] * v);
buffer[i + 1] = (int)((float)buffer[i + 1] * v);
buffer_[i] = (int)((float)buffer_[i] * v);
buffer_[i + 1] = (int)((float)buffer_[i + 1] * v);
vol += delta_;
}
volume_ = vol;
volumeFader_ = vol;
}
}
} else {
for (int i = 0; i < sz * 2; i += 2) {
buffer[i] = 0;
buffer[i + 1] = 0;
buffer_[i] = 0;
buffer_[i + 1] = 0;
}
}
float multiplier = Volume100ToMultiplier(g_Config.iUIVolume);
System_AudioPushSamples(buffer, sz, multiplier);
float multiplier = Volume100ToMultiplier(g_Config.iGamePreviewVolume);
System_AudioPushSamples(buffer_, sz, multiplier);
if (at3Reader_ && fadingOut_ && volume_ <= 0.0f) {
if (at3Reader_ && fadingOut_ && volumeFader_ <= 0.0f) {
Clear(true);
fadingOut_ = false;
gameLastChanged_ = 0;
+2 -2
View File
@@ -79,9 +79,9 @@ private:
AT3PlusReader *at3Reader_ = nullptr;
double gameLastChanged_ = 0.0;
double lastPlaybackTime_ = 0.0;
int *buffer = nullptr;
int *buffer_ = nullptr;
bool fadingOut_ = true;
float volume_ = 0.0f;
float volumeFader_ = 0.0f;
float delta_ = -0.0001f;
SoundEffectMixer sfxMixer_;
};
+5
View File
@@ -677,6 +677,11 @@ void GameSettingsScreen::CreateAudioSettings(UI::ViewGroup *audioSettings) {
return UI::EVENT_DONE;
});
PopupSliderChoice *gamePreviewVolume = audioSettings->Add(new PopupSliderChoice(&g_Config.iGamePreviewVolume, VOLUME_OFF, VOLUMEHI_FULL, NO_DEFAULT_INT, a->T("Game preview volume"), screenManager()));
gamePreviewVolume->SetFormat("%d%%");
gamePreviewVolume->SetEnabledPtr(&g_Config.bEnableSound);
gamePreviewVolume->SetZeroLabel(a->T("Mute"));
bool sdlAudio = false;
#if defined(SDL)