Mercurial > vba-clojure
view src/common/movie.h @ 554:37daf1acb212
progress.
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 31 Aug 2012 00:51:17 -0500 |
parents | f9f4f1b99eed |
children |
line wrap: on
line source
1 #ifndef VBA_MOVIE_H2 #define VBA_MOVIE_H4 #if _MSC_VER > 10005 #pragma once6 #endif // _MSC_VER > 10008 #include <ctime>9 #include <string>11 #include "../Port.h"13 #define ZLIB14 ///#ifdef ZLIB15 #ifndef WIN3216 #include "zlib.h"17 #endif19 #ifndef MOVIE_SUCCESS20 # define MOVIE_SUCCESS 121 # define MOVIE_NOTHING 022 # define MOVIE_WRONG_FORMAT (-1)23 # define MOVIE_WRONG_VERSION (-2)24 # define MOVIE_FILE_NOT_FOUND (-3)25 # define MOVIE_NOT_FROM_THIS_MOVIE (-4)26 # define MOVIE_NOT_FROM_A_MOVIE (-5)27 # define MOVIE_SNAPSHOT_INCONSISTENT (-6)28 # define MOVIE_UNKNOWN_ERROR (-7)29 #endif31 #define VBM_MAGIC (0x1a4D4256) // VBM0x1a32 #define VBM_VERSION (1)33 #define VBM_HEADER_SIZE (64)34 #define CONTROLLER_DATA_SIZE (2)35 #define BUFFER_GROWTH_SIZE (4096)36 #define MOVIE_METADATA_SIZE (192)37 #define MOVIE_METADATA_AUTHOR_SIZE (64)39 // revision 1 uses (?) insted of (!) as reset40 #define VBM_REVISION (1)42 #define MOVIE_START_FROM_SNAPSHOT (1<<0)43 #define MOVIE_START_FROM_SRAM (1<<1)45 #define MOVIE_CONTROLLER(i) (1<<(i))46 #define MOVIE_CONTROLLERS_ANY_MASK (MOVIE_CONTROLLER(0)|MOVIE_CONTROLLER(1)|MOVIE_CONTROLLER(2)|MOVIE_CONTROLLER(3))47 #define MOVIE_NUM_OF_POSSIBLE_CONTROLLERS (4)49 #define MOVIE_TYPE_GBA (1<<0)50 #define MOVIE_TYPE_GBC (1<<1)51 #define MOVIE_TYPE_SGB (1<<2)53 #define MOVIE_SETTING_USEBIOSFILE (1<<0)54 #define MOVIE_SETTING_SKIPBIOSFILE (1<<1)55 #define MOVIE_SETTING_RTCENABLE (1<<2)56 #define MOVIE_SETTING_GBINPUTHACK (1<<3)57 #define MOVIE_SETTING_LAGHACK (1<<4)58 #define MOVIE_SETTING_GBCFF55FIX (1<<5)59 #define MOVIE_SETTING_GBECHORAMFIX (1<<6)61 #define STREAM gzFile62 /*#define READ_STREAM(p,l,s) gzread (s,p,l)63 #define WRITE_STREAM(p,l,s) gzwrite (s,p,l)64 #define OPEN_STREAM(f,m) gzopen (f,m)65 #define REOPEN_STREAM(f,m) gzdopen (f,m)66 #define FIND_STREAM(f) gztell(f)67 #define REVERT_STREAM(f,o,s) gzseek(f,o,s)68 #define CLOSE_STREAM(s) gzclose (s)69 #else70 #define STREAM FILE *71 #define READ_STREAM(p,l,s) fread (p,1,l,s)72 #define WRITE_STREAM(p,l,s) fwrite (p,1,l,s)73 #define OPEN_STREAM(f,m) fopen (f,m)74 #define REOPEN_STREAM(f,m) fdopen (f,m)75 #define FIND_STREAM(f) ftell(f)76 #define REVERT_STREAM(f,o,s) fseek(f,o,s)77 #define CLOSE_STREAM(s) fclose (s)78 #endif*/80 enum MovieState81 {82 MOVIE_STATE_NONE = 0,83 MOVIE_STATE_PLAY,84 MOVIE_STATE_RECORD,85 MOVIE_STATE_END86 };88 struct SMovieFileHeader89 {90 uint32 magic; // VBM0x1a91 uint32 version; // 192 int32 uid; // used to match savestates to a particular movie93 uint32 length_frames;94 uint32 rerecord_count;95 uint8 startFlags;96 uint8 controllerFlags;97 uint8 typeFlags;98 uint8 optionFlags;99 uint32 saveType; // emulator setting value100 uint32 flashSize; // emulator setting value101 uint32 gbEmulatorType; // emulator setting value102 char romTitle [12];103 uint8 minorVersion; // minor version/revision of the current movie version104 uint8 romCRC; // the CRC of the ROM used while recording105 uint16 romOrBiosChecksum; // the Checksum of the ROM used while recording, or a CRC of the BIOS if GBA106 uint32 romGameCode; // the Game Code of the ROM used while recording, or "\0\0\0\0" if not GBA107 uint32 offset_to_savestate; // offset to the savestate or SRAM inside file, set to 0 if unused108 uint32 offset_to_controller_data; // offset to the controller data inside file109 };111 struct SMovie112 {113 enum MovieState state;114 char filename[/*_MAX_PATH*/ 260]; // FIXME: should use a string instead115 FILE* file;116 uint8 readOnly;117 int32 pauseFrame; // FIXME: byte size119 SMovieFileHeader header;120 char authorInfo[MOVIE_METADATA_SIZE];122 uint32 currentFrame; // should == length_frame when recording, and be < length_frames when playing123 uint32 bytesPerFrame;124 uint8* inputBuffer;125 uint32 inputBufferSize;126 uint8* inputBufferPtr;128 // bool8 doesn't make much sense if it is meant to solve any portability problem,129 // because there's no guarantee that true == 1 and false == 0 (or TRUE == 1 and FALSE == 0) on all platforms.130 // while using user-defined boolean types might impact on performance.131 // the more reliable (and faster!) way to maintain cross-platform I/O compatibility is132 // to manually map from/to built-in boolean types to/from fixed-sized types value by value ONLY when doing I/O133 // e.g. bool(true) <-> u8(1) and <-> bool(false) <-> u8(0), BOOL(TRUE) <-> s32(-1) and BOOL(FALSE) <-> s32(0) etc.134 bool8 RecordedThisSession;135 };137 // methods used by the user-interface code138 int VBAMovieOpen(const char *filename, bool8 read_only);139 int VBAMovieCreate(const char *filename, const char *authorInfo, uint8 startFlags, uint8 controllerFlags, uint8 typeFlags);140 int VBAMovieGetInfo(const char *filename, SMovie*info);141 void VBAMovieGetRomInfo(const SMovie &movieInfo, char romTitle[12], uint32 &romGameCode, uint16 &checksum, uint8 &crc);142 void VBAMovieStop(bool8 suppress_message);143 const char *VBAChooseMovieFilename(bool8 read_only);145 // methods used by the emulation146 void VBAMovieInit();147 void VBAMovieUpdateState();148 void VBAMovieRead(int controllerNum = 0, bool sensor = false);149 void VBAMovieWrite(int controllerNum = 0, bool sensor = false);150 void VBAUpdateButtonPressDisplay();151 void VBAUpdateFrameCountDisplay();152 //bool8 VBAMovieRewind (uint32 at_frame);153 void VBAMovieFreeze(uint8 **buf, uint32 *size);154 int VBAMovieUnfreeze(const uint8 *buf, uint32 size);155 void VBAMovieRestart();157 // accessor functions158 bool8 VBAMovieActive();159 bool8 VBAMovieLoading();160 bool8 VBAMoviePlaying();161 bool8 VBAMovieRecording();162 // the following accessors return 0/false if !VBAMovieActive()163 uint8 VBAMovieReadOnly();164 uint32 VBAMovieGetVersion();165 uint32 VBAMovieGetMinorVersion();166 uint32 VBAMovieGetId();167 uint32 VBAMovieGetLength();168 uint32 VBAMovieGetFrameCounter();169 uint32 VBAMovieGetState();170 uint32 VBAMovieGetRerecordCount ();171 uint32 VBAMovieSetRerecordCount (uint32 newRerecordCount);172 std::string VBAMovieGetAuthorInfo();173 std::string VBAMovieGetFilename();175 uint16 VBAMovieGetCurrentInputOf(int controllerNum, bool normalOnly = true);176 void VBAMovieSignalReset();177 void VBAMovieResetIfRequested();178 void VBAMovieSetMetadata(const char *info);179 void VBAMovieToggleReadOnly();180 bool VBAMovieEnded();181 bool VBAMovieAllowsRerecording();182 bool VBAMovieSwitchToPlaying();183 bool VBAMovieSwitchToRecording();184 int VBAMovieGetPauseAt();185 void VBAMovieSetPauseAt(int at);186 int VBAMovieConvertCurrent();187 bool VBAMovieTuncateAtCurrentFrame();188 bool VBAMovieFixHeader();190 #endif // VBA_MOVIE_H