diff --git a/LEGO1/legoentity.cpp b/LEGO1/legoentity.cpp index 4247e18e..c4e52dd1 100644 --- a/LEGO1/legoentity.cpp +++ b/LEGO1/legoentity.cpp @@ -46,7 +46,7 @@ MxResult LegoEntity::InitFromMxDSObject(MxDSObject& p_object) } // OFFSET: LEGO1 0x10010810 STUB -void LegoEntity::Destroy(MxBool) +void LegoEntity::Destroy(MxBool p_fromDestructor) { if (m_unk54) { // TODO diff --git a/LEGO1/legoentity.h b/LEGO1/legoentity.h index 66043492..fc5117ea 100644 --- a/LEGO1/legoentity.h +++ b/LEGO1/legoentity.h @@ -36,7 +36,7 @@ public: } virtual MxResult InitFromMxDSObject(MxDSObject& p_object); // vtable+0x18 - virtual void Destroy(MxBool); // vtable+0x1c + virtual void Destroy(MxBool p_fromDestructor); // vtable+0x1c virtual void ParseAction(char *); // vtable+0x20 protected: diff --git a/LEGO1/mxaudiomanager.cpp b/LEGO1/mxaudiomanager.cpp index bb358e47..e14d5090 100644 --- a/LEGO1/mxaudiomanager.cpp +++ b/LEGO1/mxaudiomanager.cpp @@ -14,7 +14,7 @@ MxAudioManager::MxAudioManager() // OFFSET: LEGO1 0x100b8d90 MxAudioManager::~MxAudioManager() { - LockedReinitialize(TRUE); + Destroy(TRUE); } // OFFSET: LEGO1 0x100b8df0 @@ -38,14 +38,14 @@ void MxAudioManager::SetVolume(MxS32 p_volume) } // OFFSET: LEGO1 0x100b8e00 -void MxAudioManager::LockedReinitialize(MxBool p_skipDestroy) +void MxAudioManager::Destroy(MxBool p_fromDestructor) { this->m_criticalSection.Enter(); g_unkCount--; Init(); this->m_criticalSection.Leave(); - if (!p_skipDestroy) + if (!p_fromDestructor) MxMediaManager::Destroy(); } @@ -74,5 +74,5 @@ MxResult MxAudioManager::InitPresenters() // OFFSET: LEGO1 0x100b8e90 void MxAudioManager::Destroy() { - LockedReinitialize(FALSE); + Destroy(FALSE); } \ No newline at end of file diff --git a/LEGO1/mxaudiomanager.h b/LEGO1/mxaudiomanager.h index 1ba5b6fd..b5458da8 100644 --- a/LEGO1/mxaudiomanager.h +++ b/LEGO1/mxaudiomanager.h @@ -17,7 +17,7 @@ public: virtual void SetVolume(MxS32 p_volume); // vtable+2c private: - void LockedReinitialize(MxBool p_skipDestroy); + void Destroy(MxBool p_fromDestructor); static MxS32 g_unkCount; diff --git a/LEGO1/mxeventmanager.cpp b/LEGO1/mxeventmanager.cpp index 0861af77..e06f80af 100644 --- a/LEGO1/mxeventmanager.cpp +++ b/LEGO1/mxeventmanager.cpp @@ -13,7 +13,7 @@ MxEventManager::MxEventManager() // OFFSET: LEGO1 0x100c03f0 MxEventManager::~MxEventManager() { - TerminateThread(TRUE); + Destroy(TRUE); } // OFFSET: LEGO1 0x100c0450 @@ -22,6 +22,20 @@ void MxEventManager::Init() // This is intentionally left blank } +// OFFSET: LEGO1 0x100c0460 +void MxEventManager::Destroy(MxBool p_fromDestructor) +{ + if (m_thread != NULL) { + m_thread->Terminate(); + delete m_thread; + } + else + TickleManager()->UnregisterClient(this); + + if (!p_fromDestructor) + MxMediaManager::Destroy(); +} + // OFFSET: LEGO1 0x100c04a0 MxResult MxEventManager::CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister) { @@ -29,38 +43,34 @@ MxResult MxEventManager::CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegis MxBool locked = FALSE; MxResult result = MxMediaManager::InitPresenters(); - if (result == SUCCESS) - { - if (p_noRegister) - { + if (result == SUCCESS) { + if (p_noRegister) { this->m_criticalSection.Enter(); locked = TRUE; this->m_thread = new MxTickleThread(this, p_frequencyMS); - if (this->m_thread) - { + if (this->m_thread) { if (this->m_thread->Start(0, 0) == SUCCESS) - { status = SUCCESS; - } } } - else - { + else { TickleManager()->RegisterClient(this, p_frequencyMS); status = SUCCESS; } } if (status != SUCCESS) - { Destroy(); - } if (locked) - { this->m_criticalSection.Leave(); - } return status; } + +// OFFSET: LEGO1 0x100c0590 +void MxEventManager::Destroy() +{ + Destroy(FALSE); +} diff --git a/LEGO1/mxeventmanager.h b/LEGO1/mxeventmanager.h index 1ef43748..0dd18844 100644 --- a/LEGO1/mxeventmanager.h +++ b/LEGO1/mxeventmanager.h @@ -11,9 +11,13 @@ class MxEventManager : public MxMediaManager public: MxEventManager(); virtual ~MxEventManager() override; + + virtual void Destroy() override; // vtable+18 virtual MxResult CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister); // vtable+28 + private: void Init(); + void Destroy(MxBool p_fromDestructor); }; #endif // MXEVENTMANAGER_H diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp index 58b066f6..f525e31e 100644 --- a/LEGO1/mxloopingflcpresenter.cpp +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -25,7 +25,7 @@ void MxLoopingFlcPresenter::Init() } // OFFSET: LEGO1 0x100b4432 STUB -void MxLoopingFlcPresenter::Destroy(MxBool p_param) +void MxLoopingFlcPresenter::Destroy(MxBool p_fromDestructor) { // TODO } diff --git a/LEGO1/mxloopingflcpresenter.h b/LEGO1/mxloopingflcpresenter.h index 209e2a53..449a0a86 100644 --- a/LEGO1/mxloopingflcpresenter.h +++ b/LEGO1/mxloopingflcpresenter.h @@ -22,7 +22,7 @@ public: private: void Init(); - void Destroy(MxBool); + void Destroy(MxBool p_fromDestructor); undefined4 m_unk68; }; diff --git a/LEGO1/mxloopingsmkpresenter.cpp b/LEGO1/mxloopingsmkpresenter.cpp index f51e2750..ff85c5ff 100644 --- a/LEGO1/mxloopingsmkpresenter.cpp +++ b/LEGO1/mxloopingsmkpresenter.cpp @@ -25,7 +25,6 @@ void MxLoopingSmkPresenter::Init() } // OFFSET: LEGO1 0x100b49d0 STUB -void MxLoopingSmkPresenter::Destroy(MxBool p_bool) +void MxLoopingSmkPresenter::Destroy(MxBool p_fromDestructor) { - // TODO - theres a chain of destroy and free function calls here (FUN_100b4300 -> FUN_100b3900 -> FUN_100c5d40 -> function at 0x100b27b0) } diff --git a/LEGO1/mxloopingsmkpresenter.h b/LEGO1/mxloopingsmkpresenter.h index ae9cfa05..4b903598 100644 --- a/LEGO1/mxloopingsmkpresenter.h +++ b/LEGO1/mxloopingsmkpresenter.h @@ -22,7 +22,7 @@ public: private: void Init(); - void Destroy(MxBool); + void Destroy(MxBool p_fromDestructor); undefined4 m_unk720; }; diff --git a/LEGO1/mxmediamanager.cpp b/LEGO1/mxmediamanager.cpp index c992cd42..a798e52d 100644 --- a/LEGO1/mxmediamanager.cpp +++ b/LEGO1/mxmediamanager.cpp @@ -98,23 +98,4 @@ void MxMediaManager::StopPresenters() while (cursor.Next(presenter)) presenter->EndAction(); -} - -// OFFSET: LEGO1 0x100c0460 -void MxMediaManager::TerminateThread(MxBool p_reinit) -{ - if(m_thread != NULL) - { - m_thread->Terminate(); - delete m_thread; - } - else - { - TickleManager()->UnregisterClient(this); - } - - if(!p_reinit) - { - MxMediaManager::Destroy(); - } -} +} \ No newline at end of file diff --git a/LEGO1/mxmediamanager.h b/LEGO1/mxmediamanager.h index c17ab300..db8d9056 100644 --- a/LEGO1/mxmediamanager.h +++ b/LEGO1/mxmediamanager.h @@ -23,7 +23,6 @@ public: virtual void StopPresenters(); // vtable+24 MxResult Init(); - void TerminateThread(MxBool p_reinit); protected: MxPresenterList *m_presenters; diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp index 00a2b851..2fb6b57c 100644 --- a/LEGO1/mxmediapresenter.cpp +++ b/LEGO1/mxmediapresenter.cpp @@ -25,7 +25,7 @@ void MxMediaPresenter::Init() } // OFFSET: LEGO1 0x100b54f0 STUB -void MxMediaPresenter::Destroy(MxBool p_destroy) +void MxMediaPresenter::Destroy(MxBool p_fromDestructor) { // TODO } @@ -57,7 +57,7 @@ void MxMediaPresenter::Enable(MxBool p_enable) } // OFFSET: LEGO1 0x1000c5b0 -void MxMediaPresenter::InitVirtual() +void MxMediaPresenter::Destroy() { Destroy(FALSE); } diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 6b8fd552..d0a5efe4 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -33,7 +33,7 @@ public: virtual void StreamingTickle() override; virtual void RepeatingTickle() override; virtual void DoneTickle() override; - virtual void InitVirtual() override; + virtual void Destroy() override; virtual MxLong StartAction(MxStreamController *, MxDSAction *) override; virtual void EndAction() override; virtual void Enable(MxBool p_enable) override; @@ -43,10 +43,10 @@ public: undefined4 m_unk44; undefined4 m_unk48; undefined4 m_unk4c; -protected: - void Destroy(MxBool); private: void Init(); +protected: + void Destroy(MxBool p_fromDestructor); }; diff --git a/LEGO1/mxmusicmanager.cpp b/LEGO1/mxmusicmanager.cpp index 6f49adcc..c1488f43 100644 --- a/LEGO1/mxmusicmanager.cpp +++ b/LEGO1/mxmusicmanager.cpp @@ -15,7 +15,7 @@ MxMusicManager::MxMusicManager() // OFFSET: LEGO1 0x100c0630 MxMusicManager::~MxMusicManager() { - LockedReinitialize(TRUE); + Destroy(TRUE); } // OFFSET: LEGO1 0x100c0b20 @@ -23,47 +23,47 @@ void MxMusicManager::DeinitializeMIDI() { m_criticalSection.Enter(); - if (this->m_MIDIInitialized) + if (m_MIDIInitialized) { - this->m_MIDIInitialized = FALSE; - midiStreamStop(this->m_MIDIStreamH); - midiOutUnprepareHeader(this->m_MIDIStreamH, this->m_MIDIHdrP, sizeof(MIDIHDR)); - midiOutSetVolume(this->m_MIDIStreamH, this->m_MIDIVolume); - midiStreamClose(this->m_MIDIStreamH); - delete this->m_MIDIHdrP; - this->InitData(); + m_MIDIInitialized = FALSE; + midiStreamStop(m_MIDIStreamH); + midiOutUnprepareHeader(m_MIDIStreamH, m_MIDIHdrP, sizeof(MIDIHDR)); + midiOutSetVolume(m_MIDIStreamH, m_MIDIVolume); + midiStreamClose(m_MIDIStreamH); + delete m_MIDIHdrP; + InitData(); } - this->m_criticalSection.Leave(); + m_criticalSection.Leave(); } // OFFSET: LEGO1 0x100c0690 void MxMusicManager::Init() { - this->m_multiplier = 100; + m_multiplier = 100; InitData(); } // OFFSET: LEGO1 0x100c06a0 void MxMusicManager::InitData() { - this->m_MIDIStreamH = 0; - this->m_MIDIInitialized = FALSE; - this->m_unk38 = 0; - this->m_unk3c = 0; - this->m_unk40 = 0; - this->m_unk44 = 0; - this->m_unk48 = 0; - this->m_MIDIHdrP = NULL; + m_MIDIStreamH = 0; + m_MIDIInitialized = FALSE; + m_unk38 = 0; + m_unk3c = 0; + m_unk40 = 0; + m_unk44 = 0; + m_unk48 = 0; + m_MIDIHdrP = NULL; } // OFFSET: LEGO1 0x100c06c0 -void MxMusicManager::LockedReinitialize(MxBool p_skipDestroy) +void MxMusicManager::Destroy(MxBool p_fromDestructor) { - if (this->m_thread) + if (m_thread) { - this->m_thread->Terminate(); - if (this->m_thread) + m_thread->Terminate(); + if (m_thread) { delete m_thread; } @@ -73,12 +73,12 @@ void MxMusicManager::LockedReinitialize(MxBool p_skipDestroy) TickleManager()->UnregisterClient(this); } - this->m_criticalSection.Enter(); + m_criticalSection.Enter(); DeinitializeMIDI(); Init(); - this->m_criticalSection.Leave(); + m_criticalSection.Leave(); - if (!p_skipDestroy) + if (!p_fromDestructor) { MxAudioManager::Destroy(); } @@ -87,7 +87,7 @@ void MxMusicManager::LockedReinitialize(MxBool p_skipDestroy) // OFFSET: LEGO1 0x100c0930 void MxMusicManager::Destroy() { - LockedReinitialize(FALSE); + Destroy(FALSE); } // OFFSET: LEGO1 0x100c09a0 @@ -100,8 +100,8 @@ MxS32 MxMusicManager::CalculateVolume(MxS32 p_volume) // OFFSET: LEGO1 0x100c07f0 void MxMusicManager::SetMIDIVolume() { - MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; - HMIDISTRM streamHandle = this->m_MIDIStreamH; + MxS32 result = (m_volume * m_multiplier) / 0x64; + HMIDISTRM streamHandle = m_MIDIStreamH; if (streamHandle) { @@ -114,9 +114,9 @@ void MxMusicManager::SetMIDIVolume() void MxMusicManager::SetVolume(MxS32 p_volume) { MxAudioManager::SetVolume(p_volume); - this->m_criticalSection.Enter(); + m_criticalSection.Enter(); SetMIDIVolume(); - this->m_criticalSection.Leave(); + m_criticalSection.Leave(); } // OFFSET: LEGO1 0x100c0840 @@ -130,13 +130,13 @@ MxResult MxMusicManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegiste { if (p_noRegister) { - this->m_criticalSection.Enter(); + m_criticalSection.Enter(); locked = TRUE; - this->m_thread = new MxTickleThread(this, p_frequencyMS); + m_thread = new MxTickleThread(this, p_frequencyMS); - if (this->m_thread) + if (m_thread) { - if (this->m_thread->Start(0, 0) == SUCCESS) + if (m_thread->Start(0, 0) == SUCCESS) { status = SUCCESS; } @@ -156,7 +156,7 @@ MxResult MxMusicManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegiste if (locked) { - this->m_criticalSection.Leave(); + m_criticalSection.Leave(); } return status; diff --git a/LEGO1/mxmusicmanager.h b/LEGO1/mxmusicmanager.h index 1a828c84..d60d787e 100644 --- a/LEGO1/mxmusicmanager.h +++ b/LEGO1/mxmusicmanager.h @@ -17,7 +17,7 @@ public: virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 private: - void LockedReinitialize(MxBool p_skipDestroy); + void Destroy(MxBool p_fromDestructor); void DeinitializeMIDI(); MxS32 CalculateVolume(MxS32 p_volume); diff --git a/LEGO1/mxmusicpresenter.cpp b/LEGO1/mxmusicpresenter.cpp index f376c64f..6ae73b6e 100644 --- a/LEGO1/mxmusicpresenter.cpp +++ b/LEGO1/mxmusicpresenter.cpp @@ -24,7 +24,7 @@ void MxMusicPresenter::Init() } // OFFSET: LEGO1 0x100c2550 -void MxMusicPresenter::Destroy(MxBool p_reinit) +void MxMusicPresenter::Destroy(MxBool p_fromDestructor) { if (MusicManager()) { MusicManager()->RemovePresenter(*this); @@ -32,13 +32,13 @@ void MxMusicPresenter::Destroy(MxBool p_reinit) m_criticalSection.Enter(); Init(); m_criticalSection.Leave(); - if (!p_reinit) { + if (!p_fromDestructor) { MxMediaPresenter::Destroy(FALSE); } } // OFFSET: LEGO1 0x100c25a0 -MxResult MxMusicPresenter::AddToMusicManager() +MxResult MxMusicPresenter::AddToManager() { MxResult result = FAILURE; if (MusicManager()) { @@ -49,8 +49,7 @@ MxResult MxMusicPresenter::AddToMusicManager() } // OFFSET: LEGO1 0x100c25d0 -void MxMusicPresenter::vtable38() +void MxMusicPresenter::Destroy() { - // TODO: Name this function when we know what the argument to Destroy does Destroy(FALSE); } diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h index ff765786..653e3330 100644 --- a/LEGO1/mxmusicpresenter.h +++ b/LEGO1/mxmusicpresenter.h @@ -24,12 +24,12 @@ public: MxMusicPresenter(); virtual ~MxMusicPresenter() override; - virtual MxResult AddToMusicManager(); // vtable+0x34 - virtual void vtable38(); // vtable+0x38 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy() override; // vtable+0x38 private: void Init(); - void Destroy(MxBool p_reinit); + void Destroy(MxBool p_fromDestructor); }; #endif // MXMUSICPRESENTER_H diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 86e4ae26..5cd1dea9 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -29,7 +29,6 @@ void MxPresenter::Init() // OFFSET: LEGO1 0x100b4fc0 void MxPresenter::ParseExtra() { - MxAutoLocker lock(&m_criticalSection); MxU32 len = m_action->GetExtraLength(); char *extraData = m_action->GetExtraData(); @@ -47,15 +46,13 @@ void MxPresenter::ParseExtra() strcpy(t_token, token); token = strtok(NULL, g_parseExtraTokens); - int val = token ? atoi(token) : 0; - - int result = MxOmni::GetInstance()->vtable0x30(t_token, val, this); + MxS32 val = token ? atoi(token) : 0; + MxS32 result = MxOmni::GetInstance()->vtable0x30(t_token, val, this); m_action->SetFlags(m_action->GetFlags() | MxDSAction::Flag_Parsed); if (result) SendTo_unkPresenter(MxOmni::GetInstance()); - } } } @@ -279,13 +276,13 @@ void MxPresenter::DoneTickle() } // OFFSET: LEGO1 0x1000bf70 -undefined4 MxPresenter::VTable0x34() +MxResult MxPresenter::AddToManager() { - return 0; + return SUCCESS; } // OFFSET: LEGO1 0x1000bf80 -void MxPresenter::InitVirtual() +void MxPresenter::Destroy() { Init(); } diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index bcdc5aac..09c53298 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -56,8 +56,8 @@ protected: __declspec(dllexport) virtual void ParseExtra(); // vtable+0x30 public: - virtual undefined4 VTable0x34(); // vtable+0x34 - virtual void InitVirtual(); // vtable+0x38 + virtual MxResult AddToManager(); // vtable+0x34 + virtual void Destroy(); // vtable+0x38 __declspec(dllexport) virtual MxLong StartAction(MxStreamController *, MxDSAction *); // vtable+0x3c __declspec(dllexport) virtual void EndAction(); // vtable+0x40 virtual void SetTickleState(TickleState p_tickleState); // vtable+0x44 diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index e34534f9..b3a23e3b 100644 --- a/LEGO1/mxsoundmanager.cpp +++ b/LEGO1/mxsoundmanager.cpp @@ -24,7 +24,7 @@ void MxSoundManager::Init() } // OFFSET: LEGO1 0x100ae840 -void MxSoundManager::Destroy(MxBool p_param) +void MxSoundManager::Destroy(MxBool p_fromDestructor) { if (this->m_thread) { this->m_thread->Terminate(); @@ -43,7 +43,7 @@ void MxSoundManager::Destroy(MxBool p_param) Init(); this->m_criticalSection.Leave(); - if (!p_param) { + if (!p_fromDestructor) { MxAudioManager::Destroy(); } } diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index 46eef2e7..8cbe862c 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -20,7 +20,7 @@ public: private: void Init(); - void Destroy(MxBool); + void Destroy(MxBool p_fromDestructor); undefined4 m_unk30; LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x34 diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index 42dc34f3..f6c6739b 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -33,7 +33,7 @@ MxVideoPresenter::~MxVideoPresenter() } // OFFSET: LEGO1 0x1000c7a0 STUB -void MxVideoPresenter::InitVirtual() +void MxVideoPresenter::Destroy() { // TODO } @@ -71,7 +71,7 @@ void MxVideoPresenter::Init() } // OFFSET: LEGO1 0x100b27b0 STUB -void MxVideoPresenter::Destroy(MxBool) +void MxVideoPresenter::Destroy(MxBool p_fromDestructor) { // TODO } diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index 9c9a21a3..de5cb2c9 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -31,9 +31,9 @@ public: } void Init(); - void Destroy(MxBool); + void Destroy(MxBool p_fromDestructor); - virtual void InitVirtual() override; // vtable+0x38 + virtual void Destroy() override; // vtable+0x38 virtual void VTable0x5c(); // vtable+0x5c virtual void VTable0x60(); // vtable+0x60