From 2d45914ddf43843febc110c37c40f03143f7c569 Mon Sep 17 00:00:00 2001
From: Joshua Peisach <itzswirlz2020@outlook.com>
Date: Thu, 5 Oct 2023 03:47:37 -0400
Subject: [PATCH] MxSoundManager: dtor, destroy, update types (#164)

* MxSoundManager: dtor, destroy, update types

Also make MxThread's destructor public

* Minor adjustments

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
---
 LEGO1/mxsoundmanager.cpp | 34 +++++++++++++++++++++++++++++++---
 LEGO1/mxsoundmanager.h   | 11 ++++++++---
 LEGO1/mxthread.h         |  2 ++
 3 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp
index 275d0514..16d504ce 100644
--- a/LEGO1/mxsoundmanager.cpp
+++ b/LEGO1/mxsoundmanager.cpp
@@ -1,21 +1,49 @@
 #include "mxsoundmanager.h"
 
+#include "mxomni.h"
+
+DECOMP_SIZE_ASSERT(MxSoundManager, 0x3c);
+
 // OFFSET: LEGO1 0x100ae740
 MxSoundManager::MxSoundManager()
 {
   Init();
 }
 
-// OFFSET: LEGO1 0x100ae7d0 STUB
+// OFFSET: LEGO1 0x100ae7d0
 MxSoundManager::~MxSoundManager()
 {
-  // TODO
+  Destroy(TRUE);
 }
 
 // OFFSET: LEGO1 0x100ae830
 void MxSoundManager::Init()
 {
   m_unk30 = 0;
-  m_unk34 = 0;
+  m_dsBuffer = NULL;
 }
 
+// OFFSET: LEGO1 0x100ae840
+void MxSoundManager::Destroy(MxBool p_param)
+{
+  if (this->m_thread) {
+    this->m_thread->Terminate();
+    delete this->m_thread;
+  }
+  else {
+    TickleManager()->UnregisterClient(this);
+  }
+
+  this->m_criticalSection.Enter();
+
+  if (this->m_dsBuffer) {
+    this->m_dsBuffer->Release();
+  }
+
+  Init();
+  this->m_criticalSection.Leave();
+
+  if (!p_param) {
+    MxAudioManager::Destroy();
+  }
+}
\ No newline at end of file
diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h
index 06dc9d5f..d41c6fdb 100644
--- a/LEGO1/mxsoundmanager.h
+++ b/LEGO1/mxsoundmanager.h
@@ -1,11 +1,13 @@
 #ifndef MXSOUNDMANAGER_H
 #define MXSOUNDMANAGER_H
 
+#include "decomp.h"
 #include "mxaudiomanager.h"
 
+#include <dsound.h>
+
 // VTABLE 0x100dc128
 // SIZE 0x3c
-// Base vtables are: MxCore -> 0x100dc6b0 -> MxAudioManager -> MxSoundManager
 class MxSoundManager : public MxAudioManager
 {
 public:
@@ -14,8 +16,11 @@ public:
 
 private:
   void Init();
-  int m_unk30;
-  int m_unk34;
+  void Destroy(MxBool);
+
+  undefined4 m_unk30;
+  LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x34
+  undefined m_unk35[4];
 };
 
 #endif // MXSOUNDMANAGER_H
diff --git a/LEGO1/mxthread.h b/LEGO1/mxthread.h
index 4537dc14..758205d7 100644
--- a/LEGO1/mxthread.h
+++ b/LEGO1/mxthread.h
@@ -24,6 +24,8 @@ public:
 
 protected:
   MxThread();
+
+public:
   virtual ~MxThread();
 
 private: