Files
UnleashedRecomp-hedge-dev/UnleashedRecomp/patches/audio_patches.cpp

68 lines
1.7 KiB
C++

#include <user/config.h>
#include <kernel/function.h>
#include <os/media.h>
#include <os/version.h>
#include <patches/audio_patches.h>
#include <api/SWA.h>
int AudioPatches::m_isAttenuationSupported = -1;
static be<float>* GetVolume(bool isMusic = true)
{
auto ppUnkClass = (be<uint32_t>*)g_memory.Translate(0x83362FFC);
if (!ppUnkClass->get())
return nullptr;
// NOTE (Hyper): This is fine, trust me. See 0x82E58728.
return (be<float>*)g_memory.Translate(4 * ((int)isMusic + 0x1C) + ((be<uint32_t>*)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);