implement most of MxBackgroundAudioManager (#232)

* implement most of MxBackgroundAudioManager

* Match OpenMusic to 100%, style fixes

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
Misha 2023-10-22 10:11:46 -04:00 committed by GitHub
parent 50fe5f9c83
commit 681ab9c026
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 85 additions and 10 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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

View file

@ -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);
}

View file

@ -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();