// 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; }
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; }
// 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; }