long Stereo_Buffer::read_samples( blip_sample_t* out, long max_samples ) { long count = bufs [0].samples_avail(); if ( count > max_samples / 2 ) count = max_samples / 2; if ( count ) { if ( stereo_added || was_stereo ) { mix_stereo( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_samples( count ); bufs [2].remove_samples( count ); } else { mix_mono( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_silence( count ); bufs [2].remove_silence( count ); } // to do: this might miss opportunities for optimization if ( !bufs [0].samples_avail() ) { was_stereo = stereo_added; stereo_added = false; } } return count * 2; }
void Stereo_Mixer::read_pairs( blip_sample_t* out, int count ) { // TODO: if caller never marks buffers as modified, uses mono // except that buffer isn't cleared, so caller can encounter // subtle problems and not realize the cause. samples_read += count; if ( bufs [0]->non_silent() | bufs [1]->non_silent() ) mix_stereo( out, count ); else mix_mono( out, count ); }
long Stereo_Buffer::read_samples( blip_sample_t* out, long count ) { require( !(count & 1) ); // count must be even count = (unsigned) count / 2; long avail = bufs [0].samples_avail(); if ( count > avail ) count = avail; if ( count ) { int bufs_used = stereo_added | was_stereo; //debug_printf( "%X\n", bufs_used ); if ( bufs_used <= 1 ) { mix_mono( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_silence( count ); bufs [2].remove_silence( count ); } else if ( bufs_used & 1 ) { mix_stereo( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_samples( count ); bufs [2].remove_samples( count ); } else { mix_stereo_no_center( out, count ); bufs [0].remove_silence( count ); bufs [1].remove_samples( count ); bufs [2].remove_samples( count ); } // to do: this might miss opportunities for optimization if ( !bufs [0].samples_avail() ) { was_stereo = stereo_added; stereo_added = 0; } } return count * 2; }
long Stereo_Buffer::read_samples( blip_sample_t* out, long count ) { require( !(count & 1) ); // count must be even count = (unsigned) count / 2; long avail = bufs [0].samples_avail(); if ( count > avail ) count = avail; if ( count ) { if ( stereo_added || was_stereo ) { mix_stereo( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_samples( count ); bufs [2].remove_samples( count ); } else { mix_mono( out, count ); bufs [0].remove_samples( count ); bufs [1].remove_silence( count ); bufs [2].remove_silence( count ); } // to do: this might miss opportunities for optimization if ( !bufs [0].samples_avail() ) { was_stereo = stereo_added; stereo_added = false; } } return count * 2; }