static void flush_movie() { fseek(Movie.File, 0, SEEK_SET); write_movie_header(Movie.File, &Movie); fseek(Movie.File, Movie.ControllerDataOffset, SEEK_SET); fwrite(Movie.InputBuffer, 1, Movie.BytesPerFrame*(Movie.MaxFrame+1), Movie.File); }
int S9xMovieCreate (const char* filename, uint8 controllers_mask, uint8 opts, const wchar_t* metadata, int metadata_length) { FILE* fd; STREAM stream; int fn; return FILE_NOT_FOUND; #if 0 if(controllers_mask==0) return WRONG_FORMAT; if(!(fd=fopen(filename, "wb"))) return FILE_NOT_FOUND; // stop current movie before opening change_state(MOVIE_STATE_NONE); if(metadata_length>MOVIE_MAX_METADATA) { metadata_length=MOVIE_MAX_METADATA; } Movie.MovieId=(uint32)time(NULL); Movie.RerecordCount=0; Movie.MaxFrame=0; Movie.SaveStateOffset=SMV_HEADER_SIZE+(sizeof(uint16)*metadata_length); Movie.ControllerDataOffset=0; Movie.ControllersMask=controllers_mask; Movie.Opts=opts; if(Settings.PAL) { Movie.Opts |= MOVIE_OPT_PAL; } else { Movie.Opts &= ~MOVIE_OPT_PAL; } write_movie_header(fd, &Movie); // convert wchar_t metadata string/array to a uint16 array if(metadata_length>0) { uint8 meta_buf[MOVIE_MAX_METADATA * sizeof(uint16)]; int i; for(i=0; i<metadata_length; ++i) { uint16 c=(uint16)metadata[i]; meta_buf[i+i] =(uint8)(c&0xff); meta_buf[i+i+1]=(uint8)((c>>8)&0xff); } fwrite(meta_buf, sizeof(uint16), metadata_length, fd); }
static void flush_movie() { if(!Movie.File) return; fseek(Movie.File, 0, SEEK_SET); write_movie_header(Movie.File, &Movie); fseek(Movie.File, Movie.ControllerDataOffset, SEEK_SET); fwrite(Movie.InputBuffer, 1, Movie.BytesPerSample*(Movie.MaxSample+1), Movie.File); assert(!ferror(Movie.File)); }
static void flush_movie() { if(!Movie.File) return; if((Movie.SyncFlags & MOVIE_SYNC_HASROMINFO) == 0) // if we have to insert the ROM info into a movie made by a previous version { fseek(Movie.File, 0, SEEK_END); long oldFileSize = (uint32)ftell(Movie.File); // copy whole movie into temporary memory char * tempFile = (char*)malloc(sizeof(char)*oldFileSize); fseek(Movie.File, 0, SEEK_SET); fread(tempFile, 1, oldFileSize, Movie.File); // write back part of the movie offset by SMV_EXTRAROMINFO_SIZE fseek(Movie.File, Movie.SaveStateOffset + SMV_EXTRAROMINFO_SIZE, SEEK_SET); fwrite(tempFile + Movie.SaveStateOffset, 1, oldFileSize - Movie.SaveStateOffset, Movie.File); // free the temporary movie in memory free(tempFile); // update flags and offset amounts Movie.SyncFlags |= MOVIE_SYNC_HASROMINFO; Movie.SaveStateOffset += SMV_EXTRAROMINFO_SIZE; Movie.ControllerDataOffset += SMV_EXTRAROMINFO_SIZE; // write the extra rom info into the newly inserted space in the file between the metadata and the save data fseek(Movie.File, Movie.SaveStateOffset - SMV_EXTRAROMINFO_SIZE, SEEK_SET); write_movie_extrarominfo(Movie.File, &Movie); } fseek(Movie.File, 0, SEEK_SET); write_movie_header(Movie.File, &Movie); fseek(Movie.File, Movie.ControllerDataOffset, SEEK_SET); fwrite(Movie.InputBuffer, 1, Movie.BytesPerFrame*(Movie.MaxFrame+1), Movie.File); assert(!ferror(Movie.File)); }
int S9xMovieCreate (const char* filename, uint8 controllers_mask, uint8 opts, const wchar_t* metadata, int metadata_length) { FILE* fd; STREAM stream; int fn; if(controllers_mask==0) return WRONG_FORMAT; char movie_filename [_MAX_PATH]; #ifdef __WIN32__ _fullpath(movie_filename, filename, _MAX_PATH); #else strcpy(movie_filename, filename); #endif if(!(fd=fopen(movie_filename, "wb"))) return FILE_NOT_FOUND; const bool8 wasPaused = Settings.Paused; // stop current movie before opening change_state(MOVIE_STATE_NONE); if(metadata_length>MOVIE_MAX_METADATA) { metadata_length=MOVIE_MAX_METADATA; } Movie.MovieId=(uint32)time(NULL); Movie.RerecordCount=0; Movie.MaxFrame=0; Movie.MaxSample=0; Movie.SaveStateOffset=SMV_HEADER_SIZE+(sizeof(uint16)*metadata_length) + SMV_EXTRAROMINFO_SIZE; Movie.ControllerDataOffset=0; Movie.ControllersMask=controllers_mask; Movie.Opts=opts; Movie.SyncFlags=MOVIE_SYNC_DATA_EXISTS|MOVIE_SYNC_HASROMINFO; // store previous, in case we switch to playback later store_previous_settings(); // store settings in movie store_movie_settings(); // extra rom info Movie.ROMCRC32 = Memory.ROMCRC32; strncpy(Movie.ROMName, Memory.ROMName, 23); write_movie_header(fd, &Movie); // convert wchar_t metadata string/array to a uint16 array if(metadata_length>0) { uint8 meta_buf[MOVIE_MAX_METADATA * sizeof(uint16)]; for(int i=0; i<metadata_length; ++i) { uint16 c=(uint16)metadata[i]; meta_buf[i+i] =(uint8)(c&0xff); meta_buf[i+i+1]=(uint8)((c>>8)&0xff); } fwrite(meta_buf, sizeof(uint16), metadata_length, fd); assert(!ferror(fd)); }