Kelsidavis-WoWee/src/audio/ui_sound_manager.cpp
Kelsi 9741c8ee7c Implement comprehensive audio control panel with tabbed settings interface
Adds complete audio volume controls for all 11 audio systems with master volume. Reorganizes settings window into Video, Audio, and Gameplay tabs for better UX.

Audio Features:
- Master volume control affecting all audio systems
- Individual volume sliders for: Music, Ambient, UI, Combat, Spell, Movement, Footsteps, NPC Voices, Mounts, Activity sounds
- Real-time volume adjustment with master volume multiplier
- Restore defaults button per tab

Technical Changes:
- Added getVolumeScale() getters to all audio managers
- Integrated all 10 audio managers into renderer (UI, Combat, Spell, Movement added)
- Expanded game_screen.hpp with 11 pending volume variables
- Reorganized settings window using ImGui tab bars (Video/Audio/Gameplay)
- Audio settings uses scrollable child window for 11 volume controls
- Settings window expanded to 520x720px to accommodate comprehensive controls
2026-02-09 17:07:22 -08:00

219 lines
9.6 KiB
C++

#include "audio/ui_sound_manager.hpp"
#include "audio/audio_engine.hpp"
#include "pipeline/asset_manager.hpp"
#include "core/logger.hpp"
namespace wowee {
namespace audio {
bool UiSoundManager::initialize(pipeline::AssetManager* assets) {
if (!assets) {
LOG_ERROR("UISoundManager: AssetManager is null");
return false;
}
LOG_INFO("UISoundManager: Initializing...");
// Load window sounds
bagOpenSounds_.resize(1);
bool bagOpenLoaded = loadSound("Sound\\Interface\\iBackPackOpen.wav", bagOpenSounds_[0], assets);
bagCloseSounds_.resize(1);
bool bagCloseLoaded = loadSound("Sound\\Interface\\iBackPackClose.wav", bagCloseSounds_[0], assets);
questLogOpenSounds_.resize(1);
bool questLogOpenLoaded = loadSound("Sound\\Interface\\iQuestLogOpenA.wav", questLogOpenSounds_[0], assets);
questLogCloseSounds_.resize(1);
bool questLogCloseLoaded = loadSound("Sound\\Interface\\iQuestLogCloseA.wav", questLogCloseSounds_[0], assets);
characterSheetOpenSounds_.resize(1);
bool charSheetOpenLoaded = loadSound("Sound\\Interface\\iAbilitiesOpenA.wav", characterSheetOpenSounds_[0], assets);
characterSheetCloseSounds_.resize(1);
bool charSheetCloseLoaded = loadSound("Sound\\Interface\\iAbilitiesCloseA.wav", characterSheetCloseSounds_[0], assets);
auctionOpenSounds_.resize(1);
bool auctionOpenLoaded = loadSound("Sound\\Interface\\AuctionWindowOpen.wav", auctionOpenSounds_[0], assets);
auctionCloseSounds_.resize(1);
bool auctionCloseLoaded = loadSound("Sound\\Interface\\AuctionWindowClose.wav", auctionCloseSounds_[0], assets);
guildBankOpenSounds_.resize(1);
bool guildBankOpenLoaded = loadSound("Sound\\Interface\\GuildVaultOpen.wav", guildBankOpenSounds_[0], assets);
guildBankCloseSounds_.resize(1);
bool guildBankCloseLoaded = loadSound("Sound\\Interface\\GuildVaultClose.wav", guildBankCloseSounds_[0], assets);
// Load button sounds
buttonClickSounds_.resize(1);
bool buttonClickLoaded = loadSound("Sound\\Interface\\iUiInterfaceButtonA.wav", buttonClickSounds_[0], assets);
menuButtonSounds_.resize(1);
bool menuButtonLoaded = loadSound("Sound\\Interface\\iUIMainMenuButtonA.wav", menuButtonSounds_[0], assets);
// Load quest sounds
questActivateSounds_.resize(1);
bool questActivateLoaded = loadSound("Sound\\Interface\\iQuestActivate.wav", questActivateSounds_[0], assets);
questCompleteSounds_.resize(1);
bool questCompleteLoaded = loadSound("Sound\\Interface\\iQuestComplete.wav", questCompleteSounds_[0], assets);
questFailedSounds_.resize(1);
bool questFailedLoaded = loadSound("Sound\\Interface\\igQuestFailed.wav", questFailedSounds_[0], assets);
questUpdateSounds_.resize(1);
bool questUpdateLoaded = loadSound("Sound\\Interface\\iQuestUpdate.wav", questUpdateSounds_[0], assets);
// Load loot sounds
lootCoinSmallSounds_.resize(1);
bool lootCoinSmallLoaded = loadSound("Sound\\Interface\\LootCoinSmall.wav", lootCoinSmallSounds_[0], assets);
lootCoinLargeSounds_.resize(1);
bool lootCoinLargeLoaded = loadSound("Sound\\Interface\\LootCoinLarge.wav", lootCoinLargeSounds_[0], assets);
lootItemSounds_.resize(1);
bool lootItemLoaded = loadSound("Sound\\Interface\\igLootCreature.wav", lootItemSounds_[0], assets);
// Load item pickup sounds
dropSounds_.resize(1);
bool dropLoaded = loadSound("Sound\\Interface\\DropOnGround.wav", dropSounds_[0], assets);
pickupBagSounds_.resize(1);
bool pickupBagLoaded = loadSound("Sound\\Interface\\PickUp\\PickUpBag.wav", pickupBagSounds_[0], assets);
pickupBookSounds_.resize(1);
bool pickupBookLoaded = loadSound("Sound\\Interface\\PickUp\\PickUpBook.wav", pickupBookSounds_[0], assets);
pickupClothSounds_.resize(1);
bool pickupClothLoaded = loadSound("Sound\\Interface\\PickUp\\PickUpCloth_Leather01.wav", pickupClothSounds_[0], assets);
pickupFoodSounds_.resize(1);
bool pickupFoodLoaded = loadSound("Sound\\Interface\\PickUp\\PickUpFoodGeneric.wav", pickupFoodSounds_[0], assets);
pickupGemSounds_.resize(1);
bool pickupGemLoaded = loadSound("Sound\\Interface\\PickUp\\PickUpGems.wav", pickupGemSounds_[0], assets);
// Load eating/drinking sounds
eatingSounds_.resize(1);
bool eatingLoaded = loadSound("Sound\\Interface\\iEating1.wav", eatingSounds_[0], assets);
drinkingSounds_.resize(1);
bool drinkingLoaded = loadSound("Sound\\Interface\\iDrinking1.wav", drinkingSounds_[0], assets);
// Load level up sound
levelUpSounds_.resize(1);
bool levelUpLoaded = loadSound("Sound\\Interface\\LevelUp.wav", levelUpSounds_[0], assets);
// Load error/feedback sounds
errorSounds_.resize(1);
bool errorLoaded = loadSound("Sound\\Interface\\Error.wav", errorSounds_[0], assets);
selectTargetSounds_.resize(1);
bool selectTargetLoaded = loadSound("Sound\\Interface\\iSelectTarget.wav", selectTargetSounds_[0], assets);
deselectTargetSounds_.resize(1);
bool deselectTargetLoaded = loadSound("Sound\\Interface\\iDeselectTarget.wav", deselectTargetSounds_[0], assets);
LOG_INFO("UISoundManager: Window sounds - Bag: ", (bagOpenLoaded && bagCloseLoaded) ? "YES" : "NO",
", QuestLog: ", (questLogOpenLoaded && questLogCloseLoaded) ? "YES" : "NO",
", CharSheet: ", (charSheetOpenLoaded && charSheetCloseLoaded) ? "YES" : "NO");
LOG_INFO("UISoundManager: Button sounds - Click: ", buttonClickLoaded ? "YES" : "NO",
", Menu: ", menuButtonLoaded ? "YES" : "NO");
LOG_INFO("UISoundManager: Quest sounds - Activate: ", questActivateLoaded ? "YES" : "NO",
", Complete: ", questCompleteLoaded ? "YES" : "NO",
", Failed: ", questFailedLoaded ? "YES" : "NO");
LOG_INFO("UISoundManager: Loot sounds - Coins: ", (lootCoinSmallLoaded && lootCoinLargeLoaded) ? "YES" : "NO",
", Items: ", lootItemLoaded ? "YES" : "NO");
LOG_INFO("UISoundManager: Item sounds - Pickup: ", (pickupBagLoaded && pickupBookLoaded) ? "YES" : "NO",
", Drop: ", dropLoaded ? "YES" : "NO");
LOG_INFO("UISoundManager: Misc sounds - Eating: ", eatingLoaded ? "YES" : "NO",
", Drinking: ", drinkingLoaded ? "YES" : "NO",
", LevelUp: ", levelUpLoaded ? "YES" : "NO");
initialized_ = true;
LOG_INFO("UISoundManager: Initialization complete");
return true;
}
void UiSoundManager::shutdown() {
initialized_ = false;
}
bool UiSoundManager::loadSound(const std::string& path, UISample& sample, pipeline::AssetManager* assets) {
sample.path = path;
sample.loaded = false;
try {
sample.data = assets->readFile(path);
if (!sample.data.empty()) {
sample.loaded = true;
return true;
}
} catch (const std::exception& e) {
LOG_ERROR("UISoundManager: Failed to load ", path, ": ", e.what());
}
return false;
}
void UiSoundManager::playSound(const std::vector<UISample>& library) {
if (!initialized_ || library.empty() || !library[0].loaded) return;
float volume = 0.7f * volumeScale_;
AudioEngine::instance().playSound2D(library[0].data, volume, 1.0f);
}
void UiSoundManager::setVolumeScale(float scale) {
volumeScale_ = std::max(0.0f, std::min(1.0f, scale));
}
// Window sounds
void UiSoundManager::playBagOpen() { playSound(bagOpenSounds_); }
void UiSoundManager::playBagClose() { playSound(bagCloseSounds_); }
void UiSoundManager::playQuestLogOpen() { playSound(questLogOpenSounds_); }
void UiSoundManager::playQuestLogClose() { playSound(questLogCloseSounds_); }
void UiSoundManager::playCharacterSheetOpen() { playSound(characterSheetOpenSounds_); }
void UiSoundManager::playCharacterSheetClose() { playSound(characterSheetCloseSounds_); }
void UiSoundManager::playAuctionHouseOpen() { playSound(auctionOpenSounds_); }
void UiSoundManager::playAuctionHouseClose() { playSound(auctionCloseSounds_); }
void UiSoundManager::playGuildBankOpen() { playSound(guildBankOpenSounds_); }
void UiSoundManager::playGuildBankClose() { playSound(guildBankCloseSounds_); }
// Button sounds
void UiSoundManager::playButtonClick() { playSound(buttonClickSounds_); }
void UiSoundManager::playMenuButtonClick() { playSound(menuButtonSounds_); }
// Quest sounds
void UiSoundManager::playQuestActivate() { playSound(questActivateSounds_); }
void UiSoundManager::playQuestComplete() { playSound(questCompleteSounds_); }
void UiSoundManager::playQuestFailed() { playSound(questFailedSounds_); }
void UiSoundManager::playQuestUpdate() { playSound(questUpdateSounds_); }
// Loot sounds
void UiSoundManager::playLootCoinSmall() { playSound(lootCoinSmallSounds_); }
void UiSoundManager::playLootCoinLarge() { playSound(lootCoinLargeSounds_); }
void UiSoundManager::playLootItem() { playSound(lootItemSounds_); }
// Item sounds
void UiSoundManager::playDropOnGround() { playSound(dropSounds_); }
void UiSoundManager::playPickupBag() { playSound(pickupBagSounds_); }
void UiSoundManager::playPickupBook() { playSound(pickupBookSounds_); }
void UiSoundManager::playPickupCloth() { playSound(pickupClothSounds_); }
void UiSoundManager::playPickupFood() { playSound(pickupFoodSounds_); }
void UiSoundManager::playPickupGem() { playSound(pickupGemSounds_); }
// Eating/drinking
void UiSoundManager::playEating() { playSound(eatingSounds_); }
void UiSoundManager::playDrinking() { playSound(drinkingSounds_); }
// Level up
void UiSoundManager::playLevelUp() { playSound(levelUpSounds_); }
// Error/feedback
void UiSoundManager::playError() { playSound(errorSounds_); }
void UiSoundManager::playTargetSelect() { playSound(selectTargetSounds_); }
void UiSoundManager::playTargetDeselect() { playSound(deselectTargetSounds_); }
} // namespace audio
} // namespace wowee