fix: use iter_samples() to access per-channel output buffers

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-01 00:22:51 +00:00
parent 69bdd01cf2
commit 2918cbd8d1

View File

@@ -103,12 +103,29 @@ impl Plugin for ClipLauncher {
// Process audio // Process audio
let num_channels = buffer.channels() as usize; let num_channels = buffer.channels() as usize;
let input = buffer.as_slice(); let num_frames = buffer.samples() as usize;
let output = buffer.as_mut_slice(); let input_slices = buffer.as_slice(); // &[&[f32]]
let num_frames = input.len() / num_channels;
// Process this block // Build interleaved input buffer
self.engine.process_audio(input, output, num_frames); 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 // Send pending MIDI output events
for event in self.pending_midi.drain(..) { for event in self.pending_midi.drain(..) {