From 5125314755fd4d558a337446228e025869196b9b Mon Sep 17 00:00:00 2001 From: MS Date: Wed, 4 Oct 2023 11:48:25 -0400 Subject: [PATCH 01/14] Wipe transition (#161) --- LEGO1/mxtransitionmanager.cpp | 39 +++++++++++++++++++++++++++++++++++ LEGO1/mxtransitionmanager.h | 1 + 2 files changed, 40 insertions(+) diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index c3de0ff8..f66f4bae 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -192,6 +192,45 @@ MxResult MxTransitionManager::StartTransition(TransitionType p_animationType, Mx return FAILURE; } +// OFFSET: LEGO1 0x1004c170 +void MxTransitionManager::Transition_Wipe() +{ + // If the animation is finished + if (m_animationTimer == 240) { + m_animationTimer = 0; + EndTransition(TRUE); + return; + } + + DDSURFACEDESC ddsd; + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + HRESULT res = m_ddSurface->Lock(NULL, &ddsd, 1, NULL); + if (res == DDERR_SURFACELOST) { + m_ddSurface->Restore(); + res = m_ddSurface->Lock(NULL, &ddsd, 1, NULL); + } + + if (res == DD_OK) { + SubmitCopyRect(ddsd); + + // For each of the 240 animation ticks, blank out two scanlines + // starting at the top of the screen. + // (dwRGBBitCount / 8) will tell how many bytes are used per pixel. + MxU8 *line = (MxU8*)ddsd.lpSurface + 2*ddsd.lPitch*m_animationTimer; + memset(line, 0, 640 * ddsd.ddpfPixelFormat.dwRGBBitCount / 8); + + line += ddsd.lPitch; + memset(line, 0, 640 * ddsd.ddpfPixelFormat.dwRGBBitCount / 8); + + SetupCopyRect(ddsd); + m_ddSurface->Unlock(ddsd.lpSurface); + + m_animationTimer++; + } +} + // OFFSET: LEGO1 0x1004c470 STUB void MxTransitionManager::SetWaitIndicator(MxVideoPresenter *videoPresenter) { diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 6cbc608b..cc5bd678 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -45,6 +45,7 @@ class MxTransitionManager : public MxCore private: void EndTransition(MxBool p_notifyWorld); void Transition_Dissolve(); + void Transition_Wipe(); void SubmitCopyRect(DDSURFACEDESC &); void SetupCopyRect(DDSURFACEDESC &); From 6916aa49e3298153d5442851910191bc2c9a7cba Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Wed, 4 Oct 2023 13:30:37 -0400 Subject: [PATCH 02/14] MxLoopingSmkPresenter - dtor, Init, stub Destroy (#162) --- LEGO1/mxloopingsmkpresenter.cpp | 16 ++++++++++++---- LEGO1/mxloopingsmkpresenter.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/LEGO1/mxloopingsmkpresenter.cpp b/LEGO1/mxloopingsmkpresenter.cpp index da9223df..f51e2750 100644 --- a/LEGO1/mxloopingsmkpresenter.cpp +++ b/LEGO1/mxloopingsmkpresenter.cpp @@ -10,14 +10,22 @@ MxLoopingSmkPresenter::MxLoopingSmkPresenter() Init(); } -// OFFSET: LEGO1 0x100b4950 STUB +// OFFSET: LEGO1 0x100b4950 MxLoopingSmkPresenter::~MxLoopingSmkPresenter() { - // TODO + Destroy(TRUE); } -// OFFSET: LEGO1 0x100b49b0 STUB +// OFFSET: LEGO1 0x100b49b0 void MxLoopingSmkPresenter::Init() { - // TODO + this->m_unk720 = 0; + this->m_flags &= 0xfd; + this->m_flags &= 0xfb; +} + +// OFFSET: LEGO1 0x100b49d0 STUB +void MxLoopingSmkPresenter::Destroy(MxBool p_bool) +{ + // 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 8ca18d20..ae9cfa05 100644 --- a/LEGO1/mxloopingsmkpresenter.h +++ b/LEGO1/mxloopingsmkpresenter.h @@ -22,6 +22,8 @@ class MxLoopingSmkPresenter : public MxSmkPresenter private: void Init(); + void Destroy(MxBool); + undefined4 m_unk720; }; From 2d45914ddf43843febc110c37c40f03143f7c569 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Thu, 5 Oct 2023 03:47:37 -0400 Subject: [PATCH 03/14] MxSoundManager: dtor, destroy, update types (#164) * MxSoundManager: dtor, destroy, update types Also make MxThread's destructor public * Minor adjustments --------- Co-authored-by: Christian Semmler --- 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 + // VTABLE 0x100dc128 // SIZE 0x3c -// Base vtables are: MxCore -> 0x100dc6b0 -> MxAudioManager -> MxSoundManager class MxSoundManager : public MxAudioManager { public: @@ -14,8 +16,11 @@ class MxSoundManager : public MxAudioManager 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 @@ class MxThread protected: MxThread(); + +public: virtual ~MxThread(); private: From c46bc985c272ceeff9d6fee2ff88a3f24ef0154b Mon Sep 17 00:00:00 2001 From: Regan Green Date: Thu, 5 Oct 2023 06:31:20 -0400 Subject: [PATCH 04/14] Implement MxTransitionManager SetWaitIndicator and SetupCopyRect (#165) * Implement MxTransitionManager SetWaitIndicator and SetupCopyRect * More accurate SetupCopyRect * Add MxDSAction::Flag_Bit5 * SetupCopyRect PR Amends * Correct braces formatting * Stub MxVideoPresenter::Destroy --- LEGO1/mxdisplaysurface.cpp | 4 +- LEGO1/mxdisplaysurface.h | 4 +- LEGO1/mxdsaction.h | 1 + LEGO1/mxmediapresenter.cpp | 6 ++ LEGO1/mxmediapresenter.h | 2 + LEGO1/mxpresenter.h | 2 + LEGO1/mxtransitionmanager.cpp | 101 +++++++++++++++++++++++++++++----- LEGO1/mxtransitionmanager.h | 6 +- LEGO1/mxvideopresenter.cpp | 86 +++++++++++++++++++++++++++++ LEGO1/mxvideopresenter.h | 17 ++++++ 10 files changed, 208 insertions(+), 21 deletions(-) diff --git a/LEGO1/mxdisplaysurface.cpp b/LEGO1/mxdisplaysurface.cpp index 4f02aeb6..619f5eef 100644 --- a/LEGO1/mxdisplaysurface.cpp +++ b/LEGO1/mxdisplaysurface.cpp @@ -174,7 +174,7 @@ void MxDisplaySurface::SetPalette(MxPalette *p_palette) } // OFFSET: LEGO1 0x100bc200 STUB -void MxDisplaySurface::vtable24(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4) +void MxDisplaySurface::vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4) { } @@ -186,7 +186,7 @@ MxBool MxDisplaySurface::vtable28(undefined4, undefined4, undefined4, undefined4 } // OFFSET: LEGO1 0x100bc630 STUB -MxBool MxDisplaySurface::vtable2c(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool) +MxBool MxDisplaySurface::vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool) { return 0; } diff --git a/LEGO1/mxdisplaysurface.h b/LEGO1/mxdisplaysurface.h index 9bbc44bc..af484716 100644 --- a/LEGO1/mxdisplaysurface.h +++ b/LEGO1/mxdisplaysurface.h @@ -23,9 +23,9 @@ class MxDisplaySurface : public MxCore virtual MxResult Create(MxVideoParam &p_videoParam); virtual void Clear(); virtual void SetPalette(MxPalette *p_palette); - virtual void vtable24(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); + virtual void vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); virtual MxBool vtable28(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); - virtual MxBool vtable2c(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); + virtual MxBool vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); virtual MxBool vtable30(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); virtual undefined4 vtable34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); virtual void Display(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index eb7afb99..9881f3e2 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -16,6 +16,7 @@ class MxDSAction : public MxDSObject { Flag_Looping = 0x01, Flag_Bit3 = 0x04, + Flag_Bit5 = 0x10, Flag_Enabled = 0x20, Flag_Parsed = 0x80, Flag_Bit9 = 0x200, diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp index 6a59a0ec..f36ecbdc 100644 --- a/LEGO1/mxmediapresenter.cpp +++ b/LEGO1/mxmediapresenter.cpp @@ -17,3 +17,9 @@ void MxMediaPresenter::Init() this->m_unk48 = NULL; this->m_unk4c = NULL; } + +// OFFSET: LEGO1 0x100b5f10 STUB +void MxMediaPresenter::VTable0x58() +{ + // TODO +} diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 741ab49f..824dd399 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -29,6 +29,8 @@ class MxMediaPresenter : public MxPresenter return !strcmp(name, MxMediaPresenter::ClassName()) || MxPresenter::IsA(name); } + virtual void VTable0x58(); // vtable+0x58 + undefined4 m_unk40; undefined4 m_unk44; undefined4 m_unk48; diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index c0757665..81ea14ad 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -68,6 +68,8 @@ class MxPresenter : public MxCore MxBool IsEnabled(); + inline MxS32 GetCurrentTickleState() { return this->m_currentTickleState; } + inline MxPoint32 GetLocation() { return this->m_location; } inline MxS32 GetDisplayZ() { return this->m_displayZ; } inline MxDSAction *GetAction() { return this->m_action; } diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index f66f4bae..efb90604 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -104,7 +104,7 @@ void MxTransitionManager::Transition_Dissolve() } if (res == DD_OK) { - SubmitCopyRect(ddsd); + SubmitCopyRect(&ddsd); for (MxS32 i = 0; i < 640; i++) { // Select 16 columns on each tick @@ -129,7 +129,7 @@ void MxTransitionManager::Transition_Dissolve() } } - SetupCopyRect(ddsd); + SetupCopyRect(&ddsd); m_ddSurface->Unlock(ddsd.lpSurface); if (VideoManager()->GetVideoParam().flags().GetFlipSurfaces()) { @@ -213,7 +213,7 @@ void MxTransitionManager::Transition_Wipe() } if (res == DD_OK) { - SubmitCopyRect(ddsd); + SubmitCopyRect(&ddsd); // For each of the 240 animation ticks, blank out two scanlines // starting at the top of the screen. @@ -224,21 +224,42 @@ void MxTransitionManager::Transition_Wipe() line += ddsd.lPitch; memset(line, 0, 640 * ddsd.ddpfPixelFormat.dwRGBBitCount / 8); - SetupCopyRect(ddsd); + SetupCopyRect(&ddsd); m_ddSurface->Unlock(ddsd.lpSurface); m_animationTimer++; } } -// OFFSET: LEGO1 0x1004c470 STUB -void MxTransitionManager::SetWaitIndicator(MxVideoPresenter *videoPresenter) +// OFFSET: LEGO1 0x1004c470 +void MxTransitionManager::SetWaitIndicator(MxVideoPresenter *p_waitIndicator) { - // TODO + // End current wait indicator + if (m_waitIndicator != NULL) { + m_waitIndicator->GetAction()->SetFlags(m_waitIndicator->GetAction()->GetFlags() & ~MxDSAction::Flag_Parsed); + m_waitIndicator->EndAction(); + m_waitIndicator = NULL; + } + + // Check if we were given a new wait indicator + if (p_waitIndicator != NULL) { + // Setup the new wait indicator + m_waitIndicator = p_waitIndicator; + + LegoVideoManager *videoManager = VideoManager(); + videoManager->RemovePresenter(*m_waitIndicator); + + if (m_waitIndicator->GetCurrentTickleState() < MxPresenter::TickleState_Streaming) { + m_waitIndicator->Tickle(); + } + } else { + // Disable copy rect + m_copyFlags.bit0 = FALSE; + } } // OFFSET: LEGO1 0x1004c4d0 -void MxTransitionManager::SubmitCopyRect(DDSURFACEDESC &ddsc) +void MxTransitionManager::SubmitCopyRect(LPDDSURFACEDESC ddsc) { // Check if the copy rect is setup if (m_copyFlags.bit0 == FALSE || m_waitIndicator == NULL || m_copyBuffer == NULL) { @@ -248,7 +269,7 @@ void MxTransitionManager::SubmitCopyRect(DDSURFACEDESC &ddsc) // Copy the copy rect onto the surface char *dst; - DWORD bytesPerPixel = ddsc.ddpfPixelFormat.dwRGBBitCount / 8; + DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; const char *src = (const char *)m_copyBuffer; @@ -256,12 +277,12 @@ void MxTransitionManager::SubmitCopyRect(DDSURFACEDESC &ddsc) copyPitch = ((m_copyRect.right - m_copyRect.left) + 1) * bytesPerPixel; LONG y; - dst = (char *)ddsc.lpSurface + (ddsc.lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left); + dst = (char *)ddsc->lpSurface + (ddsc->lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left); for (y = 0; y < m_copyRect.bottom - m_copyRect.top + 1; ++y) { memcpy(dst, src, copyPitch); src += copyPitch; - dst += ddsc.lPitch; + dst += ddsc->lPitch; } // Free the copy buffer @@ -269,8 +290,60 @@ void MxTransitionManager::SubmitCopyRect(DDSURFACEDESC &ddsc) m_copyBuffer = NULL; } -// OFFSET: LEGO1 0x1004c580 STUB -void MxTransitionManager::SetupCopyRect(DDSURFACEDESC &ddsc) +// OFFSET: LEGO1 0x1004c580 +void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc) { - // TODO + // Check if the copy rect is setup + if (m_copyFlags.bit0 == FALSE || m_waitIndicator == NULL) { + return; + } + + // Tickle wait indicator + m_waitIndicator->Tickle(); + + // Check if wait indicator has started + if (m_waitIndicator->GetCurrentTickleState() >= MxPresenter::TickleState_Streaming) { + // Setup the copy rect + DWORD copyPitch = (ddsc->ddpfPixelFormat.dwRGBBitCount / 8) * (m_copyRect.right - m_copyRect.left + 1); // This uses m_copyRect, seemingly erroneously + DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; + + m_copyRect.left = m_waitIndicator->GetLocation().m_x; + m_copyRect.top = m_waitIndicator->GetLocation().m_y; + + MxS32 height = m_waitIndicator->GetHeight(); + MxS32 width = m_waitIndicator->GetWidth(); + + m_copyRect.right = m_copyRect.left + width - 1; + m_copyRect.bottom = m_copyRect.top + height - 1; + + // Allocate the copy buffer + const char *src = (const char*)ddsc->lpSurface + m_copyRect.top * ddsc->lPitch + bytesPerPixel * m_copyRect.left; + + m_copyBuffer = malloc(bytesPerPixel * width * height); + if (!m_copyBuffer) + return; + + // Copy into the copy buffer + char *dst = (char*)m_copyBuffer; + + for (MxS32 i = 0; i < (m_copyRect.bottom - m_copyRect.top + 1); i++) + { + memcpy(dst, src, copyPitch); + src += ddsc->lPitch; + dst += copyPitch; + } + } + + // Setup display surface + if ((m_waitIndicator->GetAction()->GetFlags() & MxDSAction::Flag_Bit5) != 0) + { + MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface(); + MxBool unkbool = FALSE; + displaySurface->vtable2c(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight(), unkbool); + } + else + { + MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface(); + displaySurface->vtable24(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight()); + } } diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index cc5bd678..4ed82229 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -12,7 +12,7 @@ class MxTransitionManager : public MxCore MxTransitionManager(); virtual ~MxTransitionManager() override; // vtable+0x0 - __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter *videoPresenter); + __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter *p_waitIndicator); virtual MxResult Tickle(); // vtable+0x8 @@ -46,8 +46,8 @@ class MxTransitionManager : public MxCore void EndTransition(MxBool p_notifyWorld); void Transition_Dissolve(); void Transition_Wipe(); - void SubmitCopyRect(DDSURFACEDESC &); - void SetupCopyRect(DDSURFACEDESC &); + void SubmitCopyRect(LPDDSURFACEDESC ddsc); + void SetupCopyRect(LPDDSURFACEDESC ddsc); MxVideoPresenter *m_waitIndicator; RECT m_copyRect; diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index 4e47e4a4..fe83a2dc 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -2,8 +2,94 @@ DECOMP_SIZE_ASSERT(MxVideoPresenter, 0x64); +// OFFSET: LEGO1 0x1000c700 STUB +void MxVideoPresenter::VTable0x5c() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c710 STUB +void MxVideoPresenter::VTable0x60() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c720 STUB +void MxVideoPresenter::VTable0x68() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c730 STUB +void MxVideoPresenter::VTable0x70() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c740 +MxVideoPresenter::~MxVideoPresenter() +{ + Destroy(TRUE); +} + +// OFFSET: LEGO1 0x1000c7a0 STUB +void MxVideoPresenter::InitVirtual() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c7b0 STUB +void MxVideoPresenter::VTable0x78() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c7c0 STUB +void MxVideoPresenter::VTable0x7c() +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c7e0 STUB +MxS32 MxVideoPresenter::GetWidth() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1000c800 STUB +MxS32 MxVideoPresenter::GetHeight() +{ + // TODO + return 0; +} + // OFFSET: LEGO1 0x100b2760 STUB void MxVideoPresenter::Init() { // TODO } + +// OFFSET: LEGO1 0x100b27b0 STUB +void MxVideoPresenter::Destroy(MxBool) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b28b0 STUB +void MxVideoPresenter::VTable0x64() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b2a70 STUB +void MxVideoPresenter::VTable0x6c() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b3300 STUB +void MxVideoPresenter::VTable0x74() +{ + // TODO +} diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index bc5fac5c..84822f71 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -13,6 +13,8 @@ class MxVideoPresenter : public MxMediaPresenter Init(); } + virtual ~MxVideoPresenter() override; // vtable+0x0 + // OFFSET: LEGO1 0x1000c820 inline virtual const char *ClassName() const override // vtable+0x0c { @@ -27,6 +29,21 @@ class MxVideoPresenter : public MxMediaPresenter } void Init(); + void Destroy(MxBool); + + virtual void InitVirtual() override; // vtable+0x38 + + virtual void VTable0x5c(); // vtable+0x5c + virtual void VTable0x60(); // vtable+0x60 + virtual void VTable0x64(); // vtable+0x64 + virtual void VTable0x68(); // vtable+0x68 + virtual void VTable0x6c(); // vtable+0x6c + virtual void VTable0x70(); // vtable+0x70 + virtual void VTable0x74(); // vtable+0x74 + virtual void VTable0x78(); // vtable+0x78 + virtual void VTable0x7c(); // vtable+0x7c + virtual MxS32 GetWidth(); // vtable+0x80 + virtual MxS32 GetHeight(); // vtable+0x84 undefined4 m_unk50; undefined4 m_unk54; From e767d6524e73d5f24863ebf70923b1248c0d51b9 Mon Sep 17 00:00:00 2001 From: vMidz <147055059+vMidz@users.noreply.github.com> Date: Thu, 5 Oct 2023 23:06:11 +0300 Subject: [PATCH 05/14] implement MxMIDIManager (#167) * added MxMIDIManager * implement MxMIDIManager implement MxMIDIManager implement MxAudioManager::GetVolume implement MxAudioManager::SetVolume * added override + small changes --- CMakeLists.txt | 3 +- LEGO1/mxaudiomanager.cpp | 16 +++- LEGO1/mxaudiomanager.h | 10 ++- LEGO1/mxmidimanager.cpp | 161 +++++++++++++++++++++++++++++++++++++++ LEGO1/mxmidimanager.h | 42 ++++++++++ 5 files changed, 226 insertions(+), 6 deletions(-) create mode 100644 LEGO1/mxmidimanager.cpp create mode 100644 LEGO1/mxmidimanager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0da82a25..818d3773 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,6 +140,7 @@ add_library(lego1 SHARED LEGO1/mxmatrix.cpp LEGO1/mxmediamanager.cpp LEGO1/mxmediapresenter.cpp + LEGO1/mxmidimanager.cpp LEGO1/mxmidipresenter.cpp LEGO1/mxmusicpresenter.cpp LEGO1/mxnotificationmanager.cpp @@ -272,4 +273,4 @@ if (MSVC) set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/incremental:no") set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug") set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "/incremental:no") -endif() \ No newline at end of file +endif() diff --git a/LEGO1/mxaudiomanager.cpp b/LEGO1/mxaudiomanager.cpp index c7ecdc12..bb358e47 100644 --- a/LEGO1/mxaudiomanager.cpp +++ b/LEGO1/mxaudiomanager.cpp @@ -20,7 +20,21 @@ MxAudioManager::~MxAudioManager() // OFFSET: LEGO1 0x100b8df0 void MxAudioManager::Init() { - this->m_unk2c = 100; + this->m_volume = 100; +} + +// OFFSET: LEGO1 0x10029910 +MxS32 MxAudioManager::GetVolume() +{ + return this->m_volume; +} + +// OFFSET: LEGO1 0x100b8ea0 +void MxAudioManager::SetVolume(MxS32 p_volume) +{ + this->m_criticalSection.Enter(); + this->m_volume = p_volume; + this->m_criticalSection.Leave(); } // OFFSET: LEGO1 0x100b8e00 diff --git a/LEGO1/mxaudiomanager.h b/LEGO1/mxaudiomanager.h index 1403f36d..1ba5b6fd 100644 --- a/LEGO1/mxaudiomanager.h +++ b/LEGO1/mxaudiomanager.h @@ -11,18 +11,20 @@ class MxAudioManager : public MxMediaManager MxAudioManager(); virtual ~MxAudioManager() override; - virtual MxResult InitPresenters(); // vtable+14 - virtual void Destroy(); // vtable+18 + virtual MxResult InitPresenters() override; // vtable+14 + virtual void Destroy() override; // vtable+18 + virtual MxS32 GetVolume(); // vtable+28 + virtual void SetVolume(MxS32 p_volume); // vtable+2c private: - void LockedReinitialize(MxBool); + void LockedReinitialize(MxBool p_skipDestroy); static MxS32 g_unkCount; protected: void Init(); - undefined4 m_unk2c; + MxS32 m_volume; // 0x2c }; #endif // MXAUDIOMANAGER_H diff --git a/LEGO1/mxmidimanager.cpp b/LEGO1/mxmidimanager.cpp new file mode 100644 index 00000000..62bcb6d2 --- /dev/null +++ b/LEGO1/mxmidimanager.cpp @@ -0,0 +1,161 @@ +#include "mxmidimanager.h" +#include "mxomni.h" +#include + +DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); + +// OFFSET: LEGO1 0x100c05a0 +MxMIDIManager::MxMIDIManager() +{ + Init(); +} + +// OFFSET: LEGO1 0x100c0630 +MxMIDIManager::~MxMIDIManager() +{ + LockedReinitialize(TRUE); +} + +// OFFSET: LEGO1 0x100c0b20 +void MxMIDIManager::DeinitializeMIDI() +{ + m_criticalSection.Enter(); + + if (this->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(); + } + + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0690 +void MxMIDIManager::Init() +{ + this->m_multiplier = 100; + InitData(); +} + +// OFFSET: LEGO1 0x100c06a0 +void MxMIDIManager::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; +} + +// OFFSET: LEGO1 0x100c06c0 +void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) +{ + if (this->m_thread) + { + this->m_thread->Terminate(); + if (this->m_thread) + { + delete m_thread; + } + } + else + { + TickleManager()->UnregisterClient(this); + } + + this->m_criticalSection.Enter(); + DeinitializeMIDI(); + Init(); + this->m_criticalSection.Leave(); + + if (!p_skipDestroy) + { + MxAudioManager::Destroy(); + } +} + +// OFFSET: LEGO1 0x100c0930 +void MxMIDIManager::Destroy() +{ + LockedReinitialize(FALSE); +} + +// OFFSET: LEGO1 0x100c09a0 +MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) +{ + MxS32 result = (p_volume * 0xffff) / 100; + return (result << 0x10) | result; +} + +// OFFSET: LEGO1 0x100c07f0 +void MxMIDIManager::SetMIDIVolume() +{ + MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; + HMIDISTRM streamHandle = this->m_MIDIStreamH; + + if (streamHandle) + { + MxS32 volume = CalculateVolume(result); + midiOutSetVolume(streamHandle, volume); + } +} + +// OFFSET: LEGO1 0x100c0940 +void MxMIDIManager::SetVolume(MxS32 p_volume) +{ + MxAudioManager::SetVolume(p_volume); + this->m_criticalSection.Enter(); + SetMIDIVolume(); + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0840 +MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +{ + MxResult status = FAILURE; + MxBool locked = FALSE; + + MxResult result = MxAudioManager::InitPresenters(); + 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->Start(0, 0) == SUCCESS) + { + status = SUCCESS; + } + } + } + else + { + TickleManager()->RegisterClient(this, p_frequencyMS); + status = SUCCESS; + } + } + + if (status != SUCCESS) + { + Destroy(); + } + + if (locked) + { + this->m_criticalSection.Leave(); + } + + return status; +} \ No newline at end of file diff --git a/LEGO1/mxmidimanager.h b/LEGO1/mxmidimanager.h new file mode 100644 index 00000000..f944d67d --- /dev/null +++ b/LEGO1/mxmidimanager.h @@ -0,0 +1,42 @@ +#ifndef MXMIDIMANAGER_H +#define MXMIDIMANAGER_H + +#include "decomp.h" +#include "mxaudiomanager.h" + +// VTABLE 0x100dc930 +// SIZE 0x58 +class MxMIDIManager : public MxAudioManager +{ +public: + MxMIDIManager(); + virtual ~MxMIDIManager() override; + + virtual void Destroy() override; // vtable+18 + virtual void SetVolume(MxS32 p_volume) override; // vtable+2c + virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 + +private: + void LockedReinitialize(MxBool p_skipDestroy); + void DeinitializeMIDI(); + + MxS32 CalculateVolume(MxS32 p_volume); + void SetMIDIVolume(); + + HMIDISTRM m_MIDIStreamH; // 0x30 + MxBool m_MIDIInitialized; // 0x34 + undefined4 m_unk38; // 0x38 + undefined4 m_unk3c; // 0x3c + undefined4 m_unk40; // 0x40 + undefined4 m_unk44; // 0x44 + undefined4 m_unk48; // 0x48 + MIDIHDR *m_MIDIHdrP; // 0x4c + MxS32 m_multiplier; // 0x50 + DWORD m_MIDIVolume; // 0x54 + +protected: + void Init(); + void InitData(); +}; + +#endif // MXMIDIMANAGER_H \ No newline at end of file From 8e87b5b4c8ab3b483cba80c31f8707726d0647ec Mon Sep 17 00:00:00 2001 From: Ramen2X <64166386+Ramen2X@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:51:34 -0400 Subject: [PATCH 06/14] MxTransitionManager::Tickle() & FUN_1004bcf0 (#168) * implement MxTransitionManager::Tickle() * improved accuracy of MxTransitionManager::Tickle * implement MxTransitionManager::FUN_1004bcf0 * improved accuracy of FUN_1004bcf0 * move/rename stubbed transition methods --------- Co-authored-by: MattKC <34096995+itsmattkc@users.noreply.github.com> --- LEGO1/mxdisplaysurface.cpp | 6 ++++ LEGO1/mxdisplaysurface.h | 2 ++ LEGO1/mxtransitionmanager.cpp | 57 +++++++++++++++++++++++++++++++++-- LEGO1/mxtransitionmanager.h | 7 +++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/LEGO1/mxdisplaysurface.cpp b/LEGO1/mxdisplaysurface.cpp index 619f5eef..e22244c5 100644 --- a/LEGO1/mxdisplaysurface.cpp +++ b/LEGO1/mxdisplaysurface.cpp @@ -230,3 +230,9 @@ undefined4 MxDisplaySurface::vtable44(undefined4, undefined4*, undefined4, undef { return 0; } + +// OFFSET: LEGO1 0x100ba640 STUB +void MxDisplaySurface::FUN_100ba640() +{ + // TODO +} diff --git a/LEGO1/mxdisplaysurface.h b/LEGO1/mxdisplaysurface.h index af484716..8e79f6e8 100644 --- a/LEGO1/mxdisplaysurface.h +++ b/LEGO1/mxdisplaysurface.h @@ -19,6 +19,8 @@ class MxDisplaySurface : public MxCore void Reset(); + void FUN_100ba640(); + virtual MxResult Init(MxVideoParam &p_videoParam, LPDIRECTDRAWSURFACE p_ddSurface1, LPDIRECTDRAWSURFACE p_ddSurface2, LPDIRECTDRAWCLIPPER p_ddClipper); virtual MxResult Create(MxVideoParam &p_videoParam); virtual void Clear(); diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index efb90604..b844095e 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -33,12 +33,36 @@ MxTransitionManager::~MxTransitionManager() TickleManager()->UnregisterClient(this); } -// OFFSET: LEGO1 0x1004bac0 STUB +// OFFSET: LEGO1 0x1004bac0 MxResult MxTransitionManager::Tickle() { - // TODO + if (this->m_animationSpeed + this->m_systemTime > timeGetTime()) { + return SUCCESS; + } - return 0; + this->m_systemTime = timeGetTime(); + + switch (this->m_transitionType) { + case NO_ANIMATION: + FUN_1004bcf0(); + break; + case DISSOLVE: + Transition_Dissolve(); + break; + case PIXELATION: + Transition_Pixelation(); + break; + case SCREEN_WIPE: + Transition_Wipe(); + break; + case WINDOWS: + Transition_Windows(); + break; + case BROKEN: + Transition_Broken(); + break; + } + return SUCCESS; } // OFFSET: LEGO1 0x1004bc30 @@ -192,6 +216,33 @@ MxResult MxTransitionManager::StartTransition(TransitionType p_animationType, Mx return FAILURE; } +// OFFSET: LEGO1 0x1004bcf0 +void MxTransitionManager::FUN_1004bcf0() +{ + LegoVideoManager *videoManager = VideoManager(); + videoManager->GetDisplaySurface()->FUN_100ba640(); + EndTransition(TRUE); +} + +// OFFSET: LEGO1 0x1004bed0 STUB +void MxTransitionManager::Transition_Pixelation() +{ + // TODO +} + + +// OFFSET: LEGO1 0x1004c270 STUB +void MxTransitionManager::Transition_Windows() +{ + // TODO +} + +// OFFSET: LEGO1 0x1004c3e0 STUB +void MxTransitionManager::Transition_Broken() +{ + // TODO +} + // OFFSET: LEGO1 0x1004c170 void MxTransitionManager::Transition_Wipe() { diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 4ed82229..d3c344ce 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -42,10 +42,17 @@ class MxTransitionManager : public MxCore MxResult StartTransition(TransitionType p_animationType, MxS32 p_speed, MxBool p_doCopy, MxBool p_playMusicInAnim); + private: void EndTransition(MxBool p_notifyWorld); void Transition_Dissolve(); + void Transition_Pixelation(); void Transition_Wipe(); + void Transition_Windows(); + void Transition_Broken(); + + void FUN_1004bcf0(); + void SubmitCopyRect(LPDDSURFACEDESC ddsc); void SetupCopyRect(LPDDSURFACEDESC ddsc); From 666c65fa4fb4a68cad2e35f835b9f7c08cdd8010 Mon Sep 17 00:00:00 2001 From: Ramen2X <64166386+Ramen2X@users.noreply.github.com> Date: Thu, 5 Oct 2023 18:55:35 -0400 Subject: [PATCH 07/14] rename FUN_1004bcf0 to Transition_None --- LEGO1/mxtransitionmanager.cpp | 4 ++-- LEGO1/mxtransitionmanager.h | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index b844095e..d34df54f 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -44,7 +44,7 @@ MxResult MxTransitionManager::Tickle() switch (this->m_transitionType) { case NO_ANIMATION: - FUN_1004bcf0(); + Transition_None(); break; case DISSOLVE: Transition_Dissolve(); @@ -217,7 +217,7 @@ MxResult MxTransitionManager::StartTransition(TransitionType p_animationType, Mx } // OFFSET: LEGO1 0x1004bcf0 -void MxTransitionManager::FUN_1004bcf0() +void MxTransitionManager::Transition_None() { LegoVideoManager *videoManager = VideoManager(); videoManager->GetDisplaySurface()->FUN_100ba640(); diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index d3c344ce..7f1d4ead 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -45,14 +45,13 @@ class MxTransitionManager : public MxCore private: void EndTransition(MxBool p_notifyWorld); + void Transition_None(); void Transition_Dissolve(); void Transition_Pixelation(); void Transition_Wipe(); void Transition_Windows(); void Transition_Broken(); - void FUN_1004bcf0(); - void SubmitCopyRect(LPDDSURFACEDESC ddsc); void SetupCopyRect(LPDDSURFACEDESC ddsc); From 5ac6cf55a9920265e96efd5074763578354c352b Mon Sep 17 00:00:00 2001 From: Angel <67720650+AngelTomkins@users.noreply.github.com> Date: Fri, 6 Oct 2023 01:26:48 -0400 Subject: [PATCH 08/14] Corrected typo in reccmp.py (#169) --- tools/reccmp/reccmp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index e0962534..f26ab764 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -114,7 +114,7 @@ def __init__(self, unix_cwd): def get_wine_path(self, unix_fn: str) -> str: if unix_fn.startswith('./'): - return self.win_cmd + '\\' + unix_fn[2:].replace('/', '\\') + return self.win_cwd + '\\' + unix_fn[2:].replace('/', '\\') if unix_fn.startswith(self.unix_cwd): return self.win_cwd + '\\' + unix_fn.removeprefix(self.unix_cwd).replace('/', '\\').lstrip('\\') return self._call_winepath_unix2win(unix_fn) From 1da1d291a8c14a8f594d26b1f2ae37c745819ced Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 6 Oct 2023 09:00:00 -0400 Subject: [PATCH 09/14] Fix line endings --- LEGO1/mxmidimanager.cpp | 320 ++++++++++++++++++++-------------------- LEGO1/mxmidimanager.h | 82 +++++----- 2 files changed, 201 insertions(+), 201 deletions(-) diff --git a/LEGO1/mxmidimanager.cpp b/LEGO1/mxmidimanager.cpp index 62bcb6d2..26b977df 100644 --- a/LEGO1/mxmidimanager.cpp +++ b/LEGO1/mxmidimanager.cpp @@ -1,161 +1,161 @@ -#include "mxmidimanager.h" -#include "mxomni.h" -#include - -DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); - -// OFFSET: LEGO1 0x100c05a0 -MxMIDIManager::MxMIDIManager() -{ - Init(); -} - -// OFFSET: LEGO1 0x100c0630 -MxMIDIManager::~MxMIDIManager() -{ - LockedReinitialize(TRUE); -} - -// OFFSET: LEGO1 0x100c0b20 -void MxMIDIManager::DeinitializeMIDI() -{ - m_criticalSection.Enter(); - - if (this->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(); - } - - this->m_criticalSection.Leave(); -} - -// OFFSET: LEGO1 0x100c0690 -void MxMIDIManager::Init() -{ - this->m_multiplier = 100; - InitData(); -} - -// OFFSET: LEGO1 0x100c06a0 -void MxMIDIManager::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; -} - -// OFFSET: LEGO1 0x100c06c0 -void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) -{ - if (this->m_thread) - { - this->m_thread->Terminate(); - if (this->m_thread) - { - delete m_thread; - } - } - else - { - TickleManager()->UnregisterClient(this); - } - - this->m_criticalSection.Enter(); - DeinitializeMIDI(); - Init(); - this->m_criticalSection.Leave(); - - if (!p_skipDestroy) - { - MxAudioManager::Destroy(); - } -} - -// OFFSET: LEGO1 0x100c0930 -void MxMIDIManager::Destroy() -{ - LockedReinitialize(FALSE); -} - -// OFFSET: LEGO1 0x100c09a0 -MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) -{ - MxS32 result = (p_volume * 0xffff) / 100; - return (result << 0x10) | result; -} - -// OFFSET: LEGO1 0x100c07f0 -void MxMIDIManager::SetMIDIVolume() -{ - MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; - HMIDISTRM streamHandle = this->m_MIDIStreamH; - - if (streamHandle) - { - MxS32 volume = CalculateVolume(result); - midiOutSetVolume(streamHandle, volume); - } -} - -// OFFSET: LEGO1 0x100c0940 -void MxMIDIManager::SetVolume(MxS32 p_volume) -{ - MxAudioManager::SetVolume(p_volume); - this->m_criticalSection.Enter(); - SetMIDIVolume(); - this->m_criticalSection.Leave(); -} - -// OFFSET: LEGO1 0x100c0840 -MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) -{ - MxResult status = FAILURE; - MxBool locked = FALSE; - - MxResult result = MxAudioManager::InitPresenters(); - 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->Start(0, 0) == SUCCESS) - { - status = SUCCESS; - } - } - } - else - { - TickleManager()->RegisterClient(this, p_frequencyMS); - status = SUCCESS; - } - } - - if (status != SUCCESS) - { - Destroy(); - } - - if (locked) - { - this->m_criticalSection.Leave(); - } - - return status; +#include "mxmidimanager.h" +#include "mxomni.h" +#include + +DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); + +// OFFSET: LEGO1 0x100c05a0 +MxMIDIManager::MxMIDIManager() +{ + Init(); +} + +// OFFSET: LEGO1 0x100c0630 +MxMIDIManager::~MxMIDIManager() +{ + LockedReinitialize(TRUE); +} + +// OFFSET: LEGO1 0x100c0b20 +void MxMIDIManager::DeinitializeMIDI() +{ + m_criticalSection.Enter(); + + if (this->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(); + } + + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0690 +void MxMIDIManager::Init() +{ + this->m_multiplier = 100; + InitData(); +} + +// OFFSET: LEGO1 0x100c06a0 +void MxMIDIManager::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; +} + +// OFFSET: LEGO1 0x100c06c0 +void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) +{ + if (this->m_thread) + { + this->m_thread->Terminate(); + if (this->m_thread) + { + delete m_thread; + } + } + else + { + TickleManager()->UnregisterClient(this); + } + + this->m_criticalSection.Enter(); + DeinitializeMIDI(); + Init(); + this->m_criticalSection.Leave(); + + if (!p_skipDestroy) + { + MxAudioManager::Destroy(); + } +} + +// OFFSET: LEGO1 0x100c0930 +void MxMIDIManager::Destroy() +{ + LockedReinitialize(FALSE); +} + +// OFFSET: LEGO1 0x100c09a0 +MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) +{ + MxS32 result = (p_volume * 0xffff) / 100; + return (result << 0x10) | result; +} + +// OFFSET: LEGO1 0x100c07f0 +void MxMIDIManager::SetMIDIVolume() +{ + MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; + HMIDISTRM streamHandle = this->m_MIDIStreamH; + + if (streamHandle) + { + MxS32 volume = CalculateVolume(result); + midiOutSetVolume(streamHandle, volume); + } +} + +// OFFSET: LEGO1 0x100c0940 +void MxMIDIManager::SetVolume(MxS32 p_volume) +{ + MxAudioManager::SetVolume(p_volume); + this->m_criticalSection.Enter(); + SetMIDIVolume(); + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0840 +MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +{ + MxResult status = FAILURE; + MxBool locked = FALSE; + + MxResult result = MxAudioManager::InitPresenters(); + 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->Start(0, 0) == SUCCESS) + { + status = SUCCESS; + } + } + } + else + { + TickleManager()->RegisterClient(this, p_frequencyMS); + status = SUCCESS; + } + } + + if (status != SUCCESS) + { + Destroy(); + } + + if (locked) + { + this->m_criticalSection.Leave(); + } + + return status; } \ No newline at end of file diff --git a/LEGO1/mxmidimanager.h b/LEGO1/mxmidimanager.h index f944d67d..dd362594 100644 --- a/LEGO1/mxmidimanager.h +++ b/LEGO1/mxmidimanager.h @@ -1,42 +1,42 @@ -#ifndef MXMIDIMANAGER_H -#define MXMIDIMANAGER_H - -#include "decomp.h" -#include "mxaudiomanager.h" - -// VTABLE 0x100dc930 -// SIZE 0x58 -class MxMIDIManager : public MxAudioManager -{ -public: - MxMIDIManager(); - virtual ~MxMIDIManager() override; - - virtual void Destroy() override; // vtable+18 - virtual void SetVolume(MxS32 p_volume) override; // vtable+2c - virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 - -private: - void LockedReinitialize(MxBool p_skipDestroy); - void DeinitializeMIDI(); - - MxS32 CalculateVolume(MxS32 p_volume); - void SetMIDIVolume(); - - HMIDISTRM m_MIDIStreamH; // 0x30 - MxBool m_MIDIInitialized; // 0x34 - undefined4 m_unk38; // 0x38 - undefined4 m_unk3c; // 0x3c - undefined4 m_unk40; // 0x40 - undefined4 m_unk44; // 0x44 - undefined4 m_unk48; // 0x48 - MIDIHDR *m_MIDIHdrP; // 0x4c - MxS32 m_multiplier; // 0x50 - DWORD m_MIDIVolume; // 0x54 - -protected: - void Init(); - void InitData(); -}; - +#ifndef MXMIDIMANAGER_H +#define MXMIDIMANAGER_H + +#include "decomp.h" +#include "mxaudiomanager.h" + +// VTABLE 0x100dc930 +// SIZE 0x58 +class MxMIDIManager : public MxAudioManager +{ +public: + MxMIDIManager(); + virtual ~MxMIDIManager() override; + + virtual void Destroy() override; // vtable+18 + virtual void SetVolume(MxS32 p_volume) override; // vtable+2c + virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 + +private: + void LockedReinitialize(MxBool p_skipDestroy); + void DeinitializeMIDI(); + + MxS32 CalculateVolume(MxS32 p_volume); + void SetMIDIVolume(); + + HMIDISTRM m_MIDIStreamH; // 0x30 + MxBool m_MIDIInitialized; // 0x34 + undefined4 m_unk38; // 0x38 + undefined4 m_unk3c; // 0x3c + undefined4 m_unk40; // 0x40 + undefined4 m_unk44; // 0x44 + undefined4 m_unk48; // 0x48 + MIDIHDR *m_MIDIHdrP; // 0x4c + MxS32 m_multiplier; // 0x50 + DWORD m_MIDIVolume; // 0x54 + +protected: + void Init(); + void InitData(); +}; + #endif // MXMIDIMANAGER_H \ No newline at end of file From 7f5198220c6aef7eda3f675f0b4a774b5d03037e Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 12:54:58 -0400 Subject: [PATCH 10/14] Unstub MxLoopingFlcPresenter destructor (#173) sorry guys --- LEGO1/mxloopingflcpresenter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp index 54002246..58b066f6 100644 --- a/LEGO1/mxloopingflcpresenter.cpp +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -10,7 +10,7 @@ MxLoopingFlcPresenter::MxLoopingFlcPresenter() Init(); } -// OFFSET: LEGO1 0x100b43b0 STUB +// OFFSET: LEGO1 0x100b43b0 MxLoopingFlcPresenter::~MxLoopingFlcPresenter() { Destroy(TRUE); From 1217e4aa58996df88b29a0239761d7dda35b90f7 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 13:00:49 -0400 Subject: [PATCH 11/14] MxMusicPresenter dtor, stub destroy (#174) * MxMusicPresenter dtor, stub destroy * Fix destructor declaration --------- Co-authored-by: Christian Semmler --- LEGO1/mxmusicpresenter.cpp | 12 ++++++++++++ LEGO1/mxmusicpresenter.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/LEGO1/mxmusicpresenter.cpp b/LEGO1/mxmusicpresenter.cpp index d33627ad..72ae273a 100644 --- a/LEGO1/mxmusicpresenter.cpp +++ b/LEGO1/mxmusicpresenter.cpp @@ -6,7 +6,19 @@ MxMusicPresenter::MxMusicPresenter() Init(); } +// OFFSET: LEGO1 0x100c24e0 +MxMusicPresenter::~MxMusicPresenter() +{ + Destroy(TRUE); +} + // OFFSET: LEGO1 0x100c2540 void MxMusicPresenter::Init() { +} + +// OFFSET: LEGO1 0x100c2550 STUB +void MxMusicPresenter::Destroy(MxBool) +{ + // TODO } \ No newline at end of file diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h index c8e88604..a000c2b9 100644 --- a/LEGO1/mxmusicpresenter.h +++ b/LEGO1/mxmusicpresenter.h @@ -21,9 +21,11 @@ class MxMusicPresenter : public MxAudioPresenter } MxMusicPresenter(); + virtual ~MxMusicPresenter() override; private: void Init(); + void Destroy(MxBool); }; #endif // MXMUSICPRESENTER_H From 85fe4ad07aa7fb13c928673e078e4da82d174cdf Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 18:17:49 -0400 Subject: [PATCH 12/14] MxAudioPresenter - vtable functions (#175) * MxAudioPresenter - vtable functions * Rename parameter --------- Co-authored-by: Christian Semmler --- LEGO1/mxaudiopresenter.cpp | 12 ++++++++++++ LEGO1/mxaudiopresenter.h | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/LEGO1/mxaudiopresenter.cpp b/LEGO1/mxaudiopresenter.cpp index ac634362..48a02377 100644 --- a/LEGO1/mxaudiopresenter.cpp +++ b/LEGO1/mxaudiopresenter.cpp @@ -3,3 +3,15 @@ #include "decomp.h" DECOMP_SIZE_ASSERT(MxAudioPresenter, 0x54); + +// OFFSET: LEGO1 0x1000d260 +undefined4 MxAudioPresenter::vtable5c() +{ + return this->m_unk50; +} + +// OFFSET: LEGO1 0x1000d270 +void MxAudioPresenter::vtable60(undefined4 p_unk50) +{ + this->m_unk50 = p_unk50; +} diff --git a/LEGO1/mxaudiopresenter.h b/LEGO1/mxaudiopresenter.h index c1001a13..fb2e75a8 100644 --- a/LEGO1/mxaudiopresenter.h +++ b/LEGO1/mxaudiopresenter.h @@ -1,6 +1,7 @@ #ifndef MXAUDIOPRESENTER_H #define MXAUDIOPRESENTER_H +#include "decomp.h" #include "mxmediapresenter.h" // VTABLE 0x100d4c70 @@ -24,7 +25,10 @@ class MxAudioPresenter : public MxMediaPresenter return !strcmp(name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(name); } - int m_unk50; + virtual undefined4 vtable5c(); + virtual void vtable60(undefined4); + + undefined4 m_unk50; }; #endif // MXAUDIOPRESENTER_H From 50b9a6dea5631042b956cf5996008fe226fa688e Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 7 Oct 2023 09:05:44 -0400 Subject: [PATCH 13/14] Implement Start() (#176) * Implement Start() * Undo isleapp changes * Implement LegoOmni::Start * fix vtable0x20 * Address review * fix build --- LEGO1/legoomni.cpp | 20 ++++++++++++++------ LEGO1/legoomni.h | 5 ++--- LEGO1/mxdsobject.h | 1 + LEGO1/mxomni.cpp | 16 +++++++++++----- LEGO1/mxomni.h | 2 +- LEGO1/mxstreamcontroller.cpp | 19 +++++++++++++++++++ LEGO1/mxstreamcontroller.h | 4 ++++ LEGO1/mxstreamer.cpp | 16 ++++++++++++++++ LEGO1/mxstreamer.h | 2 ++ 9 files changed, 70 insertions(+), 15 deletions(-) diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 929ba556..58eed5c1 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -99,11 +99,10 @@ void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) g_omniUserMessage = p_userMsg; } -// OFFSET: LEGO1 0x100acf50 STUB -MxLong Start(MxDSAction *) +// OFFSET: LEGO1 0x100acf50 +MxResult Start(MxDSAction* p_dsAction) { - // TODO - return 0; + return MxOmni::GetInstance()->Start(p_dsAction); } // OFFSET: LEGO1 0x1005ad10 @@ -257,6 +256,10 @@ void LegoOmni::Init() MxResult LegoOmni::Create(COMPAT_CONST MxOmniCreateParam &p) { // FIXME: Stub + MxOmni::Create(p); + m_gameState = new LegoGameState(); + m_bkgAudioManager = new MxBackgroundAudioManager(); + return SUCCESS; } @@ -265,9 +268,14 @@ void LegoOmni::Destroy() // FIXME: Stub } -void LegoOmni::vtable0x20() +// OFFSET: LEGO1 0x1005b580 +MxResult LegoOmni::Start(MxDSAction* action) { - // FIXME: Stub + MxResult result = MxOmni::Start(action); + this->m_action.SetAtomId(action->GetAtomId()); + this->m_action.SetObjectId(action->GetObjectId()); + this->m_action.SetUnknown24(action->GetUnknown24()); + return result; } void LegoOmni::DeleteObject(MxDSAction &ds) diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 4a5fe6e4..044275b4 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -55,7 +55,7 @@ class LegoOmni : public MxOmni virtual void Init() override; // vtable+14 virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p) override; // vtable+18 virtual void Destroy() override; // vtable+1c - virtual void vtable0x20() override; + virtual MxResult Start(MxDSAction* action) override; virtual void DeleteObject(MxDSAction &ds) override; virtual MxBool DoesEntityExist(MxDSAction &ds) override; virtual void vtable0x2c() override; @@ -110,10 +110,9 @@ __declspec(dllexport) LegoEntity * PickEntity(MxLong,MxLong); __declspec(dllexport) LegoROI * PickROI(MxLong,MxLong); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); __declspec(dllexport) LegoSoundManager * SoundManager(); -__declspec(dllexport) MxLong Start(MxDSAction *); +__declspec(dllexport) MxResult Start(MxDSAction*); __declspec(dllexport) MxTransitionManager * TransitionManager(); __declspec(dllexport) LegoVideoManager * VideoManager(); -__declspec(dllexport) MxLong Start(MxDSAction *a); LegoBuildingManager* BuildingManager(); Isle* GetIsle(); diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 1ca3d98a..e340789a 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -36,6 +36,7 @@ class MxDSObject : public MxCore inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline MxU32 GetObjectId() { return this->m_objectId; } + inline MxS16 GetUnknown24() { return this->m_unk24; } inline void SetObjectId(MxU32 p_objectId) { this->m_objectId = p_objectId; } inline void SetUnknown24(MxS16 p_unk24) { this->m_unk24 = p_unk24; } diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 200e5bdf..ed870b34 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -42,10 +42,16 @@ void MxOmni::Init() m_unk64 = NULL; } -// OFFSET: LEGO1 0x100b0090 STUB -void MxOmni::vtable0x20() +// OFFSET: LEGO1 0x100b0090 +MxResult MxOmni::Start(MxDSAction* p_dsAction) { - // TODO + MxResult result = FAILURE; + if(p_dsAction->GetAtomId().GetInternal() != NULL && p_dsAction->GetObjectId() != -1 && m_streamer != NULL) + { + result = m_streamer->Unknown100b99b0(p_dsAction); + } + + return result; } // OFFSET: LEGO1 0x100b00c0 STUB @@ -258,7 +264,7 @@ MxAtomIdCounterSet *AtomIdCounterSet() MxStreamer* Streamer() { return MxOmni::GetInstance()->GetStreamer(); -} +} // OFFSET: LEGO1 0x100acf00 MxSoundManager* MSoundManager() @@ -288,4 +294,4 @@ MxMusicManager* MusicManager() MxEventManager* EventManager() { return MxOmni::GetInstance()->GetEventManager(); -} \ No newline at end of file +} diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index a8fa9db8..9c7d6b0a 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -38,7 +38,7 @@ class MxOmni : public MxCore virtual void Init(); // vtable+14 virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c - virtual void vtable0x20(); // vtable+20 + virtual MxResult Start(MxDSAction* p_dsAction); // vtable+20 virtual void DeleteObject(MxDSAction &ds); // vtable+24 virtual MxBool DoesEntityExist(MxDSAction &ds); // vtable+28 virtual void vtable0x2c(); // vtable+2c diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index 09f2d95c..e219f357 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -30,3 +30,22 @@ MxResult MxStreamController::Open(const char *p_filename) return SUCCESS; } + +// OFFSET: LEGO1 0x100b9400 +MxResult MxStreamController::vtable0x18(undefined4 p_unknown, undefined4 p_unknown2) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100b9410 +MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unknown2) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100c1690 STUB +MxResult MxStreamController::vtable0x20(MxDSAction* action) +{ + // TODO STUB + return FAILURE; +} diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index c7e4309e..0f459ed0 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -6,6 +6,7 @@ #include "mxcriticalsection.h" #include "mxcore.h" #include "mxdsobject.h" +#include "mxdsaction.h" // VTABLE 0x100dc968 // SIZE 0x64 @@ -30,6 +31,9 @@ class MxStreamController : public MxCore } virtual MxResult Open(const char *p_filename); // vtable+0x14 + virtual MxResult vtable0x18(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x18 + virtual MxResult vtable0x1C(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x1c + virtual MxResult vtable0x20(MxDSAction* action); //vtable+0x20 MxBool FUN_100c20d0(MxDSObject &p_obj); diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index 2121773e..53d7303f 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -133,6 +133,22 @@ MxResult MxStreamer::AddStreamControllerToOpenList(MxStreamController *stream) return FAILURE; } +// OFFSET: LEGO1 0x100b99b0 +MxResult MxStreamer::Unknown100b99b0(MxDSAction* p_action) +{ + MxStreamController* controller; + if (p_action != NULL && p_action->GetAtomId().GetInternal() != NULL && p_action->GetObjectId() != -1) + { + controller = GetOpenStream(p_action->GetAtomId().GetInternal()); + if (controller == NULL) + { + return FAILURE; + } + return controller->vtable0x20(p_action); + } + return FAILURE; +} + // OFFSET: LEGO1 0x100b9b60 MxLong MxStreamer::Notify(MxParam &p) { diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 5ab02cbb..c900feb9 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -96,6 +96,8 @@ class MxStreamer : public MxCore MxResult AddStreamControllerToOpenList(MxStreamController *p_stream); + MxResult MxStreamer::Unknown100b99b0(MxDSAction* p_action); + private: list m_openStreams; // 0x8 MxStreamerSubClass2 m_subclass1; // 0x14 From 775ee9f05fee0c02e2f66cb672670d83f23f23d7 Mon Sep 17 00:00:00 2001 From: DmitriLeon2000 Date: Sun, 8 Oct 2023 00:02:12 +0900 Subject: [PATCH 14/14] Move MxMIDIManager to MxMusicManager (#178) --- CMakeLists.txt | 2 +- LEGO1/mxmidimanager.h | 42 ------------------- .../{mxmidimanager.cpp => mxmusicmanager.cpp} | 26 ++++++------ LEGO1/mxmusicmanager.h | 37 ++++++++++++++-- 4 files changed, 48 insertions(+), 59 deletions(-) delete mode 100644 LEGO1/mxmidimanager.h rename LEGO1/{mxmidimanager.cpp => mxmusicmanager.cpp} (82%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 818d3773..0e2135c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,8 +140,8 @@ add_library(lego1 SHARED LEGO1/mxmatrix.cpp LEGO1/mxmediamanager.cpp LEGO1/mxmediapresenter.cpp - LEGO1/mxmidimanager.cpp LEGO1/mxmidipresenter.cpp + LEGO1/mxmusicmanager.cpp LEGO1/mxmusicpresenter.cpp LEGO1/mxnotificationmanager.cpp LEGO1/mxobjectfactory.cpp diff --git a/LEGO1/mxmidimanager.h b/LEGO1/mxmidimanager.h deleted file mode 100644 index dd362594..00000000 --- a/LEGO1/mxmidimanager.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef MXMIDIMANAGER_H -#define MXMIDIMANAGER_H - -#include "decomp.h" -#include "mxaudiomanager.h" - -// VTABLE 0x100dc930 -// SIZE 0x58 -class MxMIDIManager : public MxAudioManager -{ -public: - MxMIDIManager(); - virtual ~MxMIDIManager() override; - - virtual void Destroy() override; // vtable+18 - virtual void SetVolume(MxS32 p_volume) override; // vtable+2c - virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 - -private: - void LockedReinitialize(MxBool p_skipDestroy); - void DeinitializeMIDI(); - - MxS32 CalculateVolume(MxS32 p_volume); - void SetMIDIVolume(); - - HMIDISTRM m_MIDIStreamH; // 0x30 - MxBool m_MIDIInitialized; // 0x34 - undefined4 m_unk38; // 0x38 - undefined4 m_unk3c; // 0x3c - undefined4 m_unk40; // 0x40 - undefined4 m_unk44; // 0x44 - undefined4 m_unk48; // 0x48 - MIDIHDR *m_MIDIHdrP; // 0x4c - MxS32 m_multiplier; // 0x50 - DWORD m_MIDIVolume; // 0x54 - -protected: - void Init(); - void InitData(); -}; - -#endif // MXMIDIMANAGER_H \ No newline at end of file diff --git a/LEGO1/mxmidimanager.cpp b/LEGO1/mxmusicmanager.cpp similarity index 82% rename from LEGO1/mxmidimanager.cpp rename to LEGO1/mxmusicmanager.cpp index 26b977df..247b6596 100644 --- a/LEGO1/mxmidimanager.cpp +++ b/LEGO1/mxmusicmanager.cpp @@ -1,23 +1,23 @@ -#include "mxmidimanager.h" +#include "mxmusicmanager.h" #include "mxomni.h" #include -DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); +DECOMP_SIZE_ASSERT(MxMusicManager, 0x58); // OFFSET: LEGO1 0x100c05a0 -MxMIDIManager::MxMIDIManager() +MxMusicManager::MxMusicManager() { Init(); } // OFFSET: LEGO1 0x100c0630 -MxMIDIManager::~MxMIDIManager() +MxMusicManager::~MxMusicManager() { LockedReinitialize(TRUE); } // OFFSET: LEGO1 0x100c0b20 -void MxMIDIManager::DeinitializeMIDI() +void MxMusicManager::DeinitializeMIDI() { m_criticalSection.Enter(); @@ -36,14 +36,14 @@ void MxMIDIManager::DeinitializeMIDI() } // OFFSET: LEGO1 0x100c0690 -void MxMIDIManager::Init() +void MxMusicManager::Init() { this->m_multiplier = 100; InitData(); } // OFFSET: LEGO1 0x100c06a0 -void MxMIDIManager::InitData() +void MxMusicManager::InitData() { this->m_MIDIStreamH = 0; this->m_MIDIInitialized = FALSE; @@ -56,7 +56,7 @@ void MxMIDIManager::InitData() } // OFFSET: LEGO1 0x100c06c0 -void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) +void MxMusicManager::LockedReinitialize(MxBool p_skipDestroy) { if (this->m_thread) { @@ -83,20 +83,20 @@ void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) } // OFFSET: LEGO1 0x100c0930 -void MxMIDIManager::Destroy() +void MxMusicManager::Destroy() { LockedReinitialize(FALSE); } // OFFSET: LEGO1 0x100c09a0 -MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) +MxS32 MxMusicManager::CalculateVolume(MxS32 p_volume) { MxS32 result = (p_volume * 0xffff) / 100; return (result << 0x10) | result; } // OFFSET: LEGO1 0x100c07f0 -void MxMIDIManager::SetMIDIVolume() +void MxMusicManager::SetMIDIVolume() { MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; HMIDISTRM streamHandle = this->m_MIDIStreamH; @@ -109,7 +109,7 @@ void MxMIDIManager::SetMIDIVolume() } // OFFSET: LEGO1 0x100c0940 -void MxMIDIManager::SetVolume(MxS32 p_volume) +void MxMusicManager::SetVolume(MxS32 p_volume) { MxAudioManager::SetVolume(p_volume); this->m_criticalSection.Enter(); @@ -118,7 +118,7 @@ void MxMIDIManager::SetVolume(MxS32 p_volume) } // OFFSET: LEGO1 0x100c0840 -MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +MxResult MxMusicManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) { MxResult status = FAILURE; MxBool locked = FALSE; diff --git a/LEGO1/mxmusicmanager.h b/LEGO1/mxmusicmanager.h index 4288ed1e..1a828c84 100644 --- a/LEGO1/mxmusicmanager.h +++ b/LEGO1/mxmusicmanager.h @@ -1,11 +1,42 @@ #ifndef MXMUSICMANAGER_H #define MXMUSICMANAGER_H -#include "mxcore.h" +#include "decomp.h" +#include "mxaudiomanager.h" // VTABLE 0x100dc930 -class MxMusicManager : public MxCore +// SIZE 0x58 +class MxMusicManager : public MxAudioManager { +public: + MxMusicManager(); + virtual ~MxMusicManager() override; + + virtual void Destroy() override; // vtable+18 + virtual void SetVolume(MxS32 p_volume) override; // vtable+2c + virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 + +private: + void LockedReinitialize(MxBool p_skipDestroy); + void DeinitializeMIDI(); + + MxS32 CalculateVolume(MxS32 p_volume); + void SetMIDIVolume(); + + HMIDISTRM m_MIDIStreamH; // 0x30 + MxBool m_MIDIInitialized; // 0x34 + undefined4 m_unk38; // 0x38 + undefined4 m_unk3c; // 0x3c + undefined4 m_unk40; // 0x40 + undefined4 m_unk44; // 0x44 + undefined4 m_unk48; // 0x48 + MIDIHDR *m_MIDIHdrP; // 0x4c + MxS32 m_multiplier; // 0x50 + DWORD m_MIDIVolume; // 0x54 + +protected: + void Init(); + void InitData(); }; -#endif // MXMUSICMANAGER_H +#endif // MXMUSICMANAGER_H \ No newline at end of file