diff options
author | Jan <sentrycraft123@gmail.com> | 2023-11-23 18:53:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-23 18:53:04 +0100 |
commit | cfc53081ff38a7a0e29cc0b89644760a7ade33a1 (patch) | |
tree | f0b00aa5c06151da8c93f9c3dd9d7f167564b689 /NorthstarDLL/client | |
parent | 17217a39681c7fed35bee95195bdba7eaf508911 (diff) | |
download | NorthstarLauncher-cfc53081ff38a7a0e29cc0b89644760a7ade33a1.tar.gz NorthstarLauncher-cfc53081ff38a7a0e29cc0b89644760a7ade33a1.zip |
Replace audio event fetching with hook (#603)
Takes the previous audio event code, which relied on reading out a register using masm, and replaces it with a new hook.
Adapted from NorthstarPrime https://github.com/F1F7Y/NorthstarPrime
Co-authored-by: F1F7Y <filip.bartos07@proton.me>
Diffstat (limited to 'NorthstarDLL/client')
-rw-r--r-- | NorthstarDLL/client/audio.cpp | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/NorthstarDLL/client/audio.cpp b/NorthstarDLL/client/audio.cpp index 66d34404..aa32e390 100644 --- a/NorthstarDLL/client/audio.cpp +++ b/NorthstarDLL/client/audio.cpp @@ -10,11 +10,7 @@ AUTOHOOK_INIT() -extern "C" -{ - // should be called only in LoadSampleMetadata_Hook - extern void* __fastcall Audio_GetParentEvent(); -} +static const char* pszAudioEventName; ConVar* Cvar_mileslog_enable; ConVar* Cvar_ns_print_played_sounds; @@ -366,32 +362,16 @@ bool ShouldPlayAudioEvent(const char* eventName, const std::shared_ptr<EventOver return true; // good to go } -// forward declare -bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal( - uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType); - -// DO NOT TOUCH THIS FUNCTION -// The actual logic of it in a separate function (forcefully not inlined) to preserve the r12 register, which holds the event pointer. // clang-format off AUTOHOOK(LoadSampleMetadata, mileswin64.dll + 0xF110, bool, __fastcall, (void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType)) // clang-format on { - uintptr_t parentEvent = (uintptr_t)Audio_GetParentEvent(); - // Raw source, used for voice data only if (audioType == 0) return LoadSampleMetadata(sample, audioBuffer, audioBufferLength, audioType); - return LoadSampleMetadata_Internal(parentEvent, sample, audioBuffer, audioBufferLength, audioType); -} - -// DO NOT INLINE THIS FUNCTION -// See comment below. -bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal( - uintptr_t parentEvent, void* sample, void* audioBuffer, unsigned int audioBufferLength, int audioType) -{ - char* eventName = (char*)parentEvent + 0x110; + const char* eventName = pszAudioEventName; if (Cvar_ns_print_played_sounds->GetInt() > 0) spdlog::info("[AUDIO] Playing event {}", eventName); @@ -491,6 +471,15 @@ bool __declspec(noinline) __fastcall LoadSampleMetadata_Internal( } // clang-format off +AUTOHOOK(sub_1800294C0, mileswin64.dll + 0x294C0, +void*, __fastcall, (void* a1, void* a2)) +// clang-format on +{ + pszAudioEventName = reinterpret_cast<const char*>((*((__int64*)a2 + 6))); + return sub_1800294C0(a1, a2); +} + +// clang-format off AUTOHOOK(MilesLog, client.dll + 0x57DAD0, void, __fastcall, (int level, const char* string)) // clang-format on |