diff --git a/Src/Model3/DSB.cpp b/Src/Model3/DSB.cpp index b665799..002b229 100644 --- a/Src/Model3/DSB.cpp +++ b/Src/Model3/DSB.cpp @@ -347,20 +347,23 @@ void CDSB1::IOWrite8(UINT32 addr, UINT8 data) UINT8 CDSB1::IORead8(UINT32 addr) { - int progress; + int progress, end; switch ((addr&0xFF)) { case 0xE2: // MPEG position, high byte - progress = MPEG_GetProgress() + mpegStart; // byte address currently playing + MPEG_GetPlayPosition(&progress, &end); + progress += mpegStart; // byte address currently playing return (progress>>16)&0xFF; case 0xE3: // MPEG position, middle byte - progress = MPEG_GetProgress() + mpegStart; + MPEG_GetPlayPosition(&progress, &end); + progress += mpegStart; return (progress>>8)&0xFF; case 0xE4: // MPEG position, low byte - progress = MPEG_GetProgress() + mpegStart; + MPEG_GetPlayPosition(&progress, &end); + progress += mpegStart; return progress&0xFF; case 0xF0: // Latch @@ -475,16 +478,20 @@ void CDSB1::Reset(void) void CDSB1::SaveState(CBlockFile *StateFile) { - UINT32 mpegPos; + int i, j; + UINT32 playOffset, endOffset; UINT8 isPlaying; StateFile->NewBlock("DSB1", __FILE__); // MPEG playback state isPlaying = (UINT8) MPEG_IsPlaying(); - mpegPos = MPEG_GetProgress(); + MPEG_GetPlayPosition(&i, &j); + playOffset = (UINT32) i; // in case sizeof(int) != sizeof(INT32) + endOffset = (UINT32) j; StateFile->Write(&isPlaying, sizeof(isPlaying)); - StateFile->Write(&mpegPos, sizeof(mpegPos)); + StateFile->Write(&playOffset, sizeof(playOffset)); + StateFile->Write(&endOffset, sizeof(endOffset)); StateFile->Write(&usingMPEGStart, sizeof(usingMPEGStart)); StateFile->Write(&usingMPEGEnd, sizeof(usingMPEGEnd)); StateFile->Write(&usingLoopStart, sizeof(usingLoopStart)); @@ -511,7 +518,7 @@ void CDSB1::SaveState(CBlockFile *StateFile) void CDSB1::LoadState(CBlockFile *StateFile) { - UINT32 mpegPos; + UINT32 playOffset, endOffset; UINT8 isPlaying; if (OKAY != StateFile->FindBlock("DSB1")) @@ -521,7 +528,8 @@ void CDSB1::LoadState(CBlockFile *StateFile) } StateFile->Read(&isPlaying, sizeof(isPlaying)); - StateFile->Read(&mpegPos, sizeof(mpegPos)); + StateFile->Read(&playOffset, sizeof(playOffset)); + StateFile->Read(&endOffset, sizeof(endOffset)); StateFile->Read(&usingMPEGStart, sizeof(usingMPEGStart)); StateFile->Read(&usingMPEGEnd, sizeof(usingMPEGEnd)); StateFile->Read(&usingLoopStart, sizeof(usingLoopStart)); @@ -548,7 +556,7 @@ void CDSB1::LoadState(CBlockFile *StateFile) MPEG_PlayMemory((const char *) &mpegROM[usingMPEGStart], usingMPEGEnd-usingMPEGStart); if (usingLoopEnd != 0) // only if looping was actually enabled MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd); - MPEG_SetOffset(mpegPos); + MPEG_SetPlayPosition(playOffset, endOffset); } else MPEG_StopPlaying(); @@ -1036,16 +1044,20 @@ void CDSB2::Reset(void) void CDSB2::SaveState(CBlockFile *StateFile) { - UINT32 mpegPos; + int i, j; + UINT32 playOffset, endOffset; UINT8 isPlaying; StateFile->NewBlock("DSB2", __FILE__); // MPEG playback state isPlaying = (UINT8) MPEG_IsPlaying(); - mpegPos = MPEG_GetProgress(); + MPEG_GetPlayPosition(&i, &j); + playOffset = (UINT32) i; // in case sizeof(int) != sizeof(INT32) + endOffset = (UINT32) j; StateFile->Write(&isPlaying, sizeof(isPlaying)); - StateFile->Write(&mpegPos, sizeof(mpegPos)); + StateFile->Write(&playOffset, sizeof(playOffset)); + StateFile->Write(&endOffset, sizeof(endOffset)); StateFile->Write(&usingMPEGStart, sizeof(usingMPEGStart)); StateFile->Write(&usingMPEGEnd, sizeof(usingMPEGEnd)); StateFile->Write(&usingLoopStart, sizeof(usingLoopStart)); @@ -1076,7 +1088,7 @@ void CDSB2::SaveState(CBlockFile *StateFile) void CDSB2::LoadState(CBlockFile *StateFile) { - UINT32 mpegPos; + UINT32 playOffset, endOffset; UINT8 isPlaying; if (OKAY != StateFile->FindBlock("DSB2")) @@ -1086,7 +1098,8 @@ void CDSB2::LoadState(CBlockFile *StateFile) } StateFile->Read(&isPlaying, sizeof(isPlaying)); - StateFile->Read(&mpegPos, sizeof(mpegPos)); + StateFile->Read(&playOffset, sizeof(playOffset)); + StateFile->Read(&endOffset, sizeof(endOffset)); StateFile->Read(&usingMPEGStart, sizeof(usingMPEGStart)); StateFile->Read(&usingMPEGEnd, sizeof(usingMPEGEnd)); StateFile->Read(&usingLoopStart, sizeof(usingLoopStart)); @@ -1113,7 +1126,7 @@ void CDSB2::LoadState(CBlockFile *StateFile) MPEG_PlayMemory((const char *) &mpegROM[usingMPEGStart], usingMPEGEnd-usingMPEGStart); if (usingLoopEnd != 0) // only if looping was actually enabled MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd); - MPEG_SetOffset(mpegPos); + MPEG_SetPlayPosition(playOffset, endOffset); } else MPEG_StopPlaying(); diff --git a/Src/Sound/MPEG/MPEG.h b/Src/Sound/MPEG/MPEG.h index b9e422a..f23e590 100644 --- a/Src/Sound/MPEG/MPEG.h +++ b/Src/Sound/MPEG/MPEG.h @@ -48,23 +48,27 @@ extern bool MPEG_IsPlaying(void); /* - * MPEG_GetProgress(void): + * MPEG_GetPlayPosition(playOffset, endOffset): * - * Returns: - * The current byte offset within the MPEG stream, relative to the start. + * Obtains the current playback and end offsets of the MPEG stream. + * + * Parameters: + * playOffset Pointer to which playback byte offset will be written. + * endOffset Pointer to which end offset will be written. */ -extern int MPEG_GetProgress(void); +extern void MPEG_GetPlayPosition(int *playOffset, int *endOffset); /* - * MPEG_SetOffset(pos): + * MPEG_SetPlayPosition(playOffset, endOffset): * * Sets the playback position within an MPEG stream. * * Parameters: - * pos Byte offset relative to the beginning of the current MPEG - * stream. + * playOffset Playback byte offset (relative to beginning of the current + * MPEG stream). + * endOffset End offset. */ -extern void MPEG_SetOffset(int pos); +extern void MPEG_SetPlayPosition(int playOffset, int endOffset); /* * MPEG_SetLoop(loop, loopend): diff --git a/Src/Sound/MPEG/getbits.cpp b/Src/Sound/MPEG/getbits.cpp index 400a107..d19518d 100644 --- a/Src/Sound/MPEG/getbits.cpp +++ b/Src/Sound/MPEG/getbits.cpp @@ -48,16 +48,19 @@ static const char *fstart, *lstart; static int offset, end, eof, lend; -int MPEG_GetProgress(void) +void MPEG_GetPlayPosition(int *playOffset, int *endOffset) { - if (in_file) return ftell(in_file); - - return offset; + if (in_file) + *playOffset = ftell(in_file); + else + *playOffset = offset; + *endOffset = end; } -void MPEG_SetOffset(int pos) +void MPEG_SetPlayPosition(int playOffset, int endOffset) { - offset = pos; + offset = playOffset; + end = endOffset; } void m1setfile(const char *mstart, int mend)