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;
+	}
+}