fixed a bad bug in memorystream which makes movie savestates work better

and now they work faster too
This commit is contained in:
zeromus 2008-06-17 07:55:27 +00:00
parent ce3a9796c3
commit b82c266971
5 changed files with 15 additions and 23 deletions

View File

@ -658,7 +658,7 @@ void FCEU_SaveGameSave(CartInfo *LocalHWInfo)
}
}
// hack, movie.c has to communicate with this function somehow
// hack, movie.cpp has to communicate with this function somehow
int disableBatteryLoading=0;
void FCEU_LoadGameSave(CartInfo *LocalHWInfo)

View File

@ -276,8 +276,9 @@ void MovieData::installValue(std::string& key, std::string& val)
}
}
void MovieData::dump(std::ostream *os)
int MovieData::dump(std::ostream *os)
{
int start = os->tellp();
*os << "version " << version << endl;
*os << "emuVersion " << emuVersion << endl;
*os << "recordCount " << recordCount << endl;
@ -296,16 +297,10 @@ void MovieData::dump(std::ostream *os)
*os << "savestate " << BytesToString(&savestate[0],savestate.size()) << endl;
for(int i=0;i<(int)records.size();i++)
records[i].dump(this,os,i);
int end = os->tellp();
return end-start;
}
int MovieData::dumpLen()
{
memorystream ms;
dump(&ms);
return ms.size();
}
int FCEUMOV_GetFrame(void)
{
return currFrameCounter;
@ -761,16 +756,8 @@ void FCEU_DrawMovies(uint8 *XBuf)
int FCEUMOV_WriteState(std::ostream* os)
{
//we are supposed to dump the movie data into the savestate
if(movieMode == MOVIEMODE_RECORD || movieMode == MOVIEMODE_PLAY)
{
int todo = currMovieData.dumpLen();
if(os)
currMovieData.dump(os);
return todo;
}
return currMovieData.dump(os);
else return 0;
}

View File

@ -163,8 +163,7 @@ public:
void truncateAt(int frame);
void installValue(std::string& key, std::string& val);
void dump(std::ostream* os);
int dumpLen();
int dump(std::ostream* os);
void clearRecordRange(int start, int len);
static bool loadSavestateFrom(std::vector<char>* buf);

View File

@ -406,10 +406,13 @@ bool FCEUSS_SaveMS(std::ostream* outstream, int compressionLevel)
//do not save the movie state if we are in tasedit! that is a huge waste of time and space!
if(!FCEUMOV_Mode(MOVIEMODE_TASEDIT))
{
uint32 size = FCEUMOV_WriteState((std::ostream*)0);
os->seekp(5,std::ios::cur);
int size = FCEUMOV_WriteState(os);
os->seekp(-(size+5),std::ios::cur);
os->put(7);
write32le(size, os);
FCEUMOV_WriteState(os);
os->seekp(size,std::ios::cur);
totalsize += 5 + size;
}
}

View File

@ -210,7 +210,10 @@ protected:
if(which & std::ios_base::in)
setg(buf, buf+pos, buf + length);
if(which & std::ios_base::out)
{
ww = pos;
setp(buf+pos, buf + capacity);
}
return pos;
}