Provide dummy aux IO buffers with CPAL backend
This commit is contained in:
parent
3a6efe49ec
commit
5d9affad17
1 changed files with 69 additions and 5 deletions
|
@ -360,6 +360,50 @@ impl Cpal {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We'll do the same thing for auxiliary inputs and outputs, so the plugin always gets the
|
||||||
|
// buffers it expects
|
||||||
|
let mut aux_input_storage: Vec<Vec<Vec<f32>>> = Vec::new();
|
||||||
|
let mut aux_input_buffers: Vec<Buffer> = Vec::new();
|
||||||
|
for channel_count in self.audio_io_layout.aux_input_ports {
|
||||||
|
aux_input_storage.push(vec![
|
||||||
|
vec![0.0f32; self.config.period_size as usize];
|
||||||
|
channel_count.get() as usize
|
||||||
|
]);
|
||||||
|
|
||||||
|
let aux_storage = aux_input_storage.last_mut().unwrap();
|
||||||
|
let mut aux_buffer = Buffer::default();
|
||||||
|
unsafe {
|
||||||
|
aux_buffer.set_slices(self.config.period_size as usize, |output_slices| {
|
||||||
|
// SAFETY: `aux_storage` is no longer used directly after this
|
||||||
|
*output_slices = aux_storage
|
||||||
|
.iter_mut()
|
||||||
|
.map(|channel| &mut *(channel.as_mut_slice() as *mut [f32]))
|
||||||
|
.collect();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut aux_output_storage: Vec<Vec<Vec<f32>>> = Vec::new();
|
||||||
|
let mut aux_output_buffers: Vec<Buffer> = Vec::new();
|
||||||
|
for channel_count in self.audio_io_layout.aux_output_ports {
|
||||||
|
aux_output_storage.push(vec![
|
||||||
|
vec![0.0f32; self.config.period_size as usize];
|
||||||
|
channel_count.get() as usize
|
||||||
|
]);
|
||||||
|
|
||||||
|
let aux_storage = aux_output_storage.last_mut().unwrap();
|
||||||
|
let mut aux_buffer = Buffer::default();
|
||||||
|
unsafe {
|
||||||
|
aux_buffer.set_slices(self.config.period_size as usize, |output_slices| {
|
||||||
|
// SAFETY: `aux_storage` is no longer used directly after this
|
||||||
|
*output_slices = aux_storage
|
||||||
|
.iter_mut()
|
||||||
|
.map(|channel| &mut *(channel.as_mut_slice() as *mut [f32]))
|
||||||
|
.collect();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: MIDI input and output
|
// TODO: MIDI input and output
|
||||||
let midi_input_events = Vec::with_capacity(1024);
|
let midi_input_events = Vec::with_capacity(1024);
|
||||||
let mut midi_output_events = Vec::with_capacity(1024);
|
let mut midi_output_events = Vec::with_capacity(1024);
|
||||||
|
@ -412,14 +456,34 @@ impl Cpal {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The CPAL backends don't support auxiliary IO, so we'll just zero them out. The
|
||||||
|
// buffers are still provided to the wrapped plugin since it should not expect the
|
||||||
|
// wrapper/host to deviate from its audio IO layouts.
|
||||||
|
for aux_buffer in &mut aux_input_buffers {
|
||||||
|
for channel in aux_buffer.as_slice() {
|
||||||
|
channel.fill(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for aux_buffer in &mut aux_output_buffers {
|
||||||
|
for channel in aux_buffer.as_slice() {
|
||||||
|
channel.fill(0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SAFETY: Shortening these borrows is safe as even if the plugin overwrites the
|
||||||
|
// slices (which it cannot do without using unsafe code), then they
|
||||||
|
// would still be reset on the next iteration
|
||||||
|
let mut aux = unsafe {
|
||||||
|
AuxiliaryBuffers {
|
||||||
|
inputs: &mut *(aux_input_buffers.as_mut_slice() as *mut [Buffer]),
|
||||||
|
outputs: &mut *(aux_output_buffers.as_mut_slice() as *mut [Buffer]),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
midi_output_events.clear();
|
midi_output_events.clear();
|
||||||
if !cb(
|
if !cb(
|
||||||
&mut buffer,
|
&mut buffer,
|
||||||
// FIXME: Use zero filled buffers with the correct size instead
|
&mut aux,
|
||||||
&mut AuxiliaryBuffers {
|
|
||||||
inputs: &mut [],
|
|
||||||
outputs: &mut [],
|
|
||||||
},
|
|
||||||
transport,
|
transport,
|
||||||
&midi_input_events,
|
&midi_input_events,
|
||||||
&mut midi_output_events,
|
&mut midi_output_events,
|
||||||
|
|
Loading…
Add table
Reference in a new issue