Skip to content

Commit 7d45b1c

Browse files
committed
Simplify ConvolverNode message passing
1 parent 6e0c3ed commit 7d45b1c

File tree

1 file changed

+13
-28
lines changed

1 file changed

+13
-28
lines changed

src/node/convolver.rs

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,7 @@ impl ConvolverNode {
157157
} = options;
158158

159159
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 };
164161

165162
let node = Self {
166163
registration,
@@ -221,7 +218,7 @@ impl ConvolverNode {
221218
let padded_buffer = AudioBuffer::from(samples, sample_rate);
222219
let convolve = ConvolverRendererInner::new(padded_buffer);
223220

224-
self.registration.post_message(convolve);
221+
self.registration.post_message(Some(convolve));
225222

226223
*self.buffer.lock().unwrap() = Some(buffer);
227224
}
@@ -345,17 +342,6 @@ impl ConvolverRendererInner {
345342
}
346343
}
347344

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-
359345
fn process(&mut self, input: &[f32], output: &mut [f32]) {
360346
self.fft2.real()[..RENDER_QUANTUM_SIZE].copy_from_slice(input);
361347
self.fft2.real()[RENDER_QUANTUM_SIZE..].fill(0.);
@@ -412,8 +398,7 @@ impl ConvolverRendererInner {
412398
}
413399

414400
struct ConvolverRenderer {
415-
convolver: ConvolverRendererInner,
416-
convolver_set: bool,
401+
inner: Option<ConvolverRendererInner>,
417402
}
418403

419404
impl AudioProcessor for ConvolverRenderer {
@@ -429,13 +414,14 @@ impl AudioProcessor for ConvolverRenderer {
429414
let output = &mut outputs[0];
430415
output.force_mono();
431416

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+
};
439425

440426
// handle tail time
441427
if input.is_silent() {
@@ -453,10 +439,9 @@ impl AudioProcessor for ConvolverRenderer {
453439
}
454440

455441
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>>() {
457443
// 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);
460445
return;
461446
}
462447

0 commit comments

Comments
 (0)