Finish MxRAMStreamProvider

This commit is contained in:
Misha 2023-12-13 17:47:16 -05:00
parent 403b3dddb4
commit 69a1e72252
No known key found for this signature in database
GPG Key ID: 8441D12AEF33FED8
7 changed files with 102 additions and 9 deletions

View File

@ -1,6 +1,7 @@
#include "mxdsbuffer.h" #include "mxdsbuffer.h"
#include "mxomni.h" #include "mxomni.h"
#include "mxstreamcontroller.h"
#include "mxstreamer.h" #include "mxstreamer.h"
DECOMP_SIZE_ASSERT(MxDSBuffer, 0x34); DECOMP_SIZE_ASSERT(MxDSBuffer, 0x34);
@ -118,6 +119,13 @@ MxResult MxDSBuffer::SetBufferPointer(MxU32* p_buffer, MxU32 p_size)
return SUCCESS; return SUCCESS;
} }
// STUB: LEGO1 0x100c67b0
MxResult MxDSBuffer::FUN_100c67b0(MxStreamController* p_controller, MxDSAction* p_action, undefined4* p_unk)
{
// TODO STUB
return FAILURE;
}
// FUNCTION: LEGO1 0x100c6f80 // FUNCTION: LEGO1 0x100c6f80
void MxDSBuffer::FUN_100c6f80(MxU32 p_writeOffset) void MxDSBuffer::FUN_100c6f80(MxU32 p_writeOffset)
{ {

View File

@ -3,6 +3,8 @@
#include "decomp.h" #include "decomp.h"
#include "mxcore.h" #include "mxcore.h"
class MxStreamController;
class MxDSAction;
enum MxDSBufferType { enum MxDSBufferType {
MxDSBufferType_Chunk = 0, MxDSBufferType_Chunk = 0,
@ -27,6 +29,7 @@ class MxDSBuffer : public MxCore {
MxResult AllocateBuffer(MxU32 p_bufferSize, MxDSBufferType p_mode); MxResult AllocateBuffer(MxU32 p_bufferSize, MxDSBufferType p_mode);
MxResult SetBufferPointer(MxU32* p_buffer, MxU32 p_size); MxResult SetBufferPointer(MxU32* p_buffer, MxU32 p_size);
MxResult FUN_100c67b0(MxStreamController* p_controller, MxDSAction* p_action, undefined4* p_unk);
void FUN_100c6f80(MxU32 p_writeOffset); void FUN_100c6f80(MxU32 p_writeOffset);
inline MxU8* GetBuffer() { return m_pBuffer; } inline MxU8* GetBuffer() { return m_pBuffer; }
@ -43,7 +46,7 @@ class MxDSBuffer : public MxCore {
MxDSBufferType m_mode; MxDSBufferType m_mode;
MxU32 m_writeOffset; MxU32 m_writeOffset;
MxU32 m_bytesRemaining; MxU32 m_bytesRemaining;
undefined4 m_unk0x30; MxDSAction* m_unk0x30;
}; };
#endif // MXDSBUFFER_H #endif // MXDSBUFFER_H

View File

@ -6,6 +6,8 @@
#include "mxstring.h" #include "mxstring.h"
#include "mxtypes.h" #include "mxtypes.h"
#include <windows.h>
// VTABLE: LEGO1 0x100dc890 // VTABLE: LEGO1 0x100dc890
class MxDSFile : public MxDSSource { class MxDSFile : public MxDSSource {
public: public:
@ -34,6 +36,8 @@ class MxDSFile : public MxDSSource {
inline void SetFileName(const char* p_filename) { m_filename = p_filename; } inline void SetFileName(const char* p_filename) { m_filename = p_filename; }
inline int CalcFileSize() { return GetFileSize(m_io.m_info.hmmio, NULL); }
private: private:
MxLong ReadChunks(); MxLong ReadChunks();
struct ChunkHeader { struct ChunkHeader {

View File

@ -1,11 +1,12 @@
#include "mxramstreamcontroller.h" #include "mxramstreamcontroller.h"
#include "mxautolocker.h" #include "mxautolocker.h"
#include "mxdsstreamingaction.h"
#include "mxramstreamprovider.h" #include "mxramstreamprovider.h"
DECOMP_SIZE_ASSERT(MxRAMStreamController, 0x98); DECOMP_SIZE_ASSERT(MxRAMStreamController, 0x98);
undefined* __cdecl FUN_100d0d80(MxU32* p_fileSizeBuffer, MxU32 p_fileSize); undefined* __cdecl ReadData(MxU32* p_fileSizeBuffer, MxU32 p_fileSize);
// FUNCTION: LEGO1 0x100c6110 // FUNCTION: LEGO1 0x100c6110
MxResult MxRAMStreamController::Open(const char* p_filename) MxResult MxRAMStreamController::Open(const char* p_filename)
@ -21,7 +22,7 @@ MxResult MxRAMStreamController::Open(const char* p_filename)
return FAILURE; return FAILURE;
} }
FUN_100d0d80( ReadData(
((MxRAMStreamProvider*) m_provider)->GetBufferOfFileSize(), ((MxRAMStreamProvider*) m_provider)->GetBufferOfFileSize(),
((MxRAMStreamProvider*) m_provider)->GetFileSize() ((MxRAMStreamProvider*) m_provider)->GetFileSize()
); );
@ -35,11 +36,32 @@ MxResult MxRAMStreamController::Open(const char* p_filename)
return FAILURE; return FAILURE;
} }
// STUB: LEGO1 0x100c6210 // FUNCTION: LEGO1 0x100c6210
MxResult MxRAMStreamController::VTable0x20(MxDSAction* p_action) MxResult MxRAMStreamController::VTable0x20(MxDSAction* p_action)
{ {
// TODO STUB MxAutoLocker locker(&m_criticalSection);
return FAILURE; MxS16 unknown24Value = 0;
MxResult result = FAILURE;
if (p_action->GetUnknown24() == -1) {
p_action->SetUnknown24(-3);
MxDSAction* action = m_unk0x54.Find(p_action, FALSE);
if (action != NULL) {
unknown24Value = action->GetUnknown24() + 1;
}
p_action->SetUnknown24(unknown24Value);
}
else {
if (m_unk0x54.Find(p_action, FALSE)) {
return FAILURE;
}
}
if (MxStreamController::VTable0x20(p_action) == SUCCESS) {
MxDSStreamingAction* action = (MxDSStreamingAction*) m_unk0x3c.Find(p_action, FALSE);
MxDSStreamingAction streamingaction(*action);
result = DeserializeObject(streamingaction);
}
return result;
} }
// FUNCTION: LEGO1 0x100c6320 // FUNCTION: LEGO1 0x100c6320
@ -57,8 +79,21 @@ MxResult MxRAMStreamController::VTable0x24(MxDSAction* p_action)
return SUCCESS; return SUCCESS;
} }
// FUNCTION: LEGO1 0x100c63c0
MxResult MxRAMStreamController::DeserializeObject(MxDSStreamingAction& action)
{
MxAutoLocker locker(&m_criticalSection);
MxResult result;
undefined4 unkVar = 0;
do {
m_buffer.FUN_100c6f80(action.GetUnknown94());
result = m_buffer.FUN_100c67b0(this, &action, &unkVar);
} while (m_unk0x3c.Find(&action, FALSE) != NULL);
return result;
}
// STUB: LEGO1 0x100d0d80 // STUB: LEGO1 0x100d0d80
undefined* __cdecl FUN_100d0d80(MxU32* p_fileSizeBuffer, MxU32 p_fileSize) undefined* __cdecl ReadData(MxU32* p_fileSizeBuffer, MxU32 p_fileSize)
{ {
return NULL; return NULL;
} }

View File

@ -1,6 +1,7 @@
#ifndef MXRAMSTREAMCONTROLLER_H #ifndef MXRAMSTREAMCONTROLLER_H
#define MXRAMSTREAMCONTROLLER_H #define MXRAMSTREAMCONTROLLER_H
#include "MxDSStreamingAction.h"
#include "mxdsbuffer.h" #include "mxdsbuffer.h"
#include "mxstreamcontroller.h" #include "mxstreamcontroller.h"
@ -30,6 +31,7 @@ class MxRAMStreamController : public MxStreamController {
private: private:
MxDSBuffer m_buffer; MxDSBuffer m_buffer;
MxResult DeserializeObject(MxDSStreamingAction& action);
}; };
#endif // MXRAMSTREAMCONTROLLER_H #endif // MXRAMSTREAMCONTROLLER_H

View File

@ -1,6 +1,8 @@
#include "mxramstreamprovider.h" #include "mxramstreamprovider.h"
#include "decomp.h" #include "decomp.h"
#include "mxomni.h"
#include "mxstreamcontroller.h"
DECOMP_SIZE_ASSERT(MxRAMStreamProvider, 0x24); DECOMP_SIZE_ASSERT(MxRAMStreamProvider, 0x24);
@ -53,8 +55,46 @@ MxRAMStreamProvider::~MxRAMStreamProvider()
m_bufferForDWords = NULL; m_bufferForDWords = NULL;
} }
// STUB: LEGO1 0x100d0ae0 // FUNCTION: LEGO1 0x100d0ae0
MxResult MxRAMStreamProvider::SetResourceToGet(MxStreamController* p_resource) MxResult MxRAMStreamProvider::SetResourceToGet(MxStreamController* p_resource)
{ {
return FAILURE; MxResult result = FAILURE;
MxString path;
m_pLookup = p_resource;
path = (MxString(MxOmni::GetHD()) + p_resource->GetAtom().GetInternal() + ".si");
m_pFile = new MxDSFile(path.GetData(), 0);
if (m_pFile != NULL) {
if (m_pFile->Open(0) != 0) {
path = MxString(MxOmni::GetCD()) + p_resource->GetAtom().GetInternal() + ".si";
m_pFile->SetFileName(path.GetData());
if (m_pFile->Open(0) != 0)
goto done;
}
m_fileSize = m_pFile->CalcFileSize();
if (m_fileSize != 0)
{
m_bufferSize = m_pFile->GetBufferSize();
m_pBufferOfFileSize = new MxU32[m_fileSize];
if (m_pBufferOfFileSize != NULL && m_pFile->Read((unsigned char *)m_pBufferOfFileSize, m_fileSize) == SUCCESS)
{
m_lengthInDWords = m_pFile->GetLengthInDWords();
m_bufferForDWords = new MxU32[m_lengthInDWords << 2];
if (m_bufferForDWords != NULL)
{
memcpy(m_bufferForDWords, m_pFile->GetBuffer(), m_lengthInDWords);
result = SUCCESS;
}
}
}
}
done:
delete m_pFile;
m_pFile = NULL;
return result;
} }

View File

@ -47,6 +47,7 @@ class MxStreamController : public MxCore {
MxResult FUN_100c1f00(MxDSAction* p_action); MxResult FUN_100c1f00(MxDSAction* p_action);
inline MxAtomId& GetAtom() { return m_atom; }; inline MxAtomId& GetAtom() { return m_atom; };
inline MxStreamListMxDSAction GetUnknown3c() { return m_unk0x3c; };
protected: protected:
MxCriticalSection m_criticalSection; // 0x8 MxCriticalSection m_criticalSection; // 0x8