Match MxStreamController::vtable0x20

This commit is contained in:
Christian Semmler 2023-10-10 04:20:24 -04:00
parent 8500407bab
commit 2c0ac5ee59
9 changed files with 22 additions and 28 deletions

View File

@ -79,7 +79,7 @@ MxU32 MxDiskStreamProvider::GetLengthInDWords()
} }
// OFFSET: LEGO1 0x100d1ec0 // OFFSET: LEGO1 0x100d1ec0
void* MxDiskStreamProvider::GetBufferForDWords() MxU32* MxDiskStreamProvider::GetBufferForDWords()
{ {
return m_pFile->GetBuffer(); return m_pFile->GetBuffer();
} }

View File

@ -54,7 +54,7 @@ class MxDiskStreamProvider : public MxStreamProvider
virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c
virtual void vtable0x20(undefined4 p_unknown1) override; //vtable+0x20 virtual void vtable0x20(undefined4 p_unknown1) override; //vtable+0x20
virtual MxU32 GetLengthInDWords() override; //vtable+0x24 virtual MxU32 GetLengthInDWords() override; //vtable+0x24
virtual void* GetBufferForDWords()override; //vtable+0x28 virtual MxU32* GetBufferForDWords()override; //vtable+0x28
private: private:
MxDiskStreamProviderThread m_thread; // 0x10 MxDiskStreamProviderThread m_thread; // 0x10

View File

@ -81,7 +81,7 @@ MxLong MxDSFile::ReadChunks()
} }
MxULong* pLengthInDWords = &m_lengthInDWords; MxULong* pLengthInDWords = &m_lengthInDWords;
m_io.Read(pLengthInDWords, 4); m_io.Read(pLengthInDWords, 4);
m_pBuffer = malloc(*pLengthInDWords * 4); m_pBuffer = new MxU32[*pLengthInDWords];
m_io.Read(m_pBuffer, *pLengthInDWords * 4); m_io.Read(m_pBuffer, *pLengthInDWords * 4);
return 0; return 0;
} }
@ -120,7 +120,7 @@ MxLong MxDSFile::Close()
if (m_lengthInDWords != 0) if (m_lengthInDWords != 0)
{ {
m_lengthInDWords = 0; m_lengthInDWords = 0;
free(m_pBuffer); delete[] m_pBuffer;
m_pBuffer = NULL; m_pBuffer = NULL;
} }
return 0; return 0;

View File

@ -14,7 +14,7 @@ MxLong MxDSSource::GetLengthInDWords()
} }
// OFFSET: LEGO1 0x100c0000 // OFFSET: LEGO1 0x100c0000
void *MxDSSource::GetBuffer() MxU32 *MxDSSource::GetBuffer()
{ {
return m_pBuffer; return m_pBuffer;
} }

View File

@ -34,11 +34,11 @@ class MxDSSource : public MxCore
virtual MxULong GetBufferSize() = 0; virtual MxULong GetBufferSize() = 0;
virtual MxULong GetStreamBuffersNum() = 0; virtual MxULong GetStreamBuffersNum() = 0;
virtual MxLong GetLengthInDWords(); virtual MxLong GetLengthInDWords();
virtual void* GetBuffer(); // 0x34 virtual MxU32* GetBuffer(); // 0x34
protected: protected:
MxULong m_lengthInDWords; MxULong m_lengthInDWords;
void* m_pBuffer; MxU32* m_pBuffer;
MxLong m_position; MxLong m_position;
}; };

View File

@ -53,7 +53,7 @@ MxU32 MxRAMStreamProvider::GetLengthInDWords()
} }
// OFFSET: LEGO1 0x100d0960 // OFFSET: LEGO1 0x100d0960
void* MxRAMStreamProvider::GetBufferForDWords() MxU32* MxRAMStreamProvider::GetBufferForDWords()
{ {
return m_bufferForDWords; return m_bufferForDWords;
} }

View File

@ -14,14 +14,14 @@ class MxRAMStreamProvider : public MxStreamProvider
virtual MxU32 GetFileSize() override; //vtable+0x18 virtual MxU32 GetFileSize() override; //vtable+0x18
virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c virtual MxU32 GetStreamBuffersNum() override; //vtable+0x1c
virtual MxU32 GetLengthInDWords() override; //vtable+0x24 virtual MxU32 GetLengthInDWords() override; //vtable+0x24
virtual void* GetBufferForDWords() override; //vtable+0x28 virtual MxU32* GetBufferForDWords() override; //vtable+0x28
protected: protected:
MxU32 m_bufferSize; MxU32 m_bufferSize;
MxU32 m_fileSize; MxU32 m_fileSize;
void* m_pBufferOfFileSize; void* m_pBufferOfFileSize;
MxU32 m_lengthInDWords; MxU32 m_lengthInDWords;
void* m_bufferForDWords; MxU32* m_bufferForDWords;
}; };
#endif // MXRAMSTREAMPROVIDER_H #endif // MXRAMSTREAMPROVIDER_H

View File

@ -48,27 +48,21 @@ MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unkno
// OFFSET: LEGO1 0x100c1690 // OFFSET: LEGO1 0x100c1690
MxResult MxStreamController::vtable0x20(MxDSAction* p_action) MxResult MxStreamController::vtable0x20(MxDSAction* p_action)
{ {
MxResult result;
void* buffer;
MxU32 buffer_value;
MxAutoLocker locker(&m_criticalSection); MxAutoLocker locker(&m_criticalSection);
MxStreamProvider* provider = m_provider; MxResult result;
MxU32 objectId = p_action->GetObjectId(); MxU32 offset = 0;
if(objectId < provider->GetLengthInDWords())
{
buffer = provider->GetBufferForDWords();
buffer_value = *(MxU32 *)((MxU32)buffer + objectId * 4);
}
if (buffer_value == NULL) MxS32 objectId = p_action->GetObjectId();
{ MxStreamProvider *provider = m_provider;
result = FAILURE;
} if ((MxS32) provider->GetLengthInDWords() > objectId)
offset = provider->GetBufferForDWords()[objectId];
if (offset)
result = vtable0x2c(p_action, offset);
else else
{ result = FAILURE;
result = vtable0x2c(p_action, buffer_value);
}
return result; return result;
} }

View File

@ -29,7 +29,7 @@ class MxStreamProvider : public MxCore
virtual MxU32 GetStreamBuffersNum() = 0; //vtable+0x1c virtual MxU32 GetStreamBuffersNum() = 0; //vtable+0x1c
virtual void vtable0x20(undefined4 p_unknown1); //vtable+0x20 virtual void vtable0x20(undefined4 p_unknown1); //vtable+0x20
virtual MxU32 GetLengthInDWords() = 0; //vtable+0x24 virtual MxU32 GetLengthInDWords() = 0; //vtable+0x24
virtual void* GetBufferForDWords() = 0; //vtable+0x28 virtual MxU32* GetBufferForDWords() = 0; //vtable+0x28
protected: protected:
void *m_pLookup; void *m_pLookup;