From c998c945bf22f16f3deb35328ec14a1438263df7 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Tue, 17 Feb 2026 18:52:19 -0800 Subject: [PATCH] Implement MPQ-path sound loading in AudioEngine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add AssetManager hookup to AudioEngine so the path-based playSound2D/3D overloads can load files on demand rather than requiring preloading. - Add setAssetManager() to AudioEngine (called during world load alongside other audio manager initializations) - playSound2D(mpqPath) now calls assetManager->readFile() then delegates to the vector overload (removes the "not yet implemented" warning) - playSound3D(mpqPath, position) same — delegates to the fully spatialized vector overload (was previously silently falling back to 2D) --- include/audio/audio_engine.hpp | 6 ++++++ src/audio/audio_engine.cpp | 27 +++++++++++++++++++++------ src/rendering/renderer.cpp | 1 + 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/audio/audio_engine.hpp b/include/audio/audio_engine.hpp index 0eb07a19..20015330 100644 --- a/include/audio/audio_engine.hpp +++ b/include/audio/audio_engine.hpp @@ -11,6 +11,7 @@ struct ma_engine; struct ma_sound; namespace wowee { +namespace pipeline { class AssetManager; } namespace audio { /** @@ -32,6 +33,9 @@ public: void setMasterVolume(float volume); float getMasterVolume() const { return masterVolume_; } + // Asset manager (enables sound loading by MPQ path) + void setAssetManager(pipeline::AssetManager* am) { assetManager_ = am; } + // 3D listener position (for positional audio) void setListenerPosition(const glm::vec3& position); void setListenerOrientation(const glm::vec3& forward, const glm::vec3& up); @@ -81,6 +85,8 @@ private: glm::vec3 listenerForward_{0.0f, 0.0f, -1.0f}; glm::vec3 listenerUp_{0.0f, 1.0f, 0.0f}; + pipeline::AssetManager* assetManager_ = nullptr; + // miniaudio engine (opaque pointer) ma_engine* engine_ = nullptr; }; diff --git a/src/audio/audio_engine.cpp b/src/audio/audio_engine.cpp index edd60f59..0acebc98 100644 --- a/src/audio/audio_engine.cpp +++ b/src/audio/audio_engine.cpp @@ -3,6 +3,7 @@ #include "core/logger.hpp" #include "pipeline/asset_manager.hpp" + #include "../../extern/miniaudio.h" #include @@ -285,10 +286,16 @@ bool AudioEngine::playSound2D(const std::vector& wavData, float volume, } bool AudioEngine::playSound2D(const std::string& mpqPath, float volume, float pitch) { - // TODO: Load from AssetManager - // For now, return false (not implemented) - LOG_WARNING("AudioEngine::playSound2D from MPQ path not yet implemented"); - return false; + if (!assetManager_) { + LOG_WARNING("AudioEngine::playSound2D(path): no AssetManager set"); + return false; + } + auto data = assetManager_->readFile(mpqPath); + if (data.empty()) { + LOG_WARNING("AudioEngine::playSound2D: failed to load '", mpqPath, "'"); + return false; + } + return playSound2D(data, volume, pitch); } bool AudioEngine::playSound3D(const std::vector& wavData, const glm::vec3& position, @@ -367,8 +374,16 @@ bool AudioEngine::playSound3D(const std::vector& wavData, const glm::ve bool AudioEngine::playSound3D(const std::string& mpqPath, const glm::vec3& position, float volume, float pitch, float maxDistance) { - // TODO: Implement 3D positional audio - return playSound2D(mpqPath, volume, pitch); + if (!assetManager_) { + LOG_WARNING("AudioEngine::playSound3D(path): no AssetManager set"); + return false; + } + auto data = assetManager_->readFile(mpqPath); + if (data.empty()) { + LOG_WARNING("AudioEngine::playSound3D: failed to load '", mpqPath, "'"); + return false; + } + return playSound3D(data, position, volume, pitch, maxDistance); } bool AudioEngine::playMusic(const std::vector& musicData, float volume, bool loop) { diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 9d54e8cc..63518232 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -3016,6 +3016,7 @@ bool Renderer::loadTestTerrain(pipeline::AssetManager* assetManager, const std:: // Initialize music manager with asset manager if (musicManager && assetManager && !cachedAssetManager) { + audio::AudioEngine::instance().setAssetManager(assetManager); musicManager->initialize(assetManager); if (footstepManager) { footstepManager->initialize(assetManager);