#include #include #include #include #include #include int AudioPatches::m_isAttenuationSupported = -1; static be* GetVolume(bool isMusic = true) { auto ppUnkClass = (be*)g_memory.Translate(0x83362FFC); if (!ppUnkClass->get()) return nullptr; // NOTE (Hyper): This is fine, trust me. See 0x82E58728. return (be*)g_memory.Translate(4 * ((int)isMusic + 0x1C) + ((be*)g_memory.Translate(ppUnkClass->get() + 4))->get()); } bool AudioPatches::CanAttenuate() { #if _WIN32 if (m_isAttenuationSupported >= 0) return m_isAttenuationSupported; auto version = os::version::GetOSVersion(); m_isAttenuationSupported = version.Major >= 10 && version.Build >= 17763; return m_isAttenuationSupported; #else return false; #endif } void AudioPatches::Update(float deltaTime) { auto pMusicVolume = GetVolume(); auto pEffectsVolume = GetVolume(false); if (!pMusicVolume || !pEffectsVolume) return; if (Config::MusicAttenuation && CanAttenuate()) { auto time = 1.0f - expf(2.5f * -deltaTime); if (os::media::IsExternalMediaPlaying()) { *pMusicVolume = std::lerp(*pMusicVolume, 0.0f, time); } else { *pMusicVolume = std::lerp(*pMusicVolume, Config::MusicVolume * Config::MasterVolume, time); } } else { *pMusicVolume = Config::MusicVolume * Config::MasterVolume; } *pEffectsVolume = Config::EffectsVolume * Config::MasterVolume; } // Stub volume setter. GUEST_FUNCTION_STUB(sub_82E58728);