implement most of MxStreamer::Open

This commit is contained in:
MattKC 2023-09-25 16:32:17 -07:00
parent c439da1597
commit 5b2cfe99ea
2 changed files with 36 additions and 10 deletions

View File

@ -3,6 +3,8 @@
#include <algorithm>
#include "legoomni.h"
#include "mxdiskstreamcontroller.h"
#include "mxramstreamcontroller.h"
DECOMP_SIZE_ASSERT(MxStreamer, 0x2c);
@ -41,18 +43,36 @@ MxStreamer::~MxStreamer()
}
// OFFSET: LEGO1 0x100b92c0
MxStreamController *MxStreamer::Open(const char *name, MxU16 p_lookupType)
MxStreamController *MxStreamer::Open(const char *p_name, MxU16 p_lookupType)
{
// TODO
MxStreamController *stream = NULL;
MxStreamController *c = GetOpenStream(name);
if (!GetOpenStream(p_name)) {
switch (p_lookupType) {
case e_DiskStream:
stream = new MxDiskStreamController();
break;
case e_RAMStream:
stream = new MxRAMStreamController();
break;
}
return NULL;
if (!stream
|| stream->Open(p_name) != SUCCESS
|| AddStreamControllerToOpenList(stream) != SUCCESS) {
delete stream;
stream = NULL;
}
}
return stream;
}
// OFFSET: LEGO1 0x100b9570
// OFFSET: LEGO1 0x100b9570 STUB
MxLong MxStreamer::Close(const char *p)
{
// TODO: Incomplete
MxDSAction ds;
ds.SetUnknown24(-2);
@ -63,7 +83,7 @@ MxLong MxStreamer::Close(const char *p)
if (!p || !strcmp(p, c->atom.GetInternal())) {
m_openStreams.erase(it);
if (c->IsStillInUse()) {
if (!c->CanBeDeleted()) {
// TODO: Send notification to `c`
} else {
delete c;

View File

@ -42,11 +42,17 @@ class MxStreamerSubClass3 : public MxStreamerSubClass1
class MxStreamer : public MxCore
{
public:
MxStreamer();
virtual ~MxStreamer() override;
enum OpenMode
{
e_DiskStream,
e_RAMStream
};
__declspec(dllexport) MxStreamController *Open(const char *name, MxU16 p);
__declspec(dllexport) MxLong Close(const char *p);
MxStreamer();
virtual ~MxStreamer() override; // vtable+0x0
__declspec(dllexport) MxStreamController *Open(const char *p_name, MxU16 p_openMode);
__declspec(dllexport) MxLong Close(const char *p_name);
virtual MxLong Notify(MxParam &p) override; // vtable+0x4
@ -58,7 +64,7 @@ class MxStreamer : public MxCore
}
// OFFSET: LEGO1 0x100b9010
inline virtual MxBool IsA(const char *name) const override // vtable+0x10
inline virtual MxBool IsA(const char *p_name) const override // vtable+0x10
{
return !strcmp(name, MxStreamer::ClassName()) || MxCore::IsA(name);
}