diff --git a/src/Components/Modules/SoundMutexFix.cpp b/src/Components/Modules/SoundMutexFix.cpp index b80f936c..6ae5c534 100644 --- a/src/Components/Modules/SoundMutexFix.cpp +++ b/src/Components/Modules/SoundMutexFix.cpp @@ -2,42 +2,38 @@ namespace Components { - /// This component is a workaround for issue https://github.com/XLabsProject/iw4x-client/issues/80 - /// In case the link goes down, this is a "game hangs randomly" issue: - /// - /// Investigations on the issue pointed out it comes from a situation on Intel processors where - /// WaitForSingleObjectA is ignored by a thread, for some (?) reason. - /// - /// This locks up the game randomly, mostly at the end of rounds or when too many things happen at - /// once, due to trying to stop sounds (AIL_Stop_sounds) and playing streams at the same time, - /// rushing for the same resource via AIL_lock_mutex. - /// - /// This bug has been reproduced on mp_terminal, mp_overgrown, mp_rust, with and without bots, - /// and so far this has been the only way to circumvent it afaik. This component wraps - /// miles' mutex into another mutex, created below, and for some reason (?) that mutex is - /// respected when miles' is not. - /// - /// As soon as a real fix is found, please discard this fix. In the meantime, it should not - /// have side effects too bad - worst case it might cause a slight performance drop during - /// team switch and intermission. - /// + // This component is a workaround for issue https://github.com/XLabsProject/iw4x-client/issues/80 + // In case the link goes down, this is a "game hangs randomly" issue: + // + // Investigations on the issue pointed out it comes from a situation on Intel processors where + // WaitForSingleObjectA is ignored by a thread, for some (?) reason. + // + // This locks up the game randomly, mostly at the end of rounds or when too many things happen at + // once, due to trying to stop sounds (AIL_Stop_sounds) and playing streams at the same time, + // rushing for the same resource via AIL_lock_mutex. + // + // This bug has been reproduced on mp_terminal, mp_overgrown, mp_rust, with and without bots, + // and so far this has been the only way to circumvent it afaik. This component wraps + // miles' mutex into another mutex, created below, and for some reason (?) that mutex is + // respected when miles' is not. + // + // As soon as a real fix is found, please discard this fix. In the meantime, it should not + // have side effects too bad - worst case it might cause a slight performance drop during + // team switch and intermission. + // std::mutex SoundMutexFix::snd_mutex; - static void __stdcall LockSoundMutex(int unk) + void __stdcall SoundMutexFix::LockSoundMutex(int unk) { std::lock_guard lock(SoundMutexFix::snd_mutex); DWORD funcPtr = *reinterpret_cast(0x6D7554); // AIL_close_stream - ((void(__stdcall*)(int unk))(funcPtr))(unk); + Utils::Hook::Call(funcPtr)(unk); } SoundMutexFix::SoundMutexFix() { - Utils::Hook(0x689EFE, &LockSoundMutex, HOOK_JUMP).install()->quick(); - } - - SoundMutexFix::~SoundMutexFix() - { + Utils::Hook(0x689EFE, &SoundMutexFix::LockSoundMutex, HOOK_JUMP).install()->quick(); } } \ No newline at end of file diff --git a/src/Components/Modules/SoundMutexFix.hpp b/src/Components/Modules/SoundMutexFix.hpp index 3e6e2b20..96396039 100644 --- a/src/Components/Modules/SoundMutexFix.hpp +++ b/src/Components/Modules/SoundMutexFix.hpp @@ -1,4 +1,5 @@ #pragma once +#include namespace Components { @@ -6,9 +7,9 @@ namespace Components { public: SoundMutexFix(); - ~SoundMutexFix(); - - static void SND_StopStreamChannelHook(int channel); + + private: static std::mutex snd_mutex; + static void LockSoundMutex(int unk); }; }