Mercurial > audlegacy-plugins
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 -
