From b441452dcba666c57c2d92a9b933e2ab1bdbcb09 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Tue, 17 Feb 2026 17:37:20 -0800 Subject: [PATCH] Fix audio volume settings: apply saved values on startup, don't overwrite with audio manager defaults --- include/ui/game_screen.hpp | 1 + src/ui/game_screen.cpp | 71 +++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/include/ui/game_screen.hpp b/include/ui/game_screen.hpp index 0a9b056a..aae34324 100644 --- a/include/ui/game_screen.hpp +++ b/include/ui/game_screen.hpp @@ -105,6 +105,7 @@ private: bool minimapRotate_ = false; bool minimapSquare_ = false; bool minimapSettingsApplied_ = false; + bool volumeSettingsApplied_ = false; // True once saved volume settings applied to audio managers // Mute state: mute bypasses master volume without touching slider values bool soundMuted_ = false; diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index 6880bc3d..0e9e621c 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -216,6 +216,45 @@ void GameScreen::render(game::GameHandler& gameHandler) { } } + // Apply saved volume settings once when audio managers first become available + if (!volumeSettingsApplied_) { + auto* renderer = core::Application::getInstance().getRenderer(); + if (renderer && renderer->getUiSoundManager()) { + float masterScale = static_cast(pendingMasterVolume) / 100.0f; + if (auto* music = renderer->getMusicManager()) { + music->setVolume(static_cast(pendingMusicVolume * masterScale)); + } + if (auto* ambient = renderer->getAmbientSoundManager()) { + ambient->setVolumeScale(pendingAmbientVolume / 100.0f * masterScale); + } + if (auto* ui = renderer->getUiSoundManager()) { + ui->setVolumeScale(pendingUiVolume / 100.0f * masterScale); + } + if (auto* combat = renderer->getCombatSoundManager()) { + combat->setVolumeScale(pendingCombatVolume / 100.0f * masterScale); + } + if (auto* spell = renderer->getSpellSoundManager()) { + spell->setVolumeScale(pendingSpellVolume / 100.0f * masterScale); + } + if (auto* movement = renderer->getMovementSoundManager()) { + movement->setVolumeScale(pendingMovementVolume / 100.0f * masterScale); + } + if (auto* footstep = renderer->getFootstepManager()) { + footstep->setVolumeScale(pendingFootstepVolume / 100.0f * masterScale); + } + if (auto* npcVoice = renderer->getNpcVoiceManager()) { + npcVoice->setVolumeScale(pendingNpcVoiceVolume / 100.0f * masterScale); + } + if (auto* mount = renderer->getMountSoundManager()) { + mount->setVolumeScale(pendingMountVolume / 100.0f * masterScale); + } + if (auto* activity = renderer->getActivitySoundManager()) { + activity->setVolumeScale(pendingActivityVolume / 100.0f * masterScale); + } + volumeSettingsApplied_ = true; + } + } + // Apply auto-loot setting to GameHandler every frame (cheap bool sync) gameHandler.setAutoLoot(pendingAutoLoot); @@ -5388,37 +5427,7 @@ void GameScreen::renderSettingsWindow() { pendingVsync = window->isVsyncEnabled(); pendingShadows = renderer ? renderer->areShadowsEnabled() : true; if (renderer) { - // Load volumes from all audio managers - if (auto* music = renderer->getMusicManager()) { - pendingMusicVolume = music->getVolume(); - } - if (auto* ambient = renderer->getAmbientSoundManager()) { - pendingAmbientVolume = static_cast(ambient->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* ui = renderer->getUiSoundManager()) { - pendingUiVolume = static_cast(ui->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* combat = renderer->getCombatSoundManager()) { - pendingCombatVolume = static_cast(combat->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* spell = renderer->getSpellSoundManager()) { - pendingSpellVolume = static_cast(spell->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* movement = renderer->getMovementSoundManager()) { - pendingMovementVolume = static_cast(movement->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* footstep = renderer->getFootstepManager()) { - pendingFootstepVolume = static_cast(footstep->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* npcVoice = renderer->getNpcVoiceManager()) { - pendingNpcVoiceVolume = static_cast(npcVoice->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* mount = renderer->getMountSoundManager()) { - pendingMountVolume = static_cast(mount->getVolumeScale() * 100.0f + 0.5f); - } - if (auto* activity = renderer->getActivitySoundManager()) { - pendingActivityVolume = static_cast(activity->getVolumeScale() * 100.0f + 0.5f); - } + // Read non-volume settings from actual state (volumes come from saved settings) if (auto* cameraController = renderer->getCameraController()) { pendingMouseSensitivity = cameraController->getMouseSensitivity(); pendingInvertMouse = cameraController->isInvertMouse();