mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-22 13:55:38 +00:00
- Getting/setting MPEG playback position also includes the end offset. Hopefully will fix save states from crashing when reloaded sometimes in DSB1 and DSB2 games.
This commit is contained in:
parent
a1346b57f5
commit
4527014e75
|
@ -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();
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue