Mercurial > audlegacy
diff Plugins/Input/console/Spc_Emu.cpp @ 477:8fc500c08b61 trunk
[svn] SPC length detection c/o Kiyoshi Aman <kiyoshi.aman -at- gmail.com>
author | nenolod |
---|---|
date | Thu, 19 Jan 2006 19:31:32 -0800 |
parents | 252843aac42f |
children | 0b9507985f0d |
line wrap: on
line diff
--- a/Plugins/Input/console/Spc_Emu.cpp Thu Jan 19 15:45:42 2006 -0800 +++ b/Plugins/Input/console/Spc_Emu.cpp Thu Jan 19 19:31:32 2006 -0800 @@ -4,6 +4,7 @@ #include "Spc_Emu.h" #include <string.h> +#include "abstract_file.h" /* Copyright (C) 2004-2005 Shay Green. This module is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser @@ -18,6 +19,12 @@ #include BLARGG_SOURCE_BEGIN +#ifndef RAISE_ERROR + #define RAISE_ERROR( str ) return str +#endif + +typedef Spc_Reader::error_t error_t; + Spc_Emu::Spc_Emu() { resample_ratio = 1.0; @@ -111,3 +118,73 @@ return blargg_success; } +Spc_Reader::Spc_Reader() : file( NULL ) { +} + +Spc_Reader::~Spc_Reader() { + close(); +} + +error_t Spc_Reader::open( const char* path ) +{ + file = fopen( path, "rb" ); + if ( !file ) + RAISE_ERROR( "Couldn't open file" ); + return NULL; +} + +blargg_err_t Spc_Reader::read_head(Spc_Emu::header_t *header) { + fread(&header->tag, 1,35,file); + fread(&header->format, 1, 1,file); + fread(&header->version, 1, 1,file); + fread(&header->pc, 1, 2,file); + fread(&header->a, 1, 1,file); + fread(&header->x, 1, 1,file); + fread(&header->y, 1, 1,file); + fread(&header->psw, 1, 1,file); + fread(&header->sp, 1, 1,file); + fread(&header->unused, 1, 2,file); + fread(&header->song, 1,32,file); + fread(&header->game, 1,32,file); + fread(&header->dumper, 1,16,file); + fread(&header->comment, 1,32,file); + fread(&header->date, 1,11,file); + fread(&header->len_secs,1, 3,file); + fread(&header->fade_msec,1,5,file); + fread(&header->author, 1,32,file); + fread(&header->mute_mask,1,1,file); + fread(&header->emulator,1, 1,file); + fread(&header->unused2, 1,45,file); +} + +long Spc_Reader::size() const +{ + long pos = tell(); + fseek( file, 0, SEEK_END ); + long result = tell(); + fseek( file, pos, SEEK_SET ); + return result; +} + +long Spc_Reader::read_avail( void* p, long s ) { + return fread( p, 1, s, file ); +} + +long Spc_Reader::tell() const { + return ftell( file ); +} + +error_t Spc_Reader::seek( long n ) +{ + if ( fseek( file, n, SEEK_SET ) != 0 ) + RAISE_ERROR( "Error seeking in file" ); + return NULL; +} + +void Spc_Reader::close() +{ + if ( file ) { + fclose( file ); + file = NULL; + } +}