diff --git a/include/JSystem/JAudio2/JASAudioThread.h b/include/JSystem/JAudio2/JASAudioThread.h index 8ad61106b3..6be7d07000 100644 --- a/include/JSystem/JAudio2/JASAudioThread.h +++ b/include/JSystem/JAudio2/JASAudioThread.h @@ -31,6 +31,12 @@ struct JASAudioThread : public JKRThread, public JASGlobalInstance::newMemPool(0x48); JASDriver::startDMA(); +#if TARGET_PC + OSLockMutex(&sThreadInitCompleteMutex); + sThreadInitComplete = true; + OSUnlockMutex(&sThreadInitCompleteMutex); + OSSignalCond(&sThreadInitCompleteCond); +#endif + OSMessage msg; while (true) { msg = waitMessageBlock(); diff --git a/src/Z2AudioLib/Z2AudioMgr.cpp b/src/Z2AudioLib/Z2AudioMgr.cpp index 7a6b1ab498..e2c7084d60 100644 --- a/src/Z2AudioLib/Z2AudioMgr.cpp +++ b/src/Z2AudioLib/Z2AudioMgr.cpp @@ -1,16 +1,17 @@ #include "d/dolzel.h" // IWYU pragma: keep -#include "Z2AudioLib/Z2AudioMgr.h" #include "JSystem/JAudio2/JASAiCtrl.h" +#include "JSystem/JAudio2/JASAudioThread.h" #include "JSystem/JAudio2/JASDriverIF.h" #include "JSystem/JAudio2/JASResArcLoader.h" #include "JSystem/JAudio2/JASSeqParser.h" #include "JSystem/JAudio2/JAUInitializer.h" #include "JSystem/JAudio2/JAUSectionHeap.h" -#include "JSystem/JAudio2/JAUStreamAramMgr.h" #include "JSystem/JAudio2/JAUSeqCollection.h" +#include "JSystem/JAudio2/JAUStreamAramMgr.h" #include "JSystem/JKernel/JKRSolidHeap.h" #include "Z2AudioLib/Z2AudioArcLoader.h" +#include "Z2AudioLib/Z2AudioMgr.h" #include "Z2AudioLib/Z2Param.h" #include "Z2AudioLib/Z2SoundHandles.h" @@ -105,6 +106,19 @@ void Z2AudioMgr::init(JKRSolidHeap* heap, u32 memSize, void* baaData, JKRArchive JASPoolAllocObject::newMemPool(0x4e); OS_REPORT("[Z2AudioMgr::init]before Create Section: %d\n", heap->getFreeSize()); +#if TARGET_PC + // Fix a race condition with OS threading where JAUNewSectionHeap will use all the remaining + // space in the JASDram heap before JASAudioThread has finished initializing. + + OSLockMutex(&JASAudioThread::sThreadInitCompleteMutex); + while (!JASAudioThread::sThreadInitComplete) { + OSWaitCond( + &JASAudioThread::sThreadInitCompleteCond, + &JASAudioThread::sThreadInitCompleteMutex); + } + OSUnlockMutex(&JASAudioThread::sThreadInitCompleteMutex); +#endif + JAUSectionHeap* sectionHeap = JAUNewSectionHeap(true); sectionHeap->setSeqDataArchive(seqArc); size_t resMaxSize = JASResArcLoader::getResMaxSize(seqArc);