diff --git a/LEGO1/mxdiskstreamcontroller.cpp b/LEGO1/mxdiskstreamcontroller.cpp index 19f63edc..cd9e31d0 100644 --- a/LEGO1/mxdiskstreamcontroller.cpp +++ b/LEGO1/mxdiskstreamcontroller.cpp @@ -63,23 +63,28 @@ void MxDiskStreamController::FUN_100c7980() { MxDSBuffer* buffer; MxDSStreamingAction* action = NULL; - MxAutoLocker lock(&this->m_criticalSection); - if (m_unk0x3c.size() != 0 || m_provider->GetStreamBuffersNum() > m_unk0x8c) { - buffer = new MxDSBuffer(); - if (buffer->AllocateBuffer(m_provider->GetFileSize(), MxDSBufferType_Chunk) == SUCCESS) { - action = VTable0x28(); - if (action) { - action->SetUnknowna0(buffer); - m_unk0x8c++; - } - else { + { + MxAutoLocker lock(&this->m_criticalSection); + + if (m_unk0x3c.size() && m_unk0x8c < m_provider->GetStreamBuffersNum()) { + buffer = new MxDSBuffer(); + + if (buffer->AllocateBuffer(m_provider->GetFileSize(), MxDSBufferType_Chunk) != SUCCESS) { + if (buffer) + delete buffer; return; } - } - else { - delete buffer; - return; + + action = VTable0x28(); + if (!action) { + if (buffer) + delete buffer; + return; + } + + action->SetUnknowna0(buffer); + m_unk0x8c++; } } diff --git a/LEGO1/mxdiskstreamprovider.cpp b/LEGO1/mxdiskstreamprovider.cpp index e3704ade..dfdf8158 100644 --- a/LEGO1/mxdiskstreamprovider.cpp +++ b/LEGO1/mxdiskstreamprovider.cpp @@ -108,7 +108,7 @@ MxU32 MxDiskStreamProvider::GetFileSize() } // FUNCTION: LEGO1 0x100d1ea0 -MxU32 MxDiskStreamProvider::GetStreamBuffersNum() +MxS32 MxDiskStreamProvider::GetStreamBuffersNum() { return m_pFile->GetStreamBuffersNum(); } diff --git a/LEGO1/mxdiskstreamprovider.h b/LEGO1/mxdiskstreamprovider.h index 32e85ceb..b5a2e9ff 100644 --- a/LEGO1/mxdiskstreamprovider.h +++ b/LEGO1/mxdiskstreamprovider.h @@ -49,7 +49,7 @@ class MxDiskStreamProvider : public MxStreamProvider { virtual MxResult SetResourceToGet(MxStreamController* p_resource) override; // vtable+0x14 virtual MxU32 GetFileSize() override; // vtable+0x18 - virtual MxU32 GetStreamBuffersNum() override; // vtable+0x1c + virtual MxS32 GetStreamBuffersNum() override; // vtable+0x1c virtual void VTable0x20(undefined4) override; // vtable+0x20 virtual MxU32 GetLengthInDWords() override; // vtable+0x24 virtual MxU32* GetBufferForDWords() override; // vtable+0x28 diff --git a/LEGO1/mxramstreamprovider.cpp b/LEGO1/mxramstreamprovider.cpp index 016bcc8d..9c52c20e 100644 --- a/LEGO1/mxramstreamprovider.cpp +++ b/LEGO1/mxramstreamprovider.cpp @@ -23,7 +23,7 @@ MxU32 MxRAMStreamProvider::GetFileSize() } // FUNCTION: LEGO1 0x100d0940 -MxU32 MxRAMStreamProvider::GetStreamBuffersNum() +MxS32 MxRAMStreamProvider::GetStreamBuffersNum() { return 1; } diff --git a/LEGO1/mxramstreamprovider.h b/LEGO1/mxramstreamprovider.h index 70402a8f..112f6b71 100644 --- a/LEGO1/mxramstreamprovider.h +++ b/LEGO1/mxramstreamprovider.h @@ -24,7 +24,7 @@ class MxRAMStreamProvider : public MxStreamProvider { virtual MxResult SetResourceToGet(MxStreamController* p_resource) override; // vtable+0x14 virtual MxU32 GetFileSize() override; // vtable+0x18 - virtual MxU32 GetStreamBuffersNum() override; // vtable+0x1c + virtual MxS32 GetStreamBuffersNum() override; // vtable+0x1c virtual MxU32 GetLengthInDWords() override; // vtable+0x24 virtual MxU32* GetBufferForDWords() override; // vtable+0x28 diff --git a/LEGO1/mxstreamprovider.h b/LEGO1/mxstreamprovider.h index d32d2ab4..66f75be2 100644 --- a/LEGO1/mxstreamprovider.h +++ b/LEGO1/mxstreamprovider.h @@ -27,7 +27,7 @@ class MxStreamProvider : public MxCore { virtual MxResult SetResourceToGet(MxStreamController* p_resource); // vtable+0x14 virtual MxU32 GetFileSize() = 0; // vtable+0x18 - virtual MxU32 GetStreamBuffersNum() = 0; // vtable+0x1c + virtual MxS32 GetStreamBuffersNum() = 0; // vtable+0x1c virtual void VTable0x20(undefined4); // vtable+0x20 virtual MxU32 GetLengthInDWords() = 0; // vtable+0x24 virtual MxU32* GetBufferForDWords() = 0; // vtable+0x28