From 4204ac4462dd16217557ef48ef928e30798d0d4c Mon Sep 17 00:00:00 2001 From: unspeaker Date: Fri, 5 Jul 2024 21:33:50 +0300 Subject: [PATCH] perf: remove allocation from sampler callback --- src/model/sampler.rs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/model/sampler.rs b/src/model/sampler.rs index d6af341a..47ee028c 100644 --- a/src/model/sampler.rs +++ b/src/model/sampler.rs @@ -68,14 +68,8 @@ impl Sampler { } // Emit next chunk of each currently playing voice, // dropping voices that have reached their ends. - let mut voices = vec![]; - std::mem::swap(&mut voices, &mut self.voices); let gain = 0.5; - loop { - if voices.len() < 1 { - break - } - let mut voice = voices.swap_remove(0); + self.voices.retain_mut(|voice|{ if let Some(chunk) = voice.chunk(scope.n_frames() as usize) { for (i, channel) in chunk.iter().enumerate() { let buffer = &mut mixed[i % channel_count]; @@ -83,9 +77,11 @@ impl Sampler { buffer[i] += sample * gain; } } - self.voices.push(voice); + true + } else { + false } - } + }); // Write output buffer to output ports. for (i, port) in self.ports.audio_outs.values_mut().enumerate() { let buffer = &mixed[i];