comparison 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
comparison
equal deleted inserted replaced
315:2294f3a6f136 316:fb513e10174e
1
2 // Multi-channel sound buffer interface, and basic mono and stereo buffers 1 // Multi-channel sound buffer interface, and basic mono and stereo buffers
3 2
4 // Blip_Buffer 0.4.0 3 // Blip_Buffer 0.4.1
5
6 #ifndef MULTI_BUFFER_H 4 #ifndef MULTI_BUFFER_H
7 #define MULTI_BUFFER_H 5 #define MULTI_BUFFER_H
8 6
9 #include "blargg_common.h" 7 #include "blargg_common.h"
10 #include "Blip_Buffer.h" 8 #include "Blip_Buffer.h"
23 struct channel_t { 21 struct channel_t {
24 Blip_Buffer* center; 22 Blip_Buffer* center;
25 Blip_Buffer* left; 23 Blip_Buffer* left;
26 Blip_Buffer* right; 24 Blip_Buffer* right;
27 }; 25 };
28 virtual channel_t channel( int index ) = 0; 26 enum { type_index_mask = 0xFF };
27 enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
28 virtual channel_t channel( int index, int type ) = 0;
29 29
30 // See Blip_Buffer.h 30 // See Blip_Buffer.h
31 virtual blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ) = 0; 31 virtual blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ) = 0;
32 virtual void clock_rate( long ) = 0; 32 virtual void clock_rate( long ) = 0;
33 virtual void bass_freq( int ) = 0; 33 virtual void bass_freq( int ) = 0;
35 long sample_rate() const; 35 long sample_rate() const;
36 36
37 // Length of buffer, in milliseconds 37 // Length of buffer, in milliseconds
38 int length() const; 38 int length() const;
39 39
40 // See Blip_Buffer.h. For optimal operation, pass false for 'added_stereo' 40 // See Blip_Buffer.h
41 // if nothing was added to the left and right buffers of any channel for 41 virtual void end_frame( blip_time_t ) = 0;
42 // this time frame.
43 virtual void end_frame( blip_time_t, bool added_stereo = true ) = 0;
44 42
45 // Number of samples per output frame (1 = mono, 2 = stereo) 43 // Number of samples per output frame (1 = mono, 2 = stereo)
46 int samples_per_frame() const; 44 int samples_per_frame() const;
47 45
48 // Count of changes to channel configuration. Incremented whenever 46 // Count of changes to channel configuration. Incremented whenever
51 49
52 // See Blip_Buffer.h 50 // See Blip_Buffer.h
53 virtual long read_samples( blip_sample_t*, long ) = 0; 51 virtual long read_samples( blip_sample_t*, long ) = 0;
54 virtual long samples_avail() const = 0; 52 virtual long samples_avail() const = 0;
55 53
54 public:
55 BLARGG_DISABLE_NOTHROW
56 protected: 56 protected:
57 void channels_changed() { channels_changed_count_++; } 57 void channels_changed() { channels_changed_count_++; }
58 private: 58 private:
59 // noncopyable 59 // noncopyable
60 Multi_Buffer( const Multi_Buffer& ); 60 Multi_Buffer( const Multi_Buffer& );
67 }; 67 };
68 68
69 // Uses a single buffer and outputs mono samples. 69 // Uses a single buffer and outputs mono samples.
70 class Mono_Buffer : public Multi_Buffer { 70 class Mono_Buffer : public Multi_Buffer {
71 Blip_Buffer buf; 71 Blip_Buffer buf;
72 channel_t chan;
73 public:
74 // Buffer used for all channels
75 Blip_Buffer* center() { return &buf; }
76
72 public: 77 public:
73 Mono_Buffer(); 78 Mono_Buffer();
74 ~Mono_Buffer(); 79 ~Mono_Buffer();
75
76 // Buffer used for all channels
77 Blip_Buffer* center() { return &buf; }
78
79 // See Multi_Buffer
80 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ); 80 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
81 void clock_rate( long ); 81 void clock_rate( long rate ) { buf.clock_rate( rate ); }
82 void bass_freq( int ); 82 void bass_freq( int freq ) { buf.bass_freq( freq ); }
83 void clear(); 83 void clear() { buf.clear(); }
84 channel_t channel( int ); 84 long samples_avail() const { return buf.samples_avail(); }
85 void end_frame( blip_time_t, bool unused = true ); 85 long read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
86 long samples_avail() const; 86 channel_t channel( int, int ) { return chan; }
87 long read_samples( blip_sample_t*, long ); 87 void end_frame( blip_time_t t ) { buf.end_frame( t ); }
88 }; 88 };
89 89
90 // Uses three buffers (one for center) and outputs stereo sample pairs. 90 // Uses three buffers (one for center) and outputs stereo sample pairs.
91 class Stereo_Buffer : public Multi_Buffer { 91 class Stereo_Buffer : public Multi_Buffer {
92 public: 92 public:
93 Stereo_Buffer();
94 ~Stereo_Buffer();
95 93
96 // Buffers used for all channels 94 // Buffers used for all channels
97 Blip_Buffer* center() { return &bufs [0]; } 95 Blip_Buffer* center() { return &bufs [0]; }
98 Blip_Buffer* left() { return &bufs [1]; } 96 Blip_Buffer* left() { return &bufs [1]; }
99 Blip_Buffer* right() { return &bufs [2]; } 97 Blip_Buffer* right() { return &bufs [2]; }
100 98
101 // See Multi_Buffer 99 public:
100 Stereo_Buffer();
101 ~Stereo_Buffer();
102 blargg_err_t set_sample_rate( long, int msec = blip_default_length ); 102 blargg_err_t set_sample_rate( long, int msec = blip_default_length );
103 void clock_rate( long ); 103 void clock_rate( long );
104 void bass_freq( int ); 104 void bass_freq( int );
105 void clear(); 105 void clear();
106 channel_t channel( int index ); 106 channel_t channel( int, int ) { return chan; }
107 void end_frame( blip_time_t, bool added_stereo = true ); 107 void end_frame( blip_time_t );
108 108
109 long samples_avail() const; 109 long samples_avail() const { return bufs [0].samples_avail() * 2; }
110 long read_samples( blip_sample_t*, long ); 110 long read_samples( blip_sample_t*, long );
111 111
112 private: 112 private:
113 enum { buf_count = 3 }; 113 enum { buf_count = 3 };
114 Blip_Buffer bufs [buf_count]; 114 Blip_Buffer bufs [buf_count];
115 channel_t chan; 115 channel_t chan;
116 bool stereo_added; 116 int stereo_added;
117 bool was_stereo; 117 int was_stereo;
118 118
119 void mix_stereo( blip_sample_t*, long ); 119 void mix_stereo_no_center( blip_sample_t*, blargg_long );
120 void mix_mono( blip_sample_t*, long ); 120 void mix_stereo( blip_sample_t*, blargg_long );
121 void mix_mono( blip_sample_t*, blargg_long );
121 }; 122 };
122 123
123 // Silent_Buffer generates no samples, useful where no sound is wanted 124 // Silent_Buffer generates no samples, useful where no sound is wanted
124 class Silent_Buffer : public Multi_Buffer { 125 class Silent_Buffer : public Multi_Buffer {
125 channel_t chan; 126 channel_t chan;
126 public: 127 public:
127 Silent_Buffer(); 128 Silent_Buffer();
128 129 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length )
129 blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ); 130 {
131 return Multi_Buffer::set_sample_rate( rate, msec );
132 }
130 void clock_rate( long ) { } 133 void clock_rate( long ) { }
131 void bass_freq( int ) { } 134 void bass_freq( int ) { }
132 void clear() { } 135 void clear() { }
133 channel_t channel( int ) { return chan; } 136 channel_t channel( int, int ) { return chan; }
134 void end_frame( blip_time_t, bool unused = true ) { } 137 void end_frame( blip_time_t ) { }
135 long samples_avail() const { return 0; } 138 long samples_avail() const { return 0; }
136 long read_samples( blip_sample_t*, long ) { return 0; } 139 long read_samples( blip_sample_t*, long ) { return 0; }
137 }; 140 };
138 141
139 142
140 // End of public interface
141
142 inline blargg_err_t Multi_Buffer::set_sample_rate( long rate, int msec ) 143 inline blargg_err_t Multi_Buffer::set_sample_rate( long rate, int msec )
143 { 144 {
144 sample_rate_ = rate; 145 sample_rate_ = rate;
145 length_ = msec; 146 length_ = msec;
146 return blargg_success; 147 return 0;
147 }
148
149 inline blargg_err_t Silent_Buffer::set_sample_rate( long rate, int msec )
150 {
151 return Multi_Buffer::set_sample_rate( rate, msec );
152 } 148 }
153 149
154 inline int Multi_Buffer::samples_per_frame() const { return samples_per_frame_; } 150 inline int Multi_Buffer::samples_per_frame() const { return samples_per_frame_; }
155
156 inline long Stereo_Buffer::samples_avail() const { return bufs [0].samples_avail() * 2; }
157
158 inline Stereo_Buffer::channel_t Stereo_Buffer::channel( int ) { return chan; }
159 151
160 inline long Multi_Buffer::sample_rate() const { return sample_rate_; } 152 inline long Multi_Buffer::sample_rate() const { return sample_rate_; }
161 153
162 inline int Multi_Buffer::length() const { return length_; } 154 inline int Multi_Buffer::length() const { return length_; }
163 155
164 inline void Mono_Buffer::clock_rate( long rate ) { buf.clock_rate( rate ); }
165
166 inline void Mono_Buffer::clear() { buf.clear(); }
167
168 inline void Mono_Buffer::bass_freq( int freq ) { buf.bass_freq( freq ); }
169
170 inline long Mono_Buffer::read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
171
172 inline long Mono_Buffer::samples_avail() const { return buf.samples_avail(); }
173
174 #endif 156 #endif
175