void tape_event_record_sample( libspectrum_dword last_tstates, int type, void *user_data ) { int error; if( rec_state.last_level != (ula_tape_level()) ) { /* put a sample into the recording buffer */ rec_state.tape_buffer_used = write_rec_buffer( rec_state.tape_buffer, rec_state.tape_buffer_used, rec_state.last_level_count ); rec_state.last_level_count = 0; rec_state.last_level = ula_tape_level(); /* make sure we can still fit a dword and a flag byte in the buffer */ if( rec_state.tape_buffer_used+5 >= rec_state.tape_buffer_size ) { rec_state.tape_buffer_size = rec_state.tape_buffer_size*2; rec_state.tape_buffer = realloc( rec_state.tape_buffer, rec_state.tape_buffer_size ); } } rec_state.last_level_count++; /* schedule next timer */ error = event_add( last_tstates + rec_state.tstates_per_sample, record_event ); if( error ) { ui_error( UI_ERROR_ERROR, "tape_event_record_sample: error scheduling next event" ); } }
void tape_event_record_sample( libspectrum_dword last_tstates, int type, void *user_data ) { if( rec_state.last_level != (ula_tape_level()) ) { /* put a sample into the recording buffer */ rec_state.tape_buffer_used = write_rec_buffer( rec_state.tape_buffer, rec_state.tape_buffer_used, rec_state.last_level_count ); rec_state.last_level_count = 0; rec_state.last_level = ula_tape_level(); /* make sure we can still fit a dword and a flag byte in the buffer */ if( rec_state.tape_buffer_used+5 >= rec_state.tape_buffer_size ) { rec_state.tape_buffer_size = rec_state.tape_buffer_size*2; rec_state.tape_buffer = libspectrum_renew( libspectrum_byte, rec_state.tape_buffer, rec_state.tape_buffer_size ); } } rec_state.last_level_count++; /* schedule next timer */ event_add( last_tstates + rec_state.tstates_per_sample, record_event ); }
int tape_record_start( void ) { int error; /* sample rate will be 44.1KHz */ rec_state.tstates_per_sample = machine_current->timings.processor_speed/44100; rec_state.tape_buffer_size = 8192; rec_state.tape_buffer = malloc(rec_state.tape_buffer_size); rec_state.tape_buffer_used = 0; /* start scheduling events that record into a buffer that we start allocating here */ error = event_add( tstates + rec_state.tstates_per_sample, record_event ); if( error ) return error; rec_state.last_level = ula_tape_level(); rec_state.last_level_count = 1; tape_recording = 1; /* Also want to disable other tape actions */ ui_menu_activate( UI_MENU_ITEM_TAPE_RECORDING, 1 ); return 0; }