Пример #1
0
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;
}
Пример #3
0
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;
}
Пример #4
0
void Tracked_Blip_Buffer::remove_all_samples()
{
	long avail = samples_avail();
	if ( !non_silent() )
		remove_silence( avail );
	else
		remove_samples( avail );
}
Пример #5
0
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_) );
	}
}
Пример #6
0
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_;
}