From 2918cbd8d128daa14a4b2b69f49d984f3a40384b Mon Sep 17 00:00:00 2001 From: Loic Coenen Date: Fri, 1 May 2026 00:22:51 +0000 Subject: [PATCH] fix: use iter_samples() to access per-channel output buffers Co-authored-by: aider (deepseek/deepseek-coder) --- src/lib.rs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 171e631..39a7de5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -103,12 +103,29 @@ impl Plugin for ClipLauncher { // Process audio let num_channels = buffer.channels() as usize; - let input = buffer.as_slice(); - let output = buffer.as_mut_slice(); - let num_frames = input.len() / num_channels; - - // Process this block - self.engine.process_audio(input, output, num_frames); + let num_frames = buffer.samples() as usize; + let input_slices = buffer.as_slice(); // &[&[f32]] + + // Build interleaved input buffer + let mut interleaved_input = vec![0.0; num_frames * num_channels]; + for ch in 0..num_channels { + for frame in 0..num_frames { + interleaved_input[frame * num_channels + ch] = input_slices[ch][frame]; + } + } + + // Build interleaved output buffer (will be filled by engine) + let mut interleaved_output = vec![0.0; num_frames * num_channels]; + + self.engine.process_audio(&interleaved_input, &mut interleaved_output, num_frames); + + // Copy back to buffer's output channels + for (ch, channel_samples) in buffer.iter_samples().enumerate() { + let output = channel_samples.outputs; + for frame in 0..num_frames { + output[frame] = interleaved_output[frame * num_channels + ch]; + } + } // Send pending MIDI output events for event in self.pending_midi.drain(..) {