long Stereo_Buffer::read_samples( blip_sample_t* out, long out_size ) { require( (out_size & 1) == 0 ); // must read an even number of samples out_size = min( out_size, samples_avail() ); int pair_count = int (out_size >> 1); if ( pair_count ) { mixer.read_pairs( out, pair_count ); if ( samples_avail() <= 0 || immediate_removal() ) { for ( int i = bufs_size; --i >= 0; ) { buf_t& b = bufs [i]; // TODO: might miss non-silence settling since it checks END of last read if ( !b.non_silent() ) b.remove_silence( mixer.samples_read ); else b.remove_samples( mixer.samples_read ); } mixer.samples_read = 0; } } return out_size; }
long Effects_Buffer::read_samples( blip_sample_t* out, long out_size ) { out_size = min( out_size, samples_avail() ); int pair_count = int (out_size >> 1); require( pair_count * stereo == out_size ); // must read an even number of samples if ( pair_count ) { if ( no_effects ) { mixer.read_pairs( out, pair_count ); } else { int pairs_remain = pair_count; do { // mix at most max_read pairs at a time int count = max_read; if ( count > pairs_remain ) count = pairs_remain; if ( no_echo ) { // optimization: clear echo here to keep mix_effects() a leaf function echo_pos = 0; memset( echo.begin(), 0, count * stereo * sizeof echo [0] ); } mix_effects( out, count ); blargg_long new_echo_pos = echo_pos + count * stereo; if ( new_echo_pos >= echo_size ) new_echo_pos -= echo_size; echo_pos = new_echo_pos; assert( echo_pos < echo_size ); out += count * stereo; mixer.samples_read += count; pairs_remain -= count; } while ( pairs_remain ); } if ( samples_avail() <= 0 || immediate_removal() ) { for ( int i = bufs_size; --i >= 0; ) { buf_t& b = bufs [i]; // TODO: might miss non-silence settling since it checks END of last read if ( b.non_silent() ) b.remove_samples( mixer.samples_read ); else b.remove_silence( mixer.samples_read ); } mixer.samples_read = 0; } } return out_size; }
long Nes_Rewinder::read_samples( short* out, long out_size ) { int count = samples_avail(); if ( count ) { if ( count > out_size ) { count = out_size; } if ( !reverse_enabled ) { memcpy( out, frames [current_frame].samples, count * sizeof *out ); } else { int step = samples_per_frame(); for ( int i = step; i-- > 0; ) copy_reverse( frames [current_frame].samples + i, count, out + i, step ); } if ( fade_sound_in ) { fade_sound_in = false; fade_samples_( out, count, 1 ); } if ( frames [current_frame].fade_out ) { fade_sound_in = true; fade_samples_( out, count, -1 ); } } return count; }
void Tracked_Blip_Buffer::remove_all_samples() { long avail = samples_avail(); if ( !non_silent() ) remove_silence( avail ); else remove_samples( avail ); }
void Blip_Buffer::clear( int entire_buffer ) { offset_ = 0; reader_accum = 0; if ( buffer_ ) { long count = (entire_buffer ? buffer_size_ : samples_avail()); memset( buffer_, 0, (count + buffer_extra) * sizeof (buf_t_) ); } }
void Tracked_Blip_Buffer::end_frame( blip_time_t t ) { Blip_Buffer::end_frame( t ); if ( clear_modified() ) last_non_silence = samples_avail() + blip_buffer_extra_; }