@@ -157,10 +157,7 @@ impl ConvolverNode {
157
157
} = options;
158
158
159
159
let node = context. base ( ) . register ( move |registration| {
160
- let renderer = ConvolverRenderer {
161
- convolver : ConvolverRendererInner :: tombstone ( ) ,
162
- convolver_set : false ,
163
- } ;
160
+ let renderer = ConvolverRenderer { inner : None } ;
164
161
165
162
let node = Self {
166
163
registration,
@@ -221,7 +218,7 @@ impl ConvolverNode {
221
218
let padded_buffer = AudioBuffer :: from ( samples, sample_rate) ;
222
219
let convolve = ConvolverRendererInner :: new ( padded_buffer) ;
223
220
224
- self . registration . post_message ( convolve) ;
221
+ self . registration . post_message ( Some ( convolve) ) ;
225
222
226
223
* self . buffer . lock ( ) . unwrap ( ) = Some ( buffer) ;
227
224
}
@@ -345,17 +342,6 @@ impl ConvolverRendererInner {
345
342
}
346
343
}
347
344
348
- // dummy convolver used to init renderer
349
- fn tombstone ( ) -> Self {
350
- Self {
351
- num_ir_blocks : Default :: default ( ) ,
352
- h : Default :: default ( ) ,
353
- fdl : Default :: default ( ) ,
354
- out : Default :: default ( ) ,
355
- fft2 : Fft :: new ( 0 ) ,
356
- }
357
- }
358
-
359
345
fn process ( & mut self , input : & [ f32 ] , output : & mut [ f32 ] ) {
360
346
self . fft2 . real ( ) [ ..RENDER_QUANTUM_SIZE ] . copy_from_slice ( input) ;
361
347
self . fft2 . real ( ) [ RENDER_QUANTUM_SIZE ..] . fill ( 0. ) ;
@@ -412,8 +398,7 @@ impl ConvolverRendererInner {
412
398
}
413
399
414
400
struct ConvolverRenderer {
415
- convolver : ConvolverRendererInner ,
416
- convolver_set : bool ,
401
+ inner : Option < ConvolverRendererInner > ,
417
402
}
418
403
419
404
impl AudioProcessor for ConvolverRenderer {
@@ -429,13 +414,14 @@ impl AudioProcessor for ConvolverRenderer {
429
414
let output = & mut outputs[ 0 ] ;
430
415
output. force_mono ( ) ;
431
416
432
- // no convolution buffer set, passthrough
433
- if !self . convolver_set {
434
- * output = input. clone ( ) ;
435
- return !input. is_silent ( ) ;
436
- }
437
-
438
- let convolver = & mut self . convolver ;
417
+ let convolver = match & mut self . inner {
418
+ None => {
419
+ // no convolution buffer set, passthrough
420
+ * output = input. clone ( ) ;
421
+ return !input. is_silent ( ) ;
422
+ }
423
+ Some ( convolver) => convolver,
424
+ } ;
439
425
440
426
// handle tail time
441
427
if input. is_silent ( ) {
@@ -453,10 +439,9 @@ impl AudioProcessor for ConvolverRenderer {
453
439
}
454
440
455
441
fn onmessage ( & mut self , msg : & mut dyn Any ) {
456
- if let Some ( convolver) = msg. downcast_mut :: < ConvolverRendererInner > ( ) {
442
+ if let Some ( convolver) = msg. downcast_mut :: < Option < ConvolverRendererInner > > ( ) {
457
443
// Avoid deallocation in the render thread by swapping the convolver.
458
- std:: mem:: swap ( & mut self . convolver , convolver) ;
459
- self . convolver_set = true ;
444
+ std:: mem:: swap ( & mut self . inner , convolver) ;
460
445
return ;
461
446
}
462
447
0 commit comments