Implement/match MxCompositeMediaPresenter::StartAction

This commit is contained in:
Christian Semmler 2023-12-13 16:49:41 -05:00
parent 403b3dddb4
commit ee0fba1dd9
2 changed files with 63 additions and 4 deletions

View File

@ -1,7 +1,12 @@
#include "mxcompositemediapresenter.h" #include "mxcompositemediapresenter.h"
#include "legoomni.h" #include "legoomni.h"
#include "legosoundmanager.h"
#include "legovideomanager.h" #include "legovideomanager.h"
#include "mxautolocker.h"
#include "mxdsmultiaction.h"
#include "mxobjectfactory.h"
#include "mxtimer.h"
DECOMP_SIZE_ASSERT(MxCompositeMediaPresenter, 0x50) DECOMP_SIZE_ASSERT(MxCompositeMediaPresenter, 0x50)
@ -19,11 +24,65 @@ MxCompositeMediaPresenter::~MxCompositeMediaPresenter()
VideoManager()->RemovePresenter(*this); VideoManager()->RemovePresenter(*this);
} }
// STUB: LEGO1 0x10074090 // FUNCTION: LEGO1 0x10074090
MxResult MxCompositeMediaPresenter::StartAction(MxStreamController* p_controller, MxDSAction* p_action) MxResult MxCompositeMediaPresenter::StartAction(MxStreamController* p_controller, MxDSAction* p_action)
{ {
// TODO MxAutoLocker lock(&m_criticalSection);
return SUCCESS;
MxResult result = FAILURE;
MxDSActionList* actions = ((MxDSMultiAction*) p_action)->GetActionList();
MxDSActionListCursor cursor(actions);
MxDSAction* action;
if (MxPresenter::StartAction(p_controller, p_action) == SUCCESS) {
// The usual cursor.Next() loop doesn't match here, even though
// the logic is the same. It does match when "deconstructed" into
// the following Head(), Current() and NextFragment() calls,
// but this seems unlikely to be the original code.
// The alpha debug build also uses Next().
// cursor.Head();
// while (cursor.Current(action)) {
// cursor.NextFragment();
while (cursor.Next(action)) {
MxBool success = FALSE;
action->CopyFlags(m_action->GetFlags());
const char* presenterName = PresenterNameDispatch(*action);
MxPresenter* presenter = (MxPresenter*) ObjectFactory()->Create(presenterName);
if (presenter && presenter->AddToManager() == SUCCESS) {
presenter->SetCompositePresenter(this);
if (presenter->StartAction(p_controller, action) == SUCCESS) {
presenter->SetTickleState(TickleState_Idle);
if (presenter->IsA("MxVideoPresenter"))
VideoManager()->RemovePresenter(*presenter);
else if (presenter->IsA("MxAudioPresenter"))
SoundManager()->RemovePresenter(*presenter);
success = TRUE;
}
}
if (success) {
action->SetOrigin(this);
m_list.push_back(presenter);
}
else if (presenter)
delete presenter;
}
if (!m_compositePresenter) {
SetTickleState(TickleState_Ready);
MxLong time = Timer()->GetTime();
m_action->SetUnknown90(time);
}
result = SUCCESS;
}
return result;
} }
// STUB: LEGO1 0x100742e0 // STUB: LEGO1 0x100742e0

View File

@ -39,7 +39,7 @@ class MxCompositePresenter : public MxPresenter {
virtual void VTable0x60(MxPresenter* p_presenter); // vtable+0x60 virtual void VTable0x60(MxPresenter* p_presenter); // vtable+0x60
virtual MxBool VTable0x64(undefined4 p_undefined); // vtable+0x64 virtual MxBool VTable0x64(undefined4 p_undefined); // vtable+0x64
private: protected:
MxCompositePresenterList m_list; // 0x40 MxCompositePresenterList m_list; // 0x40
}; };