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