Esempio n. 1
0
// Read samples as unsigned 8-bit
long read_samples( Blip_Buffer& buf, unsigned char* out, long out_size )
{
	// Limit number of samples read to those available
	long count = buf.samples_avail();
	if ( count > out_size )
		count = out_size;
	
	// Begin reading samples from Blip_Buffer
	Blip_Reader reader;
	int bass = reader.begin( buf );
	
	for ( long n = count; n--; )
	{
		// Read 16-bit sample and convert to output format
		long s = reader.read();
		reader.next( bass );
		if ( (short) s != s ) // clamp to 16 bits
			s = 0x7fff - (s >> 24);
		
		*out++ = (s >> 8) + 0x80;
	}
	
	// End reading and remove the samples
	reader.end( buf );
	buf.remove_samples( count );
	
	return count;
}
Esempio n. 2
0
long Nes_Nonlinearizer::make_nonlinear( Blip_Buffer& buf, long count )
{
	require( apu );
	long avail = buf.samples_avail();
	if ( count > avail )
		count = avail;
	if ( count && enabled )
	{
		
		Blip_Buffer::buf_t_* p = buf.buffer_;
		long accum = this->accum;
		long prev = this->prev;
		for ( unsigned n = count; n; --n )
		{
			long entry = ENTRY( accum );
			check( (entry >= 0) == (accum >= 0) );
			accum += *p;
			*p++ = (entry - prev) << (blip_sample_bits - 16);
			prev = entry;
		}
		
		this->prev = prev;
		this->accum = accum;
	}
	
	return count;
}
Esempio n. 3
0
// Read samples as floating-point, with values staying
// between 'low' and 'high' (defaults to -1.0 to 1.0).
long read_samples( Blip_Buffer& buf, float* out, long out_size,
		float low = -1.0f, float high = 1.0f )
{
	// Limit number of samples read to those available
	long count = buf.samples_avail();
	if ( count > out_size )
		count = out_size;
	
	// Begin reading samples from Blip_Buffer
	Blip_Reader reader;
	int bass = reader.begin( buf );
	
	float factor = (high - low) * 0.5f;
	float offset = low + 1.0f * factor;
	unsigned long const sample_range = 1UL << blip_sample_bits;
	factor *= 1.0f / (sample_range / 2);
	
	for ( long n = count; n--; )
	{
		// Read sample at full resolution and convert to output format
		long s = reader.read_raw();
		reader.next( bass );
		*out++ = s * factor + offset;
		if ( (unsigned long) (s + sample_range / 2) >= sample_range )
		{
			// clamp
			out [-1] = high;
			if ( s < 0 )
				out [-1] = low;
		}
	}
	
	// End reading and remove the samples
	reader.end( buf );
	buf.remove_samples( count );
	
	return count;
}