Sound mutex workaround
This commit is contained in:
parent
830a60c8c9
commit
8e4c102984
@ -101,6 +101,7 @@ namespace Components
|
||||
Loader::Register(new StructuredData());
|
||||
Loader::Register(new ConnectProtocol());
|
||||
Loader::Register(new StartupMessages());
|
||||
Loader::Register(new SoundMutexFix());
|
||||
|
||||
Loader::Register(new Client());
|
||||
|
||||
|
@ -130,5 +130,6 @@ namespace Components
|
||||
#include "Modules/ConnectProtocol.hpp"
|
||||
#include "Modules/StartupMessages.hpp"
|
||||
#include "Modules/Stats.hpp"
|
||||
#include "Modules/SoundMutexFix.hpp"
|
||||
|
||||
#include "Modules/Client.hpp"
|
43
src/Components/Modules/SoundMutexFix.cpp
Normal file
43
src/Components/Modules/SoundMutexFix.cpp
Normal file
@ -0,0 +1,43 @@
|
||||
#include "STDInclude.hpp"
|
||||
|
||||
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.
|
||||
///
|
||||
|
||||
std::mutex SoundMutexFix::snd_mutex;
|
||||
|
||||
static void __stdcall LockSoundMutex(int unk)
|
||||
{
|
||||
std::lock_guard lock(SoundMutexFix::snd_mutex);
|
||||
|
||||
DWORD funcPtr = *reinterpret_cast<DWORD*>(0x6D7554); // AIL_close_stream
|
||||
((void(__stdcall*)(int unk))(funcPtr))(unk);
|
||||
}
|
||||
|
||||
SoundMutexFix::SoundMutexFix()
|
||||
{
|
||||
Utils::Hook(0x689EFE, &LockSoundMutex, HOOK_JUMP).install()->quick();
|
||||
}
|
||||
|
||||
SoundMutexFix::~SoundMutexFix()
|
||||
{
|
||||
}
|
||||
}
|
14
src/Components/Modules/SoundMutexFix.hpp
Normal file
14
src/Components/Modules/SoundMutexFix.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
namespace Components
|
||||
{
|
||||
class SoundMutexFix : public Component
|
||||
{
|
||||
public:
|
||||
SoundMutexFix();
|
||||
~SoundMutexFix();
|
||||
|
||||
static void SND_StopStreamChannelHook(int channel);
|
||||
static std::mutex snd_mutex;
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user