Skip to content

Commit

Permalink
Add MXIOINFO::CreateChunk (#1306)
Browse files Browse the repository at this point in the history
  • Loading branch information
disinvite authored Jan 1, 2025
1 parent 70e72de commit a7f0085
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 8 deletions.
1 change: 1 addition & 0 deletions LEGO1/omni/include/mxio.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class MXIOINFO {
MxU16 Advance(MxU16);
MxU16 Descend(MMCKINFO*, const MMCKINFO*, MxU16);
MxU16 Ascend(MMCKINFO*, MxU16);
MxU16 CreateChunk(MMCKINFO* p_chunkInfo, MxU16 p_create);

// NOTE: In MXIOINFO, the `hmmio` member of MMIOINFO is used like
// an HFILE (int) instead of an HMMIO (WORD).
Expand Down
56 changes: 48 additions & 8 deletions LEGO1/omni/src/stream/mxio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ MXIOINFO::~MXIOINFO()
MxU16 MXIOINFO::Open(const char* p_filename, MxULong p_flags)
{
OFSTRUCT unused;
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;

m_info.lDiskOffset = m_info.lBufOffset = 0;

Expand Down Expand Up @@ -84,7 +84,7 @@ MxU16 MXIOINFO::Open(const char* p_filename, MxULong p_flags)
// FUNCTION: BETA10 0x1015e30b
MxU16 MXIOINFO::Close(MxLong p_unused)
{
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;

if (RAW_M_FILE) {
result = Flush(0);
Expand Down Expand Up @@ -317,7 +317,7 @@ MxLong MXIOINFO::Seek(MxLong p_offset, MxLong p_origin)
// FUNCTION: BETA10 0x1015e9ad
MxU16 MXIOINFO::SetBuffer(char* p_buf, MxLong p_len, MxLong p_unused)
{
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;
result = Flush(0);

if (m_info.dwFlags & MMIO_ALLOCBUF) {
Expand All @@ -337,7 +337,7 @@ MxU16 MXIOINFO::SetBuffer(char* p_buf, MxLong p_len, MxLong p_unused)
// FUNCTION: BETA10 0x1015ea3e
MxU16 MXIOINFO::Flush(MxU16 p_unused)
{
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;
MxLong bytesWritten;

// if buffer is dirty
Expand Down Expand Up @@ -389,7 +389,7 @@ MxU16 MXIOINFO::Flush(MxU16 p_unused)
// FUNCTION: BETA10 0x1015eb8f
MxU16 MXIOINFO::Advance(MxU16 p_option)
{
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;
MxULong rwmode = m_info.dwFlags & MMIO_RWMODE;

if (m_info.pchBuffer) {
Expand Down Expand Up @@ -463,7 +463,7 @@ MxU16 MXIOINFO::Advance(MxU16 p_option)
// FUNCTION: BETA10 0x1015edef
MxU16 MXIOINFO::Descend(MMCKINFO* p_chunkInfo, const MMCKINFO* p_parentInfo, MxU16 p_descend)
{
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;
MxULong ofs;
BOOL readOk;

Expand Down Expand Up @@ -554,7 +554,7 @@ MxU16 MXIOINFO::Ascend(MMCKINFO* p_chunkInfo, MxU16 p_ascend)
{
MxLong ofs;
MxULong size;
MxU16 result = 0;
MxU16 result = MMSYSERR_NOERROR;

if (p_chunkInfo == NULL) {
return MMIOERR_BASE;
Expand Down Expand Up @@ -605,10 +605,50 @@ MxU16 MXIOINFO::Ascend(MMCKINFO* p_chunkInfo, MxU16 p_ascend)
}

// Seek past the end of the chunk (plus optional pad byte if size is odd)
if (result == 0 &&
if (result == MMSYSERR_NOERROR &&
Seek((p_chunkInfo->cksize & 1) + p_chunkInfo->cksize + p_chunkInfo->dwDataOffset, SEEK_SET) == -1) {
result = MMIOERR_CANNOTSEEK;
}

return result;
}

// FUNCTION: BETA10 0x1015f28b
MxU16 MXIOINFO::CreateChunk(MMCKINFO* p_chunkInfo, MxU16 p_create)
{
MxU16 result = MMSYSERR_NOERROR;

if (p_chunkInfo == NULL) {
return MMIOERR_BASE;
}

if (p_create == MMIO_CREATERIFF) {
p_chunkInfo->ckid = FOURCC_RIFF;
}
if (p_create == MMIO_CREATELIST) {
p_chunkInfo->ckid = FOURCC_LIST;
}

p_chunkInfo->dwDataOffset = Seek(0, SEEK_CUR);
if (p_chunkInfo->dwDataOffset == -1) {
result = MMIOERR_CANNOTSEEK;
}
else {
p_chunkInfo->dwDataOffset += 8;
}

MxU32 size;
if (p_chunkInfo->ckid == FOURCC_RIFF || p_chunkInfo->ckid == FOURCC_LIST) {
size = 12;
}
else {
size = 8;
}

if (Write(p_chunkInfo, size) != size) {
result = MMIOERR_CANNOTWRITE;
}

p_chunkInfo->dwFlags = MMIO_DIRTY;
return result;
}

0 comments on commit a7f0085

Please sign in to comment.