#pragma once #include #include #include #include #include #include namespace frostbite2D { struct MapAudioTrack { std::string id; std::string path; }; struct MapAudioState { std::optional bgmTrack; std::vector ambientLoops; }; class MapAudioController { public: static MapAudioController& get(); void ApplyMapAudio(const MapAudioState& state); void ClearMapAudio(); private: struct ActiveAmbientLoop { MapAudioTrack track; RefPtr sound; int channel = -1; }; MapAudioController() = default; void ApplyBgmTrack(const std::optional& bgmTrack); void ApplyAmbientLoops(const std::vector& ambientLoops); void StopAmbientLoop(ActiveAmbientLoop& loop); static std::string NormalizeTrackKey(const MapAudioTrack& track); std::optional currentBgmTrack_; RefPtr currentBgmMusic_; std::unordered_map activeAmbientLoops_; }; } // namespace frostbite2D