/** * @brief Decodes a chunk of the previously loaded SPC data into PCM data. * @param decoded_data pointer to where you want the decoded data to be wrote * @param nb_samples number of samples to write */ void SpcDecoder::decode(int16_t *decoded_data, int nb_samples) { // decode from the SPC data the specified number of PCM samples const char *err = spc_play(snes_spc_manager, nb_samples, (short int*) decoded_data); Debug::check_assertion(err == NULL, StringConcat() << "Failed to decode SPC data: " << err); spc_filter_run(snes_spc_filter, (short int*) decoded_data, nb_samples); }
/** * \brief Decodes a chunk of the previously loaded SPC data into PCM data. * \param decoded_data pointer to where you want the decoded data to be written. * \param nb_samples Number of samples to write. */ void SpcDecoder::decode(int16_t* decoded_data, int nb_samples) { // Decode from the SPC data the specified number of PCM samples. const char* err = spc_play(snes_spc_manager.get(), nb_samples, (short int*) decoded_data); if (err != nullptr) { Debug::die(std::string("Failed to decode SPC data: ") + err); } spc_filter_run(snes_spc_filter.get(), (short int*) decoded_data, nb_samples); }
void record_wav( const char* path, int secs ) { /* Start writing wave file */ wave_open( spc_sample_rate, path ); wave_enable_stereo(); while ( wave_sample_count() < secs * spc_sample_rate * 2 ) { /* Play into buffer */ #define BUF_SIZE 2048 short buf [BUF_SIZE]; error( spc_play( snes_spc, BUF_SIZE, buf ) ); wave_write( buf, BUF_SIZE ); } wave_close(); }
int main( int argc, char** argv ) { /* Create emulator and filter */ SNES_SPC* snes_spc = spc_new(); SPC_Filter* filter = spc_filter_new(); if ( !snes_spc || !filter ) error( "Out of memory" ); /* Load SPC */ { /* Load file into memory */ long spc_size; void* spc = load_file( (argc > 1) ? argv [1] : "test.spc", &spc_size ); /* Load SPC data into emulator */ error( spc_load_spc( snes_spc, spc, spc_size ) ); free( spc ); /* emulator makes copy of data */ /* Most SPC files have garbage data in the echo buffer, so clear that */ spc_clear_echo( snes_spc ); /* Clear filter before playing */ spc_filter_clear( filter ); } /* Record 20 seconds to wave file */ wave_open( spc_sample_rate, "out.wav" ); wave_enable_stereo(); while ( wave_sample_count() < 60 * spc_sample_rate * 2 ) { /* Play into buffer */ #define BUF_SIZE 2048 short buf [BUF_SIZE]; error( spc_play( snes_spc, BUF_SIZE, buf ) ); /* Filter samples */ spc_filter_run( filter, buf, BUF_SIZE ); wave_write( buf, BUF_SIZE ); } /* Cleanup */ spc_filter_delete( filter ); spc_delete( snes_spc ); wave_close(); return 0; }
void make_save_state( const char* path ) { /* Load SPC */ long spc_size; void* spc = load_file( path, &spc_size ); error( spc_load_spc( snes_spc, spc, spc_size ) ); free( spc ); spc_clear_echo( snes_spc ); /* Skip several seconds */ error( spc_play( snes_spc, 5 * spc_sample_rate * 2, 0 ) ); /* Save state to file */ { static unsigned char state [spc_state_size]; /* buffer large enough for data */ unsigned char* out = state; spc_copy_state( snes_spc, &out, state_save ); write_file( "state.bin", state, out - state ); } record_wav( "first.wav", 5 ); }