finish porting iostream stuff to EMUFILE*. movies and sram-start movies work once again
This commit is contained in:
parent
e05c17dfbb
commit
41a10c95f5
|
@ -18,11 +18,10 @@ libdesmume_a_SOURCES = \
|
||||||
common.cpp common.h \
|
common.cpp common.h \
|
||||||
debug.cpp debug.h driver.h \
|
debug.cpp debug.h driver.h \
|
||||||
Disassembler.cpp Disassembler.h \
|
Disassembler.cpp Disassembler.h \
|
||||||
dscard.h fat.h FIFO.cpp FIFO.h \
|
dscard.h emufile.h emufile.cpp fat.h FIFO.cpp FIFO.h \
|
||||||
GPU.cpp GPU.h \
|
GPU.cpp GPU.h \
|
||||||
GPU_osd.cpp GPU_osd.h \
|
GPU_osd.cpp GPU_osd.h \
|
||||||
mem.h mc.cpp mc.h \
|
mem.h mc.cpp mc.h \
|
||||||
memorystream.h \
|
|
||||||
path.h \
|
path.h \
|
||||||
readwrite.cpp readwrite.h \
|
readwrite.cpp readwrite.h \
|
||||||
wifi.cpp wifi.h \
|
wifi.cpp wifi.h \
|
||||||
|
|
|
@ -717,8 +717,6 @@ void GameInfo::populate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include "memorystream.h"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
static std::vector<char> buffer;
|
static std::vector<char> buffer;
|
||||||
static std::vector<char> v;
|
static std::vector<char> v;
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#include "types.h"
|
||||||
|
#include "emufile.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
bool EMUFILE::readAllBytes(std::vector<u8>* dstbuf, const std::string& fname)
|
||||||
|
{
|
||||||
|
EMUFILE_FILE file(fname.c_str(),"rb");
|
||||||
|
if(file.fail()) return false;
|
||||||
|
int size = file.size();
|
||||||
|
dstbuf->resize(size);
|
||||||
|
file.fread(&dstbuf->at(0),size);
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -38,6 +38,7 @@ public:
|
||||||
|
|
||||||
virtual ~EMUFILE() {}
|
virtual ~EMUFILE() {}
|
||||||
|
|
||||||
|
static bool readAllBytes(std::vector<u8>* buf, const std::string& fname);
|
||||||
|
|
||||||
bool fail() { return failbit; }
|
bool fail() { return failbit; }
|
||||||
|
|
||||||
|
@ -157,7 +158,7 @@ public:
|
||||||
pos += offset;
|
pos += offset;
|
||||||
break;
|
break;
|
||||||
case SEEK_END:
|
case SEEK_END:
|
||||||
pos = size()-len;
|
pos = size()+offset;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
|
@ -195,16 +196,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int fprintf(const char *format, ...) {
|
virtual int fprintf(const char *format, ...) {
|
||||||
//TODO - BLEHHHHHHHH
|
|
||||||
char temp[1024];
|
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
va_start(argptr, format);
|
va_start(argptr, format);
|
||||||
int ret = ::vsprintf(temp, format, argptr);
|
int ret = ::vfprintf(fp, format, argptr);
|
||||||
if(ret<0 || ret>=1024) {
|
|
||||||
assert(false);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
fwrite(temp,ret);
|
|
||||||
va_end(argptr);
|
va_end(argptr);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
|
@ -961,36 +961,36 @@ bool BackupDevice::load_duc(const char* filename)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BackupDevice::load_movie(std::istream* is) {
|
bool BackupDevice::load_movie(EMUFILE* is) {
|
||||||
|
|
||||||
const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);
|
const s32 cookieLen = (s32)strlen(kDesmumeSaveCookie);
|
||||||
|
|
||||||
is->seekg(-cookieLen, std::ios::end);
|
is->fseek(-cookieLen, SEEK_END);
|
||||||
is->seekg(-4, std::ios::cur);
|
is->fseek(-4, SEEK_CUR);
|
||||||
|
|
||||||
u32 version = 0xFFFFFFFF;
|
u32 version = 0xFFFFFFFF;
|
||||||
is->read((char*)&version,4);
|
is->fread((char*)&version,4);
|
||||||
if(version!=0) {
|
if(version!=0) {
|
||||||
printf("Unknown save file format\n");
|
printf("Unknown save file format\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
is->seekg(-24, std::ios::cur);
|
is->fseek(-24, SEEK_CUR);
|
||||||
|
|
||||||
struct{
|
struct{
|
||||||
u32 size,padSize,type,addr_size,mem_size;
|
u32 size,padSize,type,addr_size,mem_size;
|
||||||
}info;
|
}info;
|
||||||
|
|
||||||
is->read((char*)&info.size,4);
|
is->fread((char*)&info.size,4);
|
||||||
is->read((char*)&info.padSize,4);
|
is->fread((char*)&info.padSize,4);
|
||||||
is->read((char*)&info.type,4);
|
is->fread((char*)&info.type,4);
|
||||||
is->read((char*)&info.addr_size,4);
|
is->fread((char*)&info.addr_size,4);
|
||||||
is->read((char*)&info.mem_size,4);
|
is->fread((char*)&info.mem_size,4);
|
||||||
|
|
||||||
//establish the save data
|
//establish the save data
|
||||||
data.resize(info.size);
|
data.resize(info.size);
|
||||||
is->seekg(0, std::ios::beg);
|
is->fseek(0, SEEK_SET);
|
||||||
if(info.size>0)
|
if(info.size>0)
|
||||||
is->read((char*)&data[0],info.size);
|
is->fread((char*)&data[0],info.size);
|
||||||
|
|
||||||
state = RUNNING;
|
state = RUNNING;
|
||||||
addr_size = info.addr_size;
|
addr_size = info.addr_size;
|
||||||
|
|
|
@ -103,7 +103,7 @@ public:
|
||||||
bool load_no_gba(const char *fname);
|
bool load_no_gba(const char *fname);
|
||||||
bool load_raw(const char* filename);
|
bool load_raw(const char* filename);
|
||||||
bool save_raw(const char* filename);
|
bool save_raw(const char* filename);
|
||||||
bool load_movie(std::istream* is);
|
bool load_movie(EMUFILE* is);
|
||||||
|
|
||||||
//call me once a second or so to lazy flush the save data
|
//call me once a second or so to lazy flush the save data
|
||||||
//here's the reason for this system: we want to dump save files when theyre READ
|
//here's the reason for this system: we want to dump save files when theyre READ
|
||||||
|
|
|
@ -1,324 +0,0 @@
|
||||||
/* Copyright (C) 2008-2009 DeSmuME team
|
|
||||||
|
|
||||||
This file is part of DeSmuME
|
|
||||||
|
|
||||||
DeSmuME is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
DeSmuME is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with DeSmuME; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _memorystream_h_
|
|
||||||
#define _memorystream_h_
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string.h>
|
|
||||||
#include <vector>
|
|
||||||
#include <sstream>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class memory_streambuf: public std::streambuf {
|
|
||||||
private:
|
|
||||||
|
|
||||||
friend class memorystream;
|
|
||||||
|
|
||||||
//the current buffer
|
|
||||||
T* buf;
|
|
||||||
|
|
||||||
//the current allocated capacity of the buffer
|
|
||||||
size_t capacity;
|
|
||||||
|
|
||||||
//whether the sequence is owned by the stringbuf
|
|
||||||
bool myBuf;
|
|
||||||
|
|
||||||
//the logical length of the buffer
|
|
||||||
size_t length;
|
|
||||||
|
|
||||||
//the current 'write window' starting position within the buffer for writing.
|
|
||||||
size_t ww;
|
|
||||||
|
|
||||||
//a vector that we have been told to use
|
|
||||||
std::vector<T>* usevec;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
memory_streambuf(int _capacity)
|
|
||||||
: buf(new T[capacity=_capacity])
|
|
||||||
, myBuf(true)
|
|
||||||
, length(_capacity)
|
|
||||||
, ww(0)
|
|
||||||
, usevec(0)
|
|
||||||
{
|
|
||||||
sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
memory_streambuf()
|
|
||||||
: buf(new T[capacity = 128])
|
|
||||||
, myBuf(true)
|
|
||||||
, length(0)
|
|
||||||
, ww(0)
|
|
||||||
, usevec(0)
|
|
||||||
{
|
|
||||||
sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
//constructs a non-expandable streambuf around the provided buffer
|
|
||||||
memory_streambuf(T* usebuf, int buflength)
|
|
||||||
: buf(usebuf)
|
|
||||||
, myBuf(false)
|
|
||||||
, length(buflength)
|
|
||||||
, ww(0)
|
|
||||||
, usevec(0)
|
|
||||||
{
|
|
||||||
sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
//constructs an expandable streambuf around the provided buffer
|
|
||||||
memory_streambuf(std::vector<T>* _usevec)
|
|
||||||
: capacity(_usevec->size())
|
|
||||||
, myBuf(false)
|
|
||||||
, length(_usevec->size())
|
|
||||||
, ww(0)
|
|
||||||
, usevec(_usevec)
|
|
||||||
{
|
|
||||||
if(length>0)
|
|
||||||
buf = &(*_usevec)[0];
|
|
||||||
else buf = 0;
|
|
||||||
|
|
||||||
sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
~memory_streambuf()
|
|
||||||
{
|
|
||||||
//only cleanup if we own the seq
|
|
||||||
if(myBuf) delete[] buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
//the logical length of the buffer
|
|
||||||
size_t size()
|
|
||||||
{
|
|
||||||
sync();
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
//to avoid copying, rebuilds the provided vector and copies the streambuf contents into it
|
|
||||||
void toVector(std::vector<T>& out)
|
|
||||||
{
|
|
||||||
out.resize(length);
|
|
||||||
memcpy(&out[0],buf,length);
|
|
||||||
}
|
|
||||||
|
|
||||||
//maybe the compiler can avoid copying, but maybe not: returns a vector representing the current streambuf
|
|
||||||
std::vector<T> toVector()
|
|
||||||
{
|
|
||||||
return std::vector<T>(buf,buf+length);
|
|
||||||
}
|
|
||||||
|
|
||||||
//if the memorystream wraps a vector, the vector will be trimmed to the correct size,.
|
|
||||||
//you probably need to use this if you are using the vector wrapper
|
|
||||||
void trim()
|
|
||||||
{
|
|
||||||
if(!usevec) return;
|
|
||||||
usevec->resize(size());
|
|
||||||
}
|
|
||||||
|
|
||||||
//tells the current read or write position
|
|
||||||
std::streampos tell(std::ios::openmode which)
|
|
||||||
{
|
|
||||||
if(which == std::ios::in)
|
|
||||||
return tellRead();
|
|
||||||
else if(which == std::ios::out)
|
|
||||||
return tellWrite();
|
|
||||||
else return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//tells the current read position
|
|
||||||
std::streampos tellRead()
|
|
||||||
{
|
|
||||||
return gptr()-eback();
|
|
||||||
}
|
|
||||||
|
|
||||||
//tells the current write position
|
|
||||||
std::streampos tellWrite()
|
|
||||||
{
|
|
||||||
return pptr()-pbase() + ww;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sync()
|
|
||||||
{
|
|
||||||
dosync(-1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* getbuf()
|
|
||||||
{
|
|
||||||
sync();
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if we were provided a buffer, then calling this gives us ownership of it
|
|
||||||
void giveBuf() {
|
|
||||||
myBuf = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void expand(size_t upto)
|
|
||||||
{
|
|
||||||
if(!myBuf && !usevec)
|
|
||||||
throw new std::runtime_error("memory_streambuf is not expandable");
|
|
||||||
|
|
||||||
size_t newcapacity;
|
|
||||||
if(upto == (size_t)-1)
|
|
||||||
newcapacity = capacity + capacity/2 + 2;
|
|
||||||
else
|
|
||||||
newcapacity = std::max(upto,capacity);
|
|
||||||
|
|
||||||
if(newcapacity == capacity) return;
|
|
||||||
|
|
||||||
//if we are supposed to use the vector, then do it now
|
|
||||||
if(usevec)
|
|
||||||
{
|
|
||||||
usevec->resize(newcapacity);
|
|
||||||
capacity = usevec->size();
|
|
||||||
buf = &(*usevec)[0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//otherwise, manage our own buffer
|
|
||||||
T* newbuf = new T[newcapacity];
|
|
||||||
memcpy(newbuf,buf,capacity);
|
|
||||||
delete[] buf;
|
|
||||||
capacity = newcapacity;
|
|
||||||
buf = newbuf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void dosync(int c)
|
|
||||||
{
|
|
||||||
size_t wp = tellWrite();
|
|
||||||
size_t rp = tellRead();
|
|
||||||
|
|
||||||
//if we are supposed to insert a character..
|
|
||||||
if(c != -1)
|
|
||||||
{
|
|
||||||
buf[wp] = c;
|
|
||||||
wp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
//the length is determined by the highest character that was ever inserted
|
|
||||||
length = std::max(length,wp);
|
|
||||||
|
|
||||||
//the write window advances to begin at the current write insertion point
|
|
||||||
ww = wp;
|
|
||||||
|
|
||||||
//set the new write and read windows
|
|
||||||
setp(buf+ww, buf + capacity);
|
|
||||||
setg(buf, buf+rp, buf + length);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
int overflow(int c)
|
|
||||||
{
|
|
||||||
expand((size_t)-1);
|
|
||||||
dosync(c);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::streambuf::pos_type seekpos(pos_type pos, std::ios::openmode which)
|
|
||||||
{
|
|
||||||
//extend if we are seeking the write cursor
|
|
||||||
if(which & std::ios_base::out)
|
|
||||||
expand(pos);
|
|
||||||
|
|
||||||
sync();
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos_type seekoff(off_type off, std::ios::seekdir way, std::ios::openmode which)
|
|
||||||
{
|
|
||||||
switch(way) {
|
|
||||||
case std::ios::beg:
|
|
||||||
return seekpos(off, which);
|
|
||||||
case std::ios::cur:
|
|
||||||
return seekpos(tell(which)+off, which);
|
|
||||||
case std::ios::end:
|
|
||||||
return seekpos(length+off, which);
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
//an iostream that uses the memory_streambuf to effectively act much like a c# memorystream
|
|
||||||
//please call sync() after writing data if you want to read it back
|
|
||||||
class memorystream : public std::basic_iostream<char, std::char_traits<char> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
memorystream()
|
|
||||||
: std::basic_iostream<char, std::char_traits<char> >(&streambuf)
|
|
||||||
{}
|
|
||||||
|
|
||||||
memorystream(int sz)
|
|
||||||
: std::basic_iostream<char, std::char_traits<char> >(&streambuf)
|
|
||||||
, streambuf(sz)
|
|
||||||
{}
|
|
||||||
|
|
||||||
memorystream(char* usebuf, int buflength)
|
|
||||||
: std::basic_iostream<char, std::char_traits<char> >(&streambuf)
|
|
||||||
, streambuf(usebuf, buflength)
|
|
||||||
{}
|
|
||||||
|
|
||||||
memorystream(std::vector<char>* usevec)
|
|
||||||
: std::basic_iostream<char, std::char_traits<char> >(&streambuf)
|
|
||||||
, streambuf(usevec)
|
|
||||||
{}
|
|
||||||
|
|
||||||
//the underlying memory_streambuf
|
|
||||||
memory_streambuf<char> streambuf;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
size_t size() { return streambuf.size(); }
|
|
||||||
char* buf() { return streambuf.getbuf(); }
|
|
||||||
//flushes all the writing state and ensures the stream is ready for reading
|
|
||||||
void sync() { streambuf.sync(); }
|
|
||||||
//rewinds the cursors to offset 0
|
|
||||||
void rewind() { streambuf.seekpos(0,std::ios::in | std::ios::out); }
|
|
||||||
|
|
||||||
//if the memorystream wraps a vector, the vector will be trimmed to the correct size,.
|
|
||||||
//you probably need to use this if you are using the vector wrapper
|
|
||||||
void trim() { streambuf.trim(); }
|
|
||||||
|
|
||||||
void giveBuf() { streambuf.giveBuf(); }
|
|
||||||
|
|
||||||
memory_streambuf<char>& getStreambuf() { return streambuf; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -32,7 +32,6 @@
|
||||||
#include "mic.h"
|
#include "mic.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "GPU_osd.h"
|
#include "GPU_osd.h"
|
||||||
//#include "memorystream.h"
|
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "emufile.h"
|
#include "emufile.h"
|
||||||
|
|
||||||
|
@ -512,50 +511,45 @@ static void openRecordingMovie(const char* fname)
|
||||||
strcpy(curMovieFilename, fname);
|
strcpy(curMovieFilename, fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MovieData::loadSramFrom(std::vector<char>* buf)
|
bool MovieData::loadSramFrom(std::vector<u8>* buf)
|
||||||
{//TODO
|
|
||||||
// memorystream ms(buf);
|
|
||||||
// MMU_new.backupDevice.load_movie(&ms);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool FCEUSS_SaveSRAM(std::ostream* outstream, std:: string fname)
|
|
||||||
{
|
{
|
||||||
//a temp memory stream. we'll dump some data here and then compress
|
EMUFILE_MEMORY ms(buf);
|
||||||
//TODO - support dumping directly without compressing to save a buffer copy
|
MMU_new.backupDevice.load_movie(&ms);
|
||||||
//TODO
|
|
||||||
/* memorystream ms;
|
|
||||||
|
|
||||||
//size it
|
|
||||||
FILE * fp = fopen( fname.c_str(), "r" );
|
|
||||||
if(!fp)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
fseek( fp, 0, SEEK_END );
|
|
||||||
int size = ftell(fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
filebuf fb;
|
|
||||||
fb.open (fname.c_str(), ios::in | ios::binary);//ios::in
|
|
||||||
istream is(&fb);
|
|
||||||
|
|
||||||
char *buffer = new char[size];
|
|
||||||
|
|
||||||
is.read(buffer, size);
|
|
||||||
|
|
||||||
outstream->write((char*)buffer,size);
|
|
||||||
|
|
||||||
fb.close();
|
|
||||||
*/
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MovieData::dumpSramTo(std::vector<char>* buf, std::string sramfname) {
|
//static bool FCEUSS_SaveSRAM(EMUFILE* outstream, const std::string& fname)
|
||||||
//TODO
|
//{
|
||||||
// memorystream ms(buf);
|
// //a temp memory stream. we'll dump some data here and then compress
|
||||||
// FCEUSS_SaveSRAM(&ms, sramfname);
|
// //TODO - support dumping directly without compressing to save a buffer copy
|
||||||
// ms.trim();
|
////TODO
|
||||||
}
|
///* memorystream ms;
|
||||||
|
//
|
||||||
|
// //size it
|
||||||
|
// FILE * fp = fopen( fname.c_str(), "r" );
|
||||||
|
// if(!fp)
|
||||||
|
// return 0;
|
||||||
|
//
|
||||||
|
// fseek( fp, 0, SEEK_END );
|
||||||
|
// int size = ftell(fp);
|
||||||
|
// fclose(fp);
|
||||||
|
//
|
||||||
|
// filebuf fb;
|
||||||
|
// fb.open (fname.c_str(), ios::in | ios::binary);//ios::in
|
||||||
|
// istream is(&fb);
|
||||||
|
//
|
||||||
|
// char *buffer = new char[size];
|
||||||
|
//
|
||||||
|
// is.read(buffer, size);
|
||||||
|
//
|
||||||
|
// outstream->write((char*)buffer,size);
|
||||||
|
//
|
||||||
|
// fb.close();
|
||||||
|
//*/
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// return true;
|
||||||
|
//}
|
||||||
|
|
||||||
//begin recording a new movie
|
//begin recording a new movie
|
||||||
//TODO - BUG - the record-from-another-savestate doesnt work.
|
//TODO - BUG - the record-from-another-savestate doesnt work.
|
||||||
|
@ -589,7 +583,7 @@ void _CDECL_ FCEUI_SaveMovie(const char *fname, std::wstring author, int flag, s
|
||||||
// MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION);
|
// MovieData::dumpSavestateTo(&currMovieData.savestate,Z_BEST_COMPRESSION);
|
||||||
|
|
||||||
if(flag == 1)
|
if(flag == 1)
|
||||||
MovieData::dumpSramTo(&currMovieData.sram, sramfname);
|
EMUFILE::readAllBytes(&currMovieData.sram, sramfname);
|
||||||
|
|
||||||
//we are going to go ahead and dump the header. from now on we will only be appending frames
|
//we are going to go ahead and dump the header. from now on we will only be appending frames
|
||||||
currMovieData.dump(osRecordingMovie, false);
|
currMovieData.dump(osRecordingMovie, false);
|
||||||
|
|
|
@ -119,8 +119,8 @@ public:
|
||||||
u32 romChecksum;
|
u32 romChecksum;
|
||||||
std::string romSerial;
|
std::string romSerial;
|
||||||
std::string romFilename;
|
std::string romFilename;
|
||||||
std::vector<char> savestate;
|
std::vector<u8> savestate;
|
||||||
std::vector<char> sram;
|
std::vector<u8> sram;
|
||||||
std::vector<MovieRecord> records;
|
std::vector<MovieRecord> records;
|
||||||
std::vector<std::wstring> comments;
|
std::vector<std::wstring> comments;
|
||||||
|
|
||||||
|
@ -166,11 +166,10 @@ public:
|
||||||
void clearRecordRange(int start, int len);
|
void clearRecordRange(int start, int len);
|
||||||
void insertEmpty(int at, int frames);
|
void insertEmpty(int at, int frames);
|
||||||
|
|
||||||
static bool loadSavestateFrom(std::vector<char>* buf);
|
static bool loadSavestateFrom(std::vector<u8>* buf);
|
||||||
static void dumpSavestateTo(std::vector<char>* buf, int compressionLevel);
|
static void dumpSavestateTo(std::vector<u8>* buf, int compressionLevel);
|
||||||
|
|
||||||
static bool loadSramFrom(std::vector<char>* buf);
|
static bool loadSramFrom(std::vector<u8>* buf);
|
||||||
static void dumpSramTo(std::vector<char>* buf, std::string sramfname);
|
|
||||||
//void TryDumpIncremental();
|
//void TryDumpIncremental();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include "GPU_osd.h"
|
#include "GPU_osd.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#include "memorystream.h"
|
|
||||||
#include "readwrite.h"
|
#include "readwrite.h"
|
||||||
#include "gfx3d.h"
|
#include "gfx3d.h"
|
||||||
#include "movie.h"
|
#include "movie.h"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="shift_jis"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8.00"
|
Version="8.00"
|
||||||
|
@ -1242,6 +1242,10 @@
|
||||||
RelativePath="..\dscard.h"
|
RelativePath="..\dscard.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\emufile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\emufile.h"
|
RelativePath="..\emufile.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -665,6 +665,10 @@
|
||||||
RelativePath="..\Disassembler.cpp"
|
RelativePath="..\Disassembler.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\emufile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\FIFO.cpp"
|
RelativePath="..\FIFO.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1227,6 +1231,10 @@
|
||||||
RelativePath="..\driver.h"
|
RelativePath="..\driver.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\emufile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\fat.h"
|
RelativePath="..\fat.h"
|
||||||
>
|
>
|
||||||
|
@ -1275,10 +1283,6 @@
|
||||||
RelativePath="..\mem.h"
|
RelativePath="..\mem.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\memorystream.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\mic.h"
|
RelativePath="..\mic.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -118,10 +118,10 @@ static char playfilename[MAX_PATH] = "";
|
||||||
|
|
||||||
void Describe(HWND hwndDlg)
|
void Describe(HWND hwndDlg)
|
||||||
{
|
{
|
||||||
EMUFILE* fp = new EMUFILE_FILE(playfilename,"rb");
|
EMUFILE_FILE fp(playfilename,"rb");
|
||||||
|
if(fp.fail()) return;
|
||||||
MovieData md;
|
MovieData md;
|
||||||
LoadFM2(md, fp, INT_MAX, false);
|
LoadFM2(md, &fp, INT_MAX, false);
|
||||||
delete fp;
|
|
||||||
|
|
||||||
u32 num_frames = md.records.size();
|
u32 num_frames = md.records.size();
|
||||||
|
|
||||||
|
@ -241,7 +241,6 @@ INT_PTR CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
|
|
||||||
|
|
||||||
int flag=0;
|
int flag=0;
|
||||||
std::string sramfname;
|
|
||||||
|
|
||||||
//Record movie dialog
|
//Record movie dialog
|
||||||
static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
@ -249,7 +248,6 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,
|
||||||
static struct CreateMovieParameters* p = NULL;
|
static struct CreateMovieParameters* p = NULL;
|
||||||
std::wstring author = L"";
|
std::wstring author = L"";
|
||||||
std::string fname;
|
std::string fname;
|
||||||
int x; //temp vairable
|
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
|
@ -263,6 +261,7 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,
|
||||||
case IDOK: {
|
case IDOK: {
|
||||||
author = GetDlgItemTextW<500>(hwndDlg,IDC_EDIT_AUTHOR);
|
author = GetDlgItemTextW<500>(hwndDlg,IDC_EDIT_AUTHOR);
|
||||||
fname = GetDlgItemText<MAX_PATH>(hwndDlg,IDC_EDIT_FILENAME);
|
fname = GetDlgItemText<MAX_PATH>(hwndDlg,IDC_EDIT_FILENAME);
|
||||||
|
std::string sramfname = GetDlgItemText<MAX_PATH>(hwndDlg,IDC_EDIT_SRAMFILENAME);
|
||||||
if (fname.length())
|
if (fname.length())
|
||||||
{
|
{
|
||||||
FCEUI_SaveMovie(fname.c_str(), author, flag, sramfname);
|
FCEUI_SaveMovie(fname.c_str(), author, flag, sramfname);
|
||||||
|
@ -332,7 +331,6 @@ static INT_PTR CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,
|
||||||
fname.append(".dsv");
|
fname.append(".dsv");
|
||||||
*/
|
*/
|
||||||
SetDlgItemText(hwndDlg, IDC_EDIT_SRAMFILENAME, fname.c_str());
|
SetDlgItemText(hwndDlg, IDC_EDIT_SRAMFILENAME, fname.c_str());
|
||||||
sramfname=(std::string)fname;
|
|
||||||
}
|
}
|
||||||
//if(GetSaveFileName(&ofn))
|
//if(GetSaveFileName(&ofn))
|
||||||
// UpdateRecordDialogPath(hwndDlg,szChoice);
|
// UpdateRecordDialogPath(hwndDlg,szChoice);
|
||||||
|
|
Binary file not shown.
|
@ -248,7 +248,6 @@ static void SoundView_SwitchChanOfs(SoundView_DataStruct *data)
|
||||||
|
|
||||||
static INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
static INT_PTR CALLBACK SoundView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
LONG_PTR x;
|
|
||||||
SoundView_DataStruct *data = (SoundView_DataStruct*)GetWindowLongPtr(hDlg, DWLP_USER);
|
SoundView_DataStruct *data = (SoundView_DataStruct*)GetWindowLongPtr(hDlg, DWLP_USER);
|
||||||
if((data == NULL) && (uMsg != WM_INITDIALOG))
|
if((data == NULL) && (uMsg != WM_INITDIALOG))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue