rlm@0: /* Records SPC into wave file. Uses dsp_filter to give more authentic sound. rlm@0: rlm@0: Usage: play_spc [test.spc] rlm@0: */ rlm@0: rlm@0: #include "snes_spc/spc.h" rlm@0: rlm@0: #include "wave_writer.h" rlm@0: #include "demo_util.h" /* error(), load_file() */ rlm@0: rlm@0: int main( int argc, char** argv ) rlm@0: { rlm@0: /* Create emulator and filter */ rlm@0: SNES_SPC* snes_spc = spc_new(); rlm@0: SPC_Filter* filter = spc_filter_new(); rlm@0: if ( !snes_spc || !filter ) error( "Out of memory" ); rlm@0: rlm@0: /* Load SPC */ rlm@0: { rlm@0: /* Load file into memory */ rlm@0: long spc_size; rlm@0: void* spc = load_file( (argc > 1) ? argv [1] : "test.spc", &spc_size ); rlm@0: rlm@0: /* Load SPC data into emulator */ rlm@0: error( spc_load_spc( snes_spc, spc, spc_size ) ); rlm@0: free( spc ); /* emulator makes copy of data */ rlm@0: rlm@0: /* Most SPC files have garbage data in the echo buffer, so clear that */ rlm@0: spc_clear_echo( snes_spc ); rlm@0: rlm@0: /* Clear filter before playing */ rlm@0: spc_filter_clear( filter ); rlm@0: } rlm@0: rlm@0: /* Record 20 seconds to wave file */ rlm@0: wave_open( spc_sample_rate, "out.wav" ); rlm@0: wave_enable_stereo(); rlm@0: while ( wave_sample_count() < 20 * spc_sample_rate * 2 ) rlm@0: { rlm@0: /* Play into buffer */ rlm@0: #define BUF_SIZE 2048 rlm@0: short buf [BUF_SIZE]; rlm@0: error( spc_play( snes_spc, BUF_SIZE, buf ) ); rlm@0: rlm@0: /* Filter samples */ rlm@0: spc_filter_run( filter, buf, BUF_SIZE ); rlm@0: rlm@0: wave_write( buf, BUF_SIZE ); rlm@0: } rlm@0: rlm@0: /* Cleanup */ rlm@0: spc_filter_delete( filter ); rlm@0: spc_delete( snes_spc ); rlm@0: wave_close(); rlm@0: rlm@0: return 0; rlm@0: }