@@ -149,3 +149,78 @@ impl AudioProcessor for ChannelMergerRenderer {
149
149
false
150
150
}
151
151
}
152
+
153
+ #[ cfg( test) ]
154
+ mod tests {
155
+ use crate :: context:: { BaseAudioContext , OfflineAudioContext } ;
156
+ use crate :: node:: { AudioNode , AudioScheduledSourceNode } ;
157
+
158
+ use float_eq:: assert_float_eq;
159
+
160
+ #[ test]
161
+ fn test_merge ( ) {
162
+ let sample_rate = 48000. ;
163
+ let mut context = OfflineAudioContext :: new ( 2 , 128 , sample_rate) ;
164
+
165
+ let merger = context. create_channel_merger ( 2 ) ;
166
+ merger. connect ( & context. destination ( ) ) ;
167
+
168
+ let mut src1 = context. create_constant_source ( ) ;
169
+ src1. offset ( ) . set_value ( 2. ) ;
170
+ src1. connect_at ( & merger, 0 , 0 ) ;
171
+ src1. start ( ) ;
172
+
173
+ let mut src2 = context. create_constant_source ( ) ;
174
+ src2. offset ( ) . set_value ( 3. ) ;
175
+ src2. connect_at ( & merger, 0 , 1 ) ;
176
+ src2. start ( ) ;
177
+
178
+ let buffer = context. start_rendering_sync ( ) ;
179
+
180
+ let left = buffer. get_channel_data ( 0 ) ;
181
+ assert_float_eq ! ( & left[ ..] , & [ 2. ; 128 ] [ ..] , abs_all <= 0. ) ;
182
+
183
+ let right = buffer. get_channel_data ( 1 ) ;
184
+ assert_float_eq ! ( & right[ ..] , & [ 3. ; 128 ] [ ..] , abs_all <= 0. ) ;
185
+ }
186
+
187
+ #[ test]
188
+ fn test_merge_disconnect ( ) {
189
+ let sample_rate = 48000. ;
190
+ let length = 4 * 128 ;
191
+ let disconnect_at = length as f64 / sample_rate as f64 / 2. ;
192
+ let mut context = OfflineAudioContext :: new ( 2 , length, sample_rate) ;
193
+
194
+ let merger = context. create_channel_merger ( 2 ) ;
195
+ merger. connect ( & context. destination ( ) ) ;
196
+
197
+ let mut src1 = context. create_constant_source ( ) ;
198
+ src1. offset ( ) . set_value ( 2. ) ;
199
+ src1. connect_at ( & merger, 0 , 0 ) ;
200
+ src1. start ( ) ;
201
+
202
+ let mut src2 = context. create_constant_source ( ) ;
203
+ src2. offset ( ) . set_value ( 3. ) ;
204
+ src2. connect_at ( & merger, 0 , 1 ) ;
205
+ src2. start ( ) ;
206
+
207
+ context. suspend_sync ( disconnect_at, move |_| src2. disconnect ( ) ) ;
208
+
209
+ let buffer = context. start_rendering_sync ( ) ;
210
+
211
+ let left = buffer. get_channel_data ( 0 ) ;
212
+ assert_float_eq ! ( & left[ ..] , & vec![ 2. ; length] [ ..] , abs_all <= 0. ) ;
213
+
214
+ let right = buffer. get_channel_data ( 1 ) ;
215
+ assert_float_eq ! (
216
+ & right[ 0 ..length / 2 ] ,
217
+ & vec![ 3. ; length / 2 ] [ ..] ,
218
+ abs_all <= 0.
219
+ ) ;
220
+ assert_float_eq ! (
221
+ & right[ length / 2 ..] ,
222
+ & vec![ 0. ; length / 2 ] [ ..] ,
223
+ abs_all <= 0.
224
+ ) ;
225
+ }
226
+ }
0 commit comments