@@ -69,10 +69,9 @@ fn assert_valid_channel_count_mode(mode: ChannelCountMode) {
69
69
/// - `gain_left = (x * PI / 2.).cos()`
70
70
/// - `gain_right = (x * PI / 2.).sin()`
71
71
#[ inline( always) ]
72
- fn get_stereo_gains ( x : f32 ) -> [ f32 ; 2 ] {
72
+ fn get_stereo_gains ( sine_table : & [ f32 ] , x : f32 ) -> [ f32 ; 2 ] {
73
73
let idx = ( x * TABLE_LENGTH_BY_4_F32 ) as usize ;
74
74
75
- let sine_table = sine_table ( ) ;
76
75
let gain_left = sine_table[ idx + TABLE_LENGTH_BY_4_USIZE ] ;
77
76
let gain_right = sine_table[ idx] ;
78
77
@@ -185,7 +184,7 @@ impl StereoPannerNode {
185
184
186
185
pan_param. set_value ( options. pan ) ;
187
186
188
- let renderer = StereoPannerRenderer { pan : pan_proc } ;
187
+ let renderer = StereoPannerRenderer :: new ( pan_proc) ;
189
188
190
189
let node = Self {
191
190
registration,
@@ -209,6 +208,16 @@ struct StereoPannerRenderer {
209
208
/// Position of the input in the output’s stereo image.
210
209
/// -1 represents full left, +1 represents full right.
211
210
pan : AudioParamId ,
211
+ sine_table : & ' static [ f32 ] ,
212
+ }
213
+
214
+ impl StereoPannerRenderer {
215
+ fn new ( pan : AudioParamId ) -> Self {
216
+ Self {
217
+ pan,
218
+ sine_table : sine_table ( ) ,
219
+ }
220
+ }
212
221
}
213
222
214
223
impl AudioProcessor for StereoPannerRenderer {
@@ -241,7 +250,7 @@ impl AudioProcessor for StereoPannerRenderer {
241
250
if pan_values. len ( ) == 1 {
242
251
let pan = pan_values[ 0 ] ;
243
252
let x = ( pan + 1. ) * 0.5 ;
244
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
253
+ let [ gain_left, gain_right] = get_stereo_gains ( self . sine_table , x) ;
245
254
246
255
left. iter_mut ( )
247
256
. zip ( right. iter_mut ( ) )
@@ -257,7 +266,7 @@ impl AudioProcessor for StereoPannerRenderer {
257
266
. zip ( input. channel_data ( 0 ) . iter ( ) )
258
267
. for_each ( |( ( ( l, r) , pan) , input) | {
259
268
let x = ( pan + 1. ) * 0.5 ;
260
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
269
+ let [ gain_left, gain_right] = get_stereo_gains ( self . sine_table , x) ;
261
270
262
271
* l = input * gain_left;
263
272
* r = input * gain_right;
@@ -268,7 +277,7 @@ impl AudioProcessor for StereoPannerRenderer {
268
277
if pan_values. len ( ) == 1 {
269
278
let pan = pan_values[ 0 ] ;
270
279
let x = if pan <= 0. { pan + 1. } else { pan } ;
271
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
280
+ let [ gain_left, gain_right] = get_stereo_gains ( self . sine_table , x) ;
272
281
273
282
left. iter_mut ( )
274
283
. zip ( right. iter_mut ( ) )
@@ -292,13 +301,13 @@ impl AudioProcessor for StereoPannerRenderer {
292
301
. for_each ( |( ( ( ( l, r) , & pan) , & input_left) , & input_right) | {
293
302
if pan <= 0. {
294
303
let x = pan + 1. ;
295
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
304
+ let [ gain_left, gain_right] = get_stereo_gains ( self . sine_table , x) ;
296
305
297
306
* l = input_right. mul_add ( gain_left, input_left) ;
298
307
* r = input_right * gain_right;
299
308
} else {
300
309
let x = pan;
301
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
310
+ let [ gain_left, gain_right] = get_stereo_gains ( self . sine_table , x) ;
302
311
303
312
* l = input_left * gain_left;
304
313
* r = input_left. mul_add ( gain_right, input_right) ;
@@ -347,11 +356,13 @@ mod tests {
347
356
348
357
#[ test]
349
358
fn test_get_stereo_gains ( ) {
359
+ let sine_table = sine_table ( ) ;
360
+
350
361
// check correctness of wavetable lookup
351
362
for i in 0 ..1001 {
352
363
let x = i as f32 / 1000. ;
353
364
354
- let [ gain_left, gain_right] = get_stereo_gains ( x) ;
365
+ let [ gain_left, gain_right] = get_stereo_gains ( sine_table , x) ;
355
366
356
367
assert_float_eq ! (
357
368
gain_left,
0 commit comments