diff src/console/Dual_Resampler.cxx @ 316:fb513e10174e trunk

[svn] - merge libconsole-blargg into mainline libconsole: + obsoletes plugins-ugly:sapplug
author nenolod
date Thu, 30 Nov 2006 19:54:33 -0800
parents 3da1b8942b8b
children 986f098da058
line wrap: on
line diff
--- a/src/console/Dual_Resampler.cxx	Wed Nov 29 14:42:11 2006 -0800
+++ b/src/console/Dual_Resampler.cxx	Thu Nov 30 19:54:33 2006 -0800
@@ -1,5 +1,4 @@
-
-// Game_Music_Emu 0.3.0. http://www.slack.net/~ant/
+// Game_Music_Emu 0.5.1. http://www.slack.net/~ant/
 
 #include "Dual_Resampler.h"
 
@@ -12,56 +11,69 @@
 version 2.1 of the License, or (at your option) any later version. This
 module is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
-more details. You should have received a copy of the GNU Lesser General
-Public License along with this module; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+unsigned const resampler_extra = 256;
 
-#include BLARGG_SOURCE_BEGIN
+Dual_Resampler::Dual_Resampler() { }
+
+Dual_Resampler::~Dual_Resampler() { }
 
-const unsigned resampler_extra = 256;
-
-Dual_Resampler::Dual_Resampler()
+blargg_err_t Dual_Resampler::reset( int pairs )
 {
+	// expand allocations a bit
+	RETURN_ERR( sample_buf.resize( (pairs + (pairs >> 2)) * 2 ) );
+	resize( pairs );
+	resampler_size = oversamples_per_frame + (oversamples_per_frame >> 2);
+	return resampler.buffer_size( resampler_size );
 }
 
-Dual_Resampler::~Dual_Resampler()
+void Dual_Resampler::resize( int pairs )
 {
+	int new_sample_buf_size = pairs * 2;
+	if ( sample_buf_size != new_sample_buf_size )
+	{
+		if ( (unsigned) new_sample_buf_size > sample_buf.size() )
+		{
+			check( false );
+			return;
+		}
+		sample_buf_size = new_sample_buf_size;
+		oversamples_per_frame = int (pairs * resampler.ratio()) * 2 + 2;
+		clear();
+	}
 }
 
-blargg_err_t Dual_Resampler::resize( int pairs )
+void Dual_Resampler::play_frame_( Blip_Buffer& blip_buf, dsample_t* out )
 {
-	BLARGG_RETURN_ERR( sample_buf.resize( pairs * 2 ) );
-	buf_pos = sample_buf.size();
-	oversamples_per_frame = int (pairs * resampler.ratio()) * 2 + 2;
-	return resampler.buffer_size( oversamples_per_frame + resampler_extra );
-}
-
-void Dual_Resampler::play_frame_( Blip_Buffer& blip_buf, sample_t* out )
-{
-	long pair_count = sample_buf.size() >> 1;
+	long pair_count = sample_buf_size >> 1;
 	blip_time_t blip_time = blip_buf.count_clocks( pair_count );
 	int sample_count = oversamples_per_frame - resampler.written();
 	
 	int new_count = play_frame( blip_time, sample_count, resampler.buffer() );
-	assert( unsigned (new_count - sample_count) < resampler_extra );
+	assert( new_count < resampler_size );
 	
 	blip_buf.end_frame( blip_time );
 	assert( blip_buf.samples_avail() == pair_count );
 	
 	resampler.write( new_count );
 	
-	long count = resampler.read( sample_buf.begin(), sample_buf.size() );
-	assert( count == (long) sample_buf.size() );
+	long count = resampler.read( sample_buf.begin(), sample_buf_size );
+	assert( count == (long) sample_buf_size );
 	
 	mix_samples( blip_buf, out );
 	blip_buf.remove_samples( pair_count );
 }
 
-void Dual_Resampler::play( long count, sample_t* out, Blip_Buffer& blip_buf )
+void Dual_Resampler::dual_play( long count, dsample_t* out, Blip_Buffer& blip_buf )
 {
 	// empty extra buffer
-	long remain = sample_buf.size() - buf_pos;
+	long remain = sample_buf_size - buf_pos;
 	if ( remain )
 	{
 		if ( remain > count )
@@ -73,11 +85,11 @@
 	}
 	
 	// entire frames
-	while ( count >= (long) sample_buf.size() )
+	while ( count >= (long) sample_buf_size )
 	{
 		play_frame_( blip_buf, out );
-		out += sample_buf.size();
-		count -= sample_buf.size();
+		out += sample_buf_size;
+		count -= sample_buf_size;
 	}
 	
 	// extra
@@ -90,29 +102,28 @@
 	}
 }
 
-#include BLARGG_ENABLE_OPTIMIZER
-
-void Dual_Resampler::mix_samples( Blip_Buffer& blip_buf, sample_t* out )
+void Dual_Resampler::mix_samples( Blip_Buffer& blip_buf, dsample_t* out )
 {
 	Blip_Reader sn;
 	int bass = sn.begin( blip_buf );
-	const sample_t* in = sample_buf.begin();
+	const dsample_t* in = sample_buf.begin();
 	
-	for ( int n = sample_buf.size() >> 1; n--; )
+	for ( int n = sample_buf_size >> 1; n--; )
 	{
 		int s = sn.read();
-		long l = (long) in [0] * 2 + s;
-		sn.next( bass );
-		long r = in [1];
+		blargg_long l = (blargg_long) in [0] * 2 + s;
 		if ( (BOOST::int16_t) l != l )
 			l = 0x7FFF - (l >> 24);
-		r = r * 2 + s;
+		
+		sn.next( bass );
+		blargg_long r = (blargg_long) in [1] * 2 + s;
+		if ( (BOOST::int16_t) r != r )
+			r = 0x7FFF - (r >> 24);
+		
 		in += 2;
 		out [0] = l;
 		out [1] = r;
 		out += 2;
-		if ( (BOOST::int16_t) r != r )
-			out [-1] = 0x7FFF - (r >> 24);
 	}
 	
 	sn.end( blip_buf );