Mercurial > spc_convert
diff convert/spc_convert.c @ 2:c3248c71ae74
begin convert program
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 21 Oct 2011 06:21:33 -0700 |
parents | |
children | 95cdedd01422 |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/convert/spc_convert.c Fri Oct 21 06:21:33 2011 -0700 1.3 @@ -0,0 +1,57 @@ 1.4 +/* Records SPC into wave file. Uses dsp_filter to give more authentic sound. 1.5 + 1.6 + Usage: play_spc [-s seconds] input.spc output.wav 1.7 +*/ 1.8 + 1.9 +#include "snes_spc/spc.h" 1.10 + 1.11 +#include "demo/wave_writer.h" 1.12 +#include "demo/demo_util.h" /* error(), load_file() */ 1.13 + 1.14 +int main( int argc, char** argv ) 1.15 +{ 1.16 + /* Create emulator and filter */ 1.17 + SNES_SPC* snes_spc = spc_new(); 1.18 + SPC_Filter* filter = spc_filter_new(); 1.19 + if ( !snes_spc || !filter ) error( "Out of memory" ); 1.20 + 1.21 + /* Load SPC */ 1.22 + { 1.23 + /* Load file into memory */ 1.24 + long spc_size; 1.25 + void* spc = load_file( (argc > 1) ? argv [1] : "test.spc", &spc_size ); 1.26 + 1.27 + /* Load SPC data into emulator */ 1.28 + error( spc_load_spc( snes_spc, spc, spc_size ) ); 1.29 + free( spc ); /* emulator makes copy of data */ 1.30 + 1.31 + /* Most SPC files have garbage data in the echo buffer, so clear that */ 1.32 + spc_clear_echo( snes_spc ); 1.33 + 1.34 + /* Clear filter before playing */ 1.35 + spc_filter_clear( filter ); 1.36 + } 1.37 + 1.38 + /* Record 20 seconds to wave file */ 1.39 + wave_open( spc_sample_rate, "out.wav" ); 1.40 + wave_enable_stereo(); 1.41 + while ( wave_sample_count() < 20 * spc_sample_rate * 2 ) 1.42 + { 1.43 + /* Play into buffer */ 1.44 +#define BUF_SIZE 2048 1.45 + short buf [BUF_SIZE]; 1.46 + error( spc_play( snes_spc, BUF_SIZE, buf ) ); 1.47 + 1.48 + /* Filter samples */ 1.49 + spc_filter_run( filter, buf, BUF_SIZE ); 1.50 + 1.51 + wave_write( buf, BUF_SIZE ); 1.52 + } 1.53 + 1.54 + /* Cleanup */ 1.55 + spc_filter_delete( filter ); 1.56 + spc_delete( snes_spc ); 1.57 + wave_close(); 1.58 + 1.59 + return 0; 1.60 +}