#pragma once #include "Runtime/CToken.hpp" #include "Runtime/GCNTypes.hpp" #include "Runtime/RetroTypes.hpp" #include #include #include namespace metaforce { class CAudioGroupSet; class CSimplePool; CFactoryFnReturn FAudioTranslationTableFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& vparms, CObjectReference* selfRef); class CAudioSys { public: enum class ESurroundModes { Mono, Stereo, Surround }; private: static CAudioSys* g_SharedSys; boo::IAudioVoiceEngine* m_voiceEngine; amuse::Engine m_engine; static void _UpdateVolume(); public: struct C3DEmitterParmData { zeus::CVector3f x0_pos; zeus::CVector3f xc_dir; float x18_maxDist; float x1c_distComp; u32 x20_flags; u16 x24_sfxId; float x26_maxVol; float x27_minVol; bool x28_important; // Can't be allocated over, regardless of priority u8 x29_prio; }; CAudioSys(boo::IAudioVoiceEngine* voiceEngine, amuse::IBackendVoiceAllocator& backend, u8, u8, u8, u8, u32) : m_voiceEngine(voiceEngine), m_engine(backend) { g_SharedSys = this; } ~CAudioSys() { g_SharedSys = nullptr; } static void AddAudioGroup(const amuse::AudioGroupData& data) { g_SharedSys->m_engine.addAudioGroup(data); } static void RemoveAudioGroup(const amuse::AudioGroupData& data) { g_SharedSys->m_engine.removeAudioGroup(data); } static boo::IAudioVoiceEngine* GetVoiceEngine() { return g_SharedSys->m_voiceEngine; } static amuse::Engine& GetAmuseEngine() { return g_SharedSys->m_engine; } static void SetSurroundMode(ESurroundModes mode) {} static TLockedToken FindGroupSet(std::string_view name); static std::string_view SysGetGroupSetName(CAssetId id); static bool SysLoadGroupSet(CSimplePool* pool, CAssetId id); static bool SysLoadGroupSet(const TLockedToken& set, std::string_view name, CAssetId id); static void SysUnloadAudioGroupSet(std::string_view name); static bool SysIsGroupSetLoaded(std::string_view name); static void SysAddGroupIntoAmuse(std::string_view name); static void SysRemoveGroupFromAmuse(std::string_view name); static void SysSetVolume(u8 volume); static void SysSetSfxVolume(u8 volume, u16 time, bool music, bool fx); static s16 GetDefaultVolumeScale(); static void SetDefaultVolumeScale(s16 scale); static void SetVolumeScale(s16 scale); }; } // namespace metaforce