From 821f4aac2123b45d8f7f3ddd5b83a18670918c43 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 17 Jan 2023 02:44:59 +0100 Subject: [PATCH] Prefer releasing voices in voice stealing --- plugins/buffr_glitch/src/lib.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/plugins/buffr_glitch/src/lib.rs b/plugins/buffr_glitch/src/lib.rs index a3114c79..6c4fdb99 100644 --- a/plugins/buffr_glitch/src/lib.rs +++ b/plugins/buffr_glitch/src/lib.rs @@ -352,15 +352,34 @@ impl BuffrGlitch { } } - let mut quietest_voice_id = 0; - let mut quiested_voice_amplitude = f32::MAX; - for (voice_id, voice) in self.voices.iter().enumerate() { - if voice.amp_envelope.current() < quiested_voice_amplitude { - quietest_voice_id = voice_id; - quiested_voice_amplitude = voice.amp_envelope.current(); - } + // Prefer stealing releasing voices if possible + if let Some((quietest_voice_id, _)) = self + .voices + .iter() + .enumerate() + .filter(|(_, voice)| voice.amp_envelope.is_releasing()) + .min_by(|(_, voice_a), (_, voice_b)| { + f32::total_cmp( + &voice_a.amp_envelope.current(), + &voice_b.amp_envelope.current(), + ) + }) + { + return quietest_voice_id; } + let (quietest_voice_id, _) = self + .voices + .iter() + .enumerate() + .min_by(|(_, voice_a), (_, voice_b)| { + f32::total_cmp( + &voice_a.amp_envelope.current(), + &voice_b.amp_envelope.current(), + ) + }) + .unwrap(); + quietest_voice_id } }