From 5ddfaab9e7175fe8803a7fbda634b6bb97eefd75 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 14 Oct 2023 14:46:00 -0400 Subject: [PATCH] Implement MxVideoManager::Destroy / destructor (#207) * MxVideoManager::Destroy / destructor * Consistency * Add missing override --- LEGO1/mxvideomanager.cpp | 47 ++++++++++++++++++++++++++++++++++++++-- LEGO1/mxvideomanager.h | 4 +++- LEGO1/mxvideoparam.cpp | 6 ++--- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index bab495fd..44a04169 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -1,6 +1,8 @@ #include "mxvideomanager.h" #include "mxautolocker.h" #include "mxpresenter.h" +#include "mxticklemanager.h" +#include "legoomni.h" // OFFSET: LEGO1 0x100be1f0 MxVideoManager::MxVideoManager() @@ -8,10 +10,10 @@ MxVideoManager::MxVideoManager() Init(); } -// OFFSET: LEGO1 0x100be2a0 STUB +// OFFSET: LEGO1 0x100be2a0 MxVideoManager::~MxVideoManager() { - // TODO + Destroy(TRUE); } // OFFSET: LEGO1 0x100bea90 @@ -50,6 +52,41 @@ MxResult MxVideoManager::Init() return SUCCESS; } +// OFFSET: LEGO1 0x100be340 +void MxVideoManager::Destroy(MxBool p_fromDestructor) +{ + if (m_thread) { + m_thread->Terminate(); + delete m_thread; + } + else + TickleManager()->UnregisterClient(this); + + m_criticalSection.Enter(); + + if (m_displaySurface) + delete m_displaySurface; + + if (m_region) + delete m_region; + + if (m_videoParam.GetPalette()) + delete m_videoParam.GetPalette(); + + if (m_unk60) { + if (m_pDirectDraw) + m_pDirectDraw->Release(); + if (m_pDDSurface) + m_pDDSurface->Release(); + } + + Init(); + m_criticalSection.Leave(); + + if (!p_fromDestructor) + MxMediaManager::Destroy(); +} + // OFFSET: LEGO1 0x100be440 void MxVideoManager::SortPresenterList() { @@ -89,6 +126,12 @@ void MxVideoManager::UpdateRegion() // TODO } +// OFFSET: LEGO1 0x100bea50 +void MxVideoManager::Destroy() +{ + Destroy(FALSE); +} + // OFFSET: LEGO1 0x100bea60 STUB void MxVideoManager::InvalidateRect(MxRect32 &p_rect) { diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index f6e1a726..ea97ab84 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -11,9 +11,10 @@ class MxVideoManager : public MxMediaManager { public: - virtual ~MxVideoManager(); + virtual ~MxVideoManager() override; virtual MxResult Tickle() override; // vtable+0x8 + virtual void Destroy() override; // vtable+0x18 virtual void vtable0x28(); // vtable+0x28 (TODO ARGUMENTS) virtual MxResult vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unknown1, MxU8 p_unknown2); // vtable+0x2c @@ -23,6 +24,7 @@ public: MxVideoManager(); MxResult Init(); + void Destroy(MxBool p_fromDestructor); void SortPresenterList(); void UpdateRegion(); diff --git a/LEGO1/mxvideoparam.cpp b/LEGO1/mxvideoparam.cpp index 6f74f7a9..aa285106 100644 --- a/LEGO1/mxvideoparam.cpp +++ b/LEGO1/mxvideoparam.cpp @@ -65,11 +65,11 @@ MxVideoParam &MxVideoParam::operator=(const MxVideoParam &p_videoParam) void MxVideoParam::SetDeviceName(char *id) { if (this->m_deviceId != 0) - free(this->m_deviceId); + delete[] this->m_deviceId; if (id != 0) { - this->m_deviceId = (char *)malloc(strlen(id) + 1); + this->m_deviceId = new char[strlen(id) + 1]; if (this->m_deviceId != 0) { strcpy(this->m_deviceId, id); @@ -84,5 +84,5 @@ void MxVideoParam::SetDeviceName(char *id) MxVideoParam::~MxVideoParam() { if (this->m_deviceId != 0) - free(this->m_deviceId); + delete[] this->m_deviceId; }