From 2158142b08ee20e9eeb8fae6ca226f23c44d9f80 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Fri, 2 Feb 2024 20:16:57 -0500 Subject: [PATCH] Implement LegoSoundManager (#521) * push code * begin work on subclass * fixes * Fixes --------- Co-authored-by: Christian Semmler --- .../lego/legoomni/include/legosoundmanager.h | 7 ++- .../legoomni/include/legounknown100d6b4c.h | 9 +++ .../legoomni/src/audio/legosoundmanager.cpp | 60 ++++++++++++++++--- .../src/audio/legounknown100d6b4c.cpp | 18 ++++++ LEGO1/omni/include/mxsoundmanager.h | 2 +- 5 files changed, 86 insertions(+), 10 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legosoundmanager.h b/LEGO1/lego/legoomni/include/legosoundmanager.h index 83a4ea7d..89e51165 100644 --- a/LEGO1/lego/legoomni/include/legosoundmanager.h +++ b/LEGO1/lego/legoomni/include/legosoundmanager.h @@ -24,8 +24,11 @@ private: void Init(); void Destroy(MxBool p_fromDestructor); - undefined4 m_unk0x3c; // 0x3c - LegoUnknown100d6b4c* m_unk0x40; // 0x40 + LPDIRECTSOUND3DLISTENER m_listener; // 0x3c + LegoUnknown100d6b4c* m_unk0x40; // 0x40 }; +// GLOBAL: LEGO1 0x100db6d0 +// IID_IDirectSound3DListener + #endif // LEGOSOUNDMANAGER_H diff --git a/LEGO1/lego/legoomni/include/legounknown100d6b4c.h b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h index 9b10bd50..18192f9a 100644 --- a/LEGO1/lego/legoomni/include/legounknown100d6b4c.h +++ b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h @@ -2,6 +2,7 @@ #define LEGOUNKNOWN100D6B4C_H #include "decomp.h" +#include "mxtypes.h" class LegoCacheSound; @@ -9,7 +10,15 @@ class LegoCacheSound; // SIZE 0x20 class LegoUnknown100d6b4c { public: + LegoUnknown100d6b4c(); + ~LegoUnknown100d6b4c(); + + virtual MxResult Tickle(); // vtable+0x00 + void FUN_1003dc40(LegoCacheSound** p_und); + +private: + undefined m_pad[0x1c]; }; #endif // LEGOUNKNOWN100D6B4C_H diff --git a/LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp b/LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp index d31e5d1c..748eecdb 100644 --- a/LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp +++ b/LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp @@ -18,18 +18,64 @@ LegoSoundManager::~LegoSoundManager() void LegoSoundManager::Init() { m_unk0x40 = 0; - m_unk0x3c = 0; + m_listener = NULL; } -// STUB: LEGO1 0x100299b0 +// FUNCTION: LEGO1 0x100299b0 void LegoSoundManager::Destroy(MxBool p_fromDestructor) { + delete m_unk0x40; + Init(); + + if (!p_fromDestructor) { + MxSoundManager::Destroy(); + } } -// STUB: LEGO1 0x100299f0 +// FUNCTION: LEGO1 0x100299f0 MxResult LegoSoundManager::Create(MxU32 p_frequencyMS, MxBool p_createThread) { - return MxSoundManager::Create(p_frequencyMS, p_createThread); + MxBool locked = FALSE; + MxResult result = FAILURE; + + if (MxSoundManager::Create(10, FALSE) == SUCCESS) { + m_criticalSection.Enter(); + locked = TRUE; + + if (MxOmni::IsSound3D()) { + if (m_dsBuffer->QueryInterface(IID_IDirectSound3DListener, (LPVOID*) &m_listener) != S_OK) { + goto done; + } + + MxOmni* omni = MxOmni::GetInstance(); + LPDIRECTSOUND sound; + + if (omni && omni->GetSoundManager() && (sound = omni->GetSoundManager()->GetDirectSound())) { + DSCAPS caps; + memset(&caps, 0, sizeof(DSCAPS)); + caps.dwSize = sizeof(DSCAPS); + + if (sound->GetCaps(&caps) == S_OK && caps.dwMaxHw3DAllBuffers == 0) { + m_listener->SetDistanceFactor(0.026315790f, 0); + m_listener->SetRolloffFactor(10, 0); + } + } + } + + m_unk0x40 = new LegoUnknown100d6b4c; + result = SUCCESS; + } + +done: + if (result != SUCCESS) { + Destroy(); + } + + if (locked) { + m_criticalSection.Leave(); + } + + return result; } // FUNCTION: LEGO1 0x1002a390 @@ -38,11 +84,11 @@ void LegoSoundManager::Destroy() Destroy(FALSE); } -// STUB: LEGO1 0x1002a3a0 +// FUNCTION: LEGO1 0x1002a3a0 MxResult LegoSoundManager::Tickle() { MxMediaManager::Tickle(); - MxAutoLocker lock(&this->m_criticalSection); - return 0; // TODO: call something in unk0x40 + MxAutoLocker lock(&m_criticalSection); + return m_unk0x40->Tickle(); } diff --git a/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp index 2ed5f178..3497458a 100644 --- a/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp +++ b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp @@ -1,5 +1,23 @@ #include "legounknown100d6b4c.h" +// Inline constructor at 0x10029adb +LegoUnknown100d6b4c::LegoUnknown100d6b4c() +{ + // TODO +} + +// STUB: LEGO1 0x1003cf20 +LegoUnknown100d6b4c::~LegoUnknown100d6b4c() +{ + // TODO +} + +// STUB: LEGO1 0x1003d050 +MxResult LegoUnknown100d6b4c::Tickle() +{ + return SUCCESS; +} + // STUB: LEGO1 0x1003dc40 void LegoUnknown100d6b4c::FUN_1003dc40(LegoCacheSound** p_und) { diff --git a/LEGO1/omni/include/mxsoundmanager.h b/LEGO1/omni/include/mxsoundmanager.h index 9e065ef0..6dde7d5c 100644 --- a/LEGO1/omni/include/mxsoundmanager.h +++ b/LEGO1/omni/include/mxsoundmanager.h @@ -24,7 +24,7 @@ public: MxS32 FUN_100aecf0(MxU32 p_undefined); -private: +protected: void Init(); void Destroy(MxBool p_fromDestructor); MxPresenter* FUN_100aebd0(const MxAtomId& p_atomId, MxU32 p_objectId);