diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index f3ba3a81..8786145e 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -11,6 +11,9 @@ // 0x100f4588 MxAtomId *g_nocdSourceName = NULL; +// 0x100f456c +MxAtomId *g_jukeboxScript = NULL; + // 0x101020e8 void (*g_omniUserMessage)(const char *,int); @@ -26,10 +29,11 @@ LegoOmni::~LegoOmni() Destroy(); } -// OFFSET: LEGO1 0x1005b560 STUB +// OFFSET: LEGO1 0x1005b560 void LegoOmni::CreateBackgroundAudio() { - // TODO + if (m_bkgAudioManager) + m_bkgAudioManager->Create(*g_jukeboxScript, 100); } // OFFSET: LEGO1 0x1005af10 STUB @@ -308,9 +312,10 @@ MxResult LegoOmni::Start(MxDSAction* action) return result; } -void LegoOmni::DeleteObject(MxDSAction &ds) +MxResult LegoOmni::DeleteObject(MxDSAction &ds) { // FIXME: Stub + return FAILURE; } MxBool LegoOmni::DoesEntityExist(MxDSAction &ds) diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 7404e8fa..8a61c2df 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -57,7 +57,7 @@ public: virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p) override; // vtable+18 virtual void Destroy() override; // vtable+1c virtual MxResult Start(MxDSAction* action) override; - virtual void DeleteObject(MxDSAction &ds) override; + virtual MxResult DeleteObject(MxDSAction &ds) override; virtual MxBool DoesEntityExist(MxDSAction &ds) override; virtual void vtable0x2c() override; virtual int vtable0x30(char*, int, MxCore*) override; diff --git a/LEGO1/mxbackgroundaudiomanager.cpp b/LEGO1/mxbackgroundaudiomanager.cpp index 40891bef..cbf480fc 100644 --- a/LEGO1/mxbackgroundaudiomanager.cpp +++ b/LEGO1/mxbackgroundaudiomanager.cpp @@ -1,6 +1,8 @@ #include "mxbackgroundaudiomanager.h" #include "mxomni.h" +#include "mxstreamer.h" +#include "mxticklemanager.h" DECOMP_SIZE_ASSERT(MxBackgroundAudioManager, 0x150) @@ -20,14 +22,29 @@ MxBackgroundAudioManager::MxBackgroundAudioManager() // OFFSET: LEGO1 0x1007ec20 MxBackgroundAudioManager::~MxBackgroundAudioManager() { - // TODO + TickleManager()->UnregisterClient(this); NotificationManager()->Unregister(this); + DestroyMusic(); } // OFFSET: LEGO1 0x1007f470 void MxBackgroundAudioManager::Stop() { - // TODO + if (m_action2.GetObjectId() != -1) + DeleteObject(m_action2); + + m_unk138 = 0; + m_action2.SetAtomId(MxAtomId()); + m_action2.SetObjectId(-1); + + if (m_action1.GetObjectId() != -1) + DeleteObject(m_action1); + + m_unka0 = 0; + m_action1.SetAtomId(MxAtomId()); + m_unk148 = 0; + m_action1.SetObjectId(-1); + m_unk13c = 0; } // OFFSET: LEGO1 0x1007f5f0 @@ -47,3 +64,45 @@ void MxBackgroundAudioManager::Init() this->m_unka0 = 0; this->m_unk13c = 0; } + +// OFFSET: LEGO1 0x1007ece0 +MxResult MxBackgroundAudioManager::Create(MxAtomId &p_script, MxU32 p_frequencyMS) +{ + MxResult result = OpenMusic(p_script); + + if (result == SUCCESS) { + TickleManager()->RegisterClient(this, p_frequencyMS); + m_musicEnabled = TRUE; + } + + return result; +} + +// OFFSET: LEGO1 0x1007ed20 +MxResult MxBackgroundAudioManager::OpenMusic(MxAtomId &p_script) +{ + if (m_script.GetInternal()) + DestroyMusic(); + + MxResult result = FAILURE; + + if (Streamer()->Open(p_script.GetInternal(), 0)) { + m_script = p_script; + result = SUCCESS; + } + + return result; +} + +// OFFSET: LEGO1 0x1007ed70 +void MxBackgroundAudioManager::DestroyMusic() +{ + if (m_script.GetInternal()) { + MxDSAction ds; + ds.SetAtomId(m_script); + ds.SetUnknown24(-2); + DeleteObject(ds); + Streamer()->Close(m_script.GetInternal()); + m_musicEnabled = FALSE; + } +} \ No newline at end of file diff --git a/LEGO1/mxbackgroundaudiomanager.h b/LEGO1/mxbackgroundaudiomanager.h index a2c4cae3..f81fe854 100644 --- a/LEGO1/mxbackgroundaudiomanager.h +++ b/LEGO1/mxbackgroundaudiomanager.h @@ -28,10 +28,13 @@ public: } __declspec(dllexport) void Enable(unsigned char p); + virtual MxResult Create(MxAtomId &p_script, MxU32 p_frequencyMS); void Stop(); private: void Init(); + MxResult OpenMusic(MxAtomId &p_script); + void DestroyMusic(); MxBool m_musicEnabled; // 0x8 MxDSAction m_action1; // 0xc @@ -42,7 +45,7 @@ private: MxS32 m_unk140; MxS32 m_unk144; MxS16 m_unk148; - MxAtomId m_unk14c; + MxAtomId m_script; }; #endif // MXBACKGROUNDAUDIOMANAGER_H diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index fab1c99b..0265cc74 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -68,9 +68,10 @@ MxResult MxOmni::Start(MxDSAction* p_dsAction) } // OFFSET: LEGO1 0x100b00c0 STUB -void MxOmni::DeleteObject(MxDSAction &p_dsAction) +MxResult MxOmni::DeleteObject(MxDSAction &p_dsAction) { // TODO + return FAILURE; } // OFFSET: LEGO1 0x100b09a0 @@ -231,7 +232,7 @@ MxResult MxOmni::Create(MxOmniCreateParam &p) } if (p.CreateFlags().CreateStreamer()) { - if (!(m_streamer = new MxStreamer()) || m_streamer->Create() != SUCCESS) + if (!(m_streamer = new MxStreamer()) || m_streamer->Create() != SUCCESS) goto done; } @@ -402,3 +403,9 @@ MxEventManager* EventManager() { return MxOmni::GetInstance()->GetEventManager(); } + +// OFFSET: LEGO1 0x100acf70 +MxResult DeleteObject(MxDSAction &p_dsAction) +{ + return MxOmni::GetInstance()->DeleteObject(p_dsAction); +} \ No newline at end of file diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 630d2214..430c0fe6 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -42,7 +42,7 @@ public: virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c virtual MxResult Start(MxDSAction* p_dsAction); // vtable+20 - virtual void DeleteObject(MxDSAction &p_dsAction); // vtable+24 + virtual MxResult DeleteObject(MxDSAction &p_dsAction); // vtable+24 virtual MxBool DoesEntityExist(MxDSAction &p_dsAction); // vtable+28 virtual void vtable0x2c(); // vtable+2c virtual int vtable0x30(char*, int, MxCore*); // vtable+30 @@ -95,6 +95,7 @@ __declspec(dllexport) MxMusicManager * MusicManager(); __declspec(dllexport) MxEventManager * EventManager(); __declspec(dllexport) MxNotificationManager * NotificationManager(); +MxResult DeleteObject(MxDSAction &p_dsAction); MxVideoManager *MVideoManager(); MxAtomIdCounterSet *AtomIdCounterSet(); MxObjectFactory *ObjectFactory();