diff src/console/Multi_Buffer.h @ 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
line wrap: on
line diff
--- a/src/console/Multi_Buffer.h	Wed Nov 29 14:42:11 2006 -0800
+++ b/src/console/Multi_Buffer.h	Thu Nov 30 19:54:33 2006 -0800
@@ -1,8 +1,6 @@
-
 // Multi-channel sound buffer interface, and basic mono and stereo buffers
 
-// Blip_Buffer 0.4.0
-
+// Blip_Buffer 0.4.1
 #ifndef MULTI_BUFFER_H
 #define MULTI_BUFFER_H
 
@@ -25,7 +23,9 @@
 		Blip_Buffer* left;
 		Blip_Buffer* right;
 	};
-	virtual channel_t channel( int index ) = 0;
+	enum { type_index_mask = 0xFF };
+	enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
+	virtual channel_t channel( int index, int type ) = 0;
 	
 	// See Blip_Buffer.h
 	virtual blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ) = 0;
@@ -37,10 +37,8 @@
 	// Length of buffer, in milliseconds
 	int length() const;
 	
-	// See Blip_Buffer.h. For optimal operation, pass false for 'added_stereo'
-	// if nothing was added to the left and right buffers of any channel for
-	// this time frame.
-	virtual void end_frame( blip_time_t, bool added_stereo = true ) = 0;
+	// See Blip_Buffer.h
+	virtual void end_frame( blip_time_t ) = 0;
 	
 	// Number of samples per output frame (1 = mono, 2 = stereo)
 	int samples_per_frame() const;
@@ -53,6 +51,8 @@
 	virtual long read_samples( blip_sample_t*, long ) = 0;
 	virtual long samples_avail() const = 0;
 	
+public:
+	BLARGG_DISABLE_NOTHROW
 protected:
 	void channels_changed() { channels_changed_count_++; }
 private:
@@ -69,55 +69,56 @@
 // Uses a single buffer and outputs mono samples.
 class Mono_Buffer : public Multi_Buffer {
 	Blip_Buffer buf;
+	channel_t chan;
 public:
-	Mono_Buffer();
-	~Mono_Buffer();
-	
 	// Buffer used for all channels
 	Blip_Buffer* center() { return &buf; }
 	
-	// See Multi_Buffer
+public:
+	Mono_Buffer();
+	~Mono_Buffer();
 	blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
-	void clock_rate( long );
-	void bass_freq( int );
-	void clear();
-	channel_t channel( int );
-	void end_frame( blip_time_t, bool unused = true );
-	long samples_avail() const;
-	long read_samples( blip_sample_t*, long );
+	void clock_rate( long rate ) { buf.clock_rate( rate ); }
+	void bass_freq( int freq ) { buf.bass_freq( freq ); }
+	void clear() { buf.clear(); }
+	long samples_avail() const { return buf.samples_avail(); }
+	long read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
+	channel_t channel( int, int ) { return chan; }
+	void end_frame( blip_time_t t ) { buf.end_frame( t ); }
 };
 
 // Uses three buffers (one for center) and outputs stereo sample pairs.
 class Stereo_Buffer : public Multi_Buffer {
 public:
-	Stereo_Buffer();
-	~Stereo_Buffer();
 	
 	// Buffers used for all channels
 	Blip_Buffer* center()       { return &bufs [0]; }
 	Blip_Buffer* left()         { return &bufs [1]; }
 	Blip_Buffer* right()        { return &bufs [2]; }
 	
-	// See Multi_Buffer
+public:
+	Stereo_Buffer();
+	~Stereo_Buffer();
 	blargg_err_t set_sample_rate( long, int msec = blip_default_length );
 	void clock_rate( long );
 	void bass_freq( int );
 	void clear();
-	channel_t channel( int index );
-	void end_frame( blip_time_t, bool added_stereo = true );
+	channel_t channel( int, int ) { return chan; }
+	void end_frame( blip_time_t );
 	
-	long samples_avail() const;
+	long samples_avail() const { return bufs [0].samples_avail() * 2; }
 	long read_samples( blip_sample_t*, long );
 	
 private:
 	enum { buf_count = 3 };
 	Blip_Buffer bufs [buf_count];
 	channel_t chan;
-	bool stereo_added;
-	bool was_stereo;
+	int stereo_added;
+	int was_stereo;
 	
-	void mix_stereo( blip_sample_t*, long );
-	void mix_mono( blip_sample_t*, long );
+	void mix_stereo_no_center( blip_sample_t*, blargg_long );
+	void mix_stereo( blip_sample_t*, blargg_long );
+	void mix_mono( blip_sample_t*, blargg_long );
 };
 
 // Silent_Buffer generates no samples, useful where no sound is wanted
@@ -125,51 +126,31 @@
 	channel_t chan;
 public:
 	Silent_Buffer();
-	
-	blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
+	blargg_err_t set_sample_rate( long rate, int msec = blip_default_length )
+	{
+		return Multi_Buffer::set_sample_rate( rate, msec );
+	}
 	void clock_rate( long ) { }
 	void bass_freq( int ) { }
 	void clear() { }
-	channel_t channel( int ) { return chan; }
-	void end_frame( blip_time_t, bool unused = true ) { }
+	channel_t channel( int, int ) { return chan; }
+	void end_frame( blip_time_t ) { }
 	long samples_avail() const { return 0; }
 	long read_samples( blip_sample_t*, long ) { return 0; }
 };
 
 
-// End of public interface
-
 inline blargg_err_t Multi_Buffer::set_sample_rate( long rate, int msec )
 {
 	sample_rate_ = rate;
 	length_ = msec;
-	return blargg_success;
-}
-
-inline blargg_err_t Silent_Buffer::set_sample_rate( long rate, int msec )
-{
-	return Multi_Buffer::set_sample_rate( rate, msec );
+	return 0;
 }
 
 inline int Multi_Buffer::samples_per_frame() const { return samples_per_frame_; }
 
-inline long Stereo_Buffer::samples_avail() const { return bufs [0].samples_avail() * 2; }
-
-inline Stereo_Buffer::channel_t Stereo_Buffer::channel( int ) { return chan; }
-
 inline long Multi_Buffer::sample_rate() const { return sample_rate_; }
 
 inline int Multi_Buffer::length() const { return length_; }
 
-inline void Mono_Buffer::clock_rate( long rate ) { buf.clock_rate( rate ); }
-
-inline void Mono_Buffer::clear() { buf.clear(); }
-
-inline void Mono_Buffer::bass_freq( int freq ) { buf.bass_freq( freq ); }
-
-inline long Mono_Buffer::read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
-
-inline long Mono_Buffer::samples_avail() const { return buf.samples_avail(); }
-
 #endif
-