rlm@2: /* Records SPC into wave file. Uses dsp_filter to give more authentic sound. rlm@2: rlm@3: Usage: spc_convert -s seconds -i input.spc -o output.wav rlm@2: */ rlm@2: rlm@2: #include "snes_spc/spc.h" rlm@2: rlm@2: #include "demo/wave_writer.h" rlm@2: #include "demo/demo_util.h" /* error(), load_file() */ rlm@2: rlm@2: int main( int argc, char** argv ) rlm@2: { rlm@2: /* Create emulator and filter */ rlm@2: SNES_SPC* snes_spc = spc_new(); rlm@2: SPC_Filter* filter = spc_filter_new(); rlm@2: if ( !snes_spc || !filter ) error( "Out of memory" ); rlm@3: rlm@3: int seconds = atoi(argv[2]); rlm@3: rlm@8: if (argc != 7) { rlm@8: error("Incorrect Arguments\n Sample invocation: \n spc_convert -s 5 -i input.spc -o output.wav"); rlm@8: } rlm@8: rlm@3: if (seconds <=0){ rlm@3: error("seconds must be positive."); rlm@3: } rlm@3: rlm@2: /* Load SPC */ rlm@2: { rlm@2: /* Load file into memory */ rlm@2: long spc_size; rlm@3: void* spc = load_file( argv[4] , &spc_size ); rlm@2: rlm@2: /* Load SPC data into emulator */ rlm@2: error( spc_load_spc( snes_spc, spc, spc_size ) ); rlm@2: free( spc ); /* emulator makes copy of data */ rlm@2: rlm@2: /* Most SPC files have garbage data in the echo buffer, so clear that */ rlm@2: spc_clear_echo( snes_spc ); rlm@2: rlm@2: /* Clear filter before playing */ rlm@2: spc_filter_clear( filter ); rlm@2: } rlm@2: rlm@2: /* Record 20 seconds to wave file */ rlm@3: wave_open( spc_sample_rate, argv[6] ); rlm@2: wave_enable_stereo(); rlm@3: while ( wave_sample_count() < seconds * spc_sample_rate * 2 ) rlm@2: { rlm@2: /* Play into buffer */ rlm@2: #define BUF_SIZE 2048 rlm@2: short buf [BUF_SIZE]; rlm@2: error( spc_play( snes_spc, BUF_SIZE, buf ) ); rlm@2: rlm@2: /* Filter samples */ rlm@2: spc_filter_run( filter, buf, BUF_SIZE ); rlm@2: rlm@2: wave_write( buf, BUF_SIZE ); rlm@2: } rlm@2: rlm@2: /* Cleanup */ rlm@2: spc_filter_delete( filter ); rlm@2: spc_delete( snes_spc ); rlm@2: wave_close(); rlm@2: rlm@2: return 0; rlm@2: }