From 328d88213ce3672ff17520898d02e5aa078a5c35 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 1 Jun 2024 02:23:55 +0200 Subject: [PATCH] Miles: fix voice comm bus regression Regression was caused in commit 3bb4ee625863c1dd503f07e0d480f4b3fd302c48. The new sound engine has breaking changes in its exports. Added shim layer to fix incompatibilities on the export 'MilesSampleSetSourceRaw'. --- src/codecs/CMakeLists.txt | 2 ++ src/codecs/miles/miles_impl.h | 3 +++ src/codecs/miles/miles_shim.cpp | 27 +++++++++++++++++++++++++++ src/codecs/miles/miles_shim.h | 13 +++++++++++++ src/core/init.cpp | 2 ++ 5 files changed, 47 insertions(+) create mode 100644 src/codecs/miles/miles_shim.cpp create mode 100644 src/codecs/miles/miles_shim.h diff --git a/src/codecs/CMakeLists.txt b/src/codecs/CMakeLists.txt index 6cbfc8ca..11824776 100644 --- a/src/codecs/CMakeLists.txt +++ b/src/codecs/CMakeLists.txt @@ -11,6 +11,8 @@ add_sources( SOURCE_GROUP "Bink" add_sources( SOURCE_GROUP "Miles" "miles/miles_impl.cpp" "miles/miles_impl.h" + "miles/miles_shim.cpp" + "miles/miles_shim.h" "miles/miles_types.h" # TODO[ AMOS ]: move to public! "miles/radshal_wasapi.h" ) diff --git a/src/codecs/miles/miles_impl.h b/src/codecs/miles/miles_impl.h index 74c4483c..e3ff048b 100644 --- a/src/codecs/miles/miles_impl.h +++ b/src/codecs/miles/miles_impl.h @@ -6,6 +6,7 @@ inline void(*v_AIL_LogFunc)(int64_t nLogLevel, const char* pszMessage); inline bool(*v_Miles_Initialize)(); inline void(*v_MilesQueueEventRun)(Miles::Queue*, const char*); inline void(*v_MilesBankPatch)(Miles::Bank*, char*, char*); +inline unsigned int (*v_MilesSampleSetSourceRaw)(__int64 a1, __int64 a2, unsigned int a3, int a4, unsigned __int16 a5, bool a6); inline void(*v_CSOM_AddEventToQueue)(const char* eventName); struct MilesBankList_t @@ -54,6 +55,7 @@ class MilesCore : public IDetour LogFunAdr("Miles_Initialize", v_Miles_Initialize); LogFunAdr("MilesQueueEventRun", v_MilesQueueEventRun); LogFunAdr("MilesBankPatch", v_MilesBankPatch); + LogFunAdr("MilesSampleSetSourceRaw", v_MilesSampleSetSourceRaw); LogFunAdr("CSOM_AddEventToQueue", v_CSOM_AddEventToQueue); LogVarAdr("g_milesGlobals", g_milesGlobals); } @@ -69,6 +71,7 @@ class MilesCore : public IDetour g_RadAudioSystemDll.GetExportedSymbol("MilesQueueEventRun").GetPtr(v_MilesQueueEventRun); g_RadAudioSystemDll.GetExportedSymbol("MilesBankPatch").GetPtr(v_MilesBankPatch); + g_RadAudioSystemDll.GetExportedSymbol("MilesSampleSetSourceRaw").GetPtr(v_MilesSampleSetSourceRaw); } virtual void GetVar(void) const { } virtual void GetCon(void) const { } diff --git a/src/codecs/miles/miles_shim.cpp b/src/codecs/miles/miles_shim.cpp new file mode 100644 index 00000000..8f794f77 --- /dev/null +++ b/src/codecs/miles/miles_shim.cpp @@ -0,0 +1,27 @@ +//=============================================================================// +// +// Purpose: Miles Sound System interface shim +// +//----------------------------------------------------------------------------- +// The engine is compiled with version 10.0.42, this shim layer fixes any +// incompatibilities between upgrades. On more recent versions of the Miles +// Sound System, some exports have been renamed and/or thoroughly changed. +// If we upgrade to these versions, we need to convert this into an actual +// DLL shim layer instead of linking it statically with the SDK module. +//=============================================================================// +#include "miles_impl.h" +#include "miles_shim.h" + +unsigned int MilesSampleSetSourceRaw(__int64 a1, __int64 a2, unsigned int a3, int a4, unsigned __int16 a5, bool a6) +{ + // interface fix from 10.0.42 --> 10.0.47. As of version (10.0.43 ?) the + // export 'MilesSampleSetSourceRaw' has a newly added bool parameter. The + // purpose of this is unknown, but we need to set it to false as they + // otherwise would distort the voice comm bus. + return v_MilesSampleSetSourceRaw(a1, a2, a3, a4, a5, false); +} + +void MilesShim::Detour(const bool bAttach) const +{ + DetourSetup(&v_MilesSampleSetSourceRaw, &MilesSampleSetSourceRaw, bAttach); +} diff --git a/src/codecs/miles/miles_shim.h b/src/codecs/miles/miles_shim.h new file mode 100644 index 00000000..1e475895 --- /dev/null +++ b/src/codecs/miles/miles_shim.h @@ -0,0 +1,13 @@ +#ifndef MILES_SHIM_H +#define MILES_SHIM_H + +class MilesShim : public IDetour +{ + virtual void GetAdr(void) const { } + virtual void GetFun(void) const { } + virtual void GetVar(void) const { } + virtual void GetCon(void) const { } + virtual void Detour(const bool bAttach) const; +}; + +#endif // MILES_SHIM_H diff --git a/src/core/init.cpp b/src/core/init.cpp index 0aec44c8..1c7fbb50 100644 --- a/src/core/init.cpp +++ b/src/core/init.cpp @@ -35,6 +35,7 @@ #ifndef DEDICATED #include "codecs/bink/bink_impl.h" #include "codecs/miles/miles_impl.h" +#include "codecs/miles/miles_shim.h" #include "codecs/miles/radshal_wasapi.h" #endif // !DEDICATED #include "vphysics/physics_collide.h" @@ -525,6 +526,7 @@ void DetourRegister() // Register detour classes to be searched and hooked. // Codecs REGISTER(BinkCore); // REGISTER CLIENT ONLY! REGISTER(MilesCore); // REGISTER CLIENT ONLY! + REGISTER(MilesShim); REGISTER(VRadShal); #endif // !DEDICATED