use clack_common::events::event_types::TransportEvent;
use clack_common::events::io::{InputEvents, OutputEvents};
use clap_sys::audio_buffer::clap_audio_buffer;
use clap_sys::process::clap_process;
use std::ops::RangeBounds;
pub use clack_common::process::*;
pub mod audio;
use crate::internal_utils::{slice_from_external_parts, slice_from_external_parts_mut};
use audio::*;
#[derive(Copy, Clone)]
pub struct Process<'a> {
pub transport: Option<&'a TransportEvent>,
pub steady_time: Option<u64>,
}
impl<'a> Process<'a> {
#[inline]
pub(crate) unsafe fn from_raw(raw: *const clap_process) -> Process<'a> {
let transport = (*raw).transport;
let steady_time = (*raw).steady_time;
Self {
steady_time: steady_time.try_into().ok(),
transport: if transport.is_null() {
None
} else {
Some(TransportEvent::from_raw_ref(&*transport))
},
}
}
}
pub struct Events<'a> {
pub input: &'a InputEvents<'a>,
pub output: &'a mut OutputEvents<'a>,
}
impl Events<'_> {
pub(crate) unsafe fn from_raw(process: &clap_process) -> Self {
Self {
input: InputEvents::from_raw(&*process.in_events),
output: OutputEvents::from_raw_mut(&mut *(process.out_events as *mut _)),
}
}
}
pub struct Audio<'a> {
inputs: &'a [clap_audio_buffer],
outputs: &'a mut [clap_audio_buffer],
frames_count: u32,
}
impl<'a> Audio<'a> {
#[inline]
pub unsafe fn from_raw(raw_process: &clap_process) -> Audio<'_> {
Audio {
frames_count: raw_process.frames_count,
inputs: slice_from_external_parts(
raw_process.audio_inputs,
raw_process.audio_inputs_count as usize,
),
outputs: slice_from_external_parts_mut(
raw_process.audio_outputs,
raw_process.audio_outputs_count as usize,
),
}
}
#[inline]
pub unsafe fn from_raw_buffers(
inputs: &'a [clap_audio_buffer],
outputs: &'a mut [clap_audio_buffer],
frames_count: u32,
) -> Self {
Self {
inputs,
outputs,
frames_count,
}
}
#[inline]
pub fn raw_buffers(&mut self) -> (&'a [clap_audio_buffer], &mut [clap_audio_buffer]) {
(self.inputs, self.outputs)
}
#[inline]
pub fn to_raw_buffers(self) -> (&'a [clap_audio_buffer], &'a mut [clap_audio_buffer]) {
(self.inputs, self.outputs)
}
#[inline]
pub fn raw_input_buffers(&self) -> &'a [clap_audio_buffer] {
self.inputs
}
#[inline]
pub fn raw_output_buffers(&mut self) -> &mut [clap_audio_buffer] {
self.outputs
}
#[inline]
pub fn to_raw_output_buffers(self) -> &'a mut [clap_audio_buffer] {
self.outputs
}
#[inline]
pub fn input_port(&self, index: usize) -> Option<InputPort<'_>> {
self.inputs
.get(index)
.map(|buf| unsafe { InputPort::from_raw(buf, self.frames_count) })
}
#[inline]
pub fn input_port_info(&self, index: usize) -> Option<AudioPortProcessingInfo> {
self.inputs
.get(index)
.map(AudioPortProcessingInfo::from_raw)
}
#[inline]
pub fn input_port_count(&self) -> usize {
self.inputs.len()
}
#[inline]
pub fn input_ports(&self) -> InputPortsIter<'_> {
InputPortsIter::new(self)
}
#[inline]
pub fn input_ports_infos(&self) -> impl ExactSizeIterator<Item = AudioPortProcessingInfo> + '_ {
self.inputs.iter().map(AudioPortProcessingInfo::from_raw)
}
#[inline]
pub fn output_port(&mut self, index: usize) -> Option<OutputPort<'_>> {
self.outputs
.get_mut(index)
.map(|buf| unsafe { OutputPort::from_raw(buf, self.frames_count) })
}
#[inline]
pub fn output_port_info(&self, index: usize) -> Option<AudioPortProcessingInfo> {
self.outputs
.get(index)
.map(AudioPortProcessingInfo::from_raw)
}
#[inline]
pub fn output_port_count(&self) -> usize {
self.outputs.len()
}
#[inline]
pub fn output_ports(&mut self) -> OutputPortsIter<'_> {
OutputPortsIter::new(self)
}
#[inline]
pub fn output_ports_infos(
&self,
) -> impl ExactSizeIterator<Item = AudioPortProcessingInfo> + '_ {
self.outputs.iter().map(AudioPortProcessingInfo::from_raw)
}
#[inline]
pub fn port_pair(&mut self, index: usize) -> Option<PortPair<'_>> {
unsafe {
PortPair::from_raw(
self.inputs.get(index),
self.outputs.get_mut(index),
self.frames_count,
)
}
}
#[inline]
pub fn port_pair_count(&self) -> usize {
self.input_port_count().max(self.output_port_count())
}
#[inline]
pub fn port_pairs(&mut self) -> PortPairsIter<'_> {
PortPairsIter::new(self)
}
#[inline]
pub fn port_sub_range<R: RangeBounds<usize> + Clone>(&mut self, range: R) -> Audio<'_> {
let inputs = self
.inputs
.get((range.start_bound().cloned(), range.end_bound().cloned()))
.unwrap_or(&[]);
let outputs = self
.outputs
.get_mut((range.start_bound().cloned(), range.end_bound().cloned()))
.unwrap_or(&mut []);
Audio {
inputs,
outputs,
frames_count: self.frames_count,
}
}
#[inline]
pub fn frames_count(&self) -> u32 {
self.frames_count
}
}
impl<'buf: 'a, 'a> IntoIterator for &'a mut Audio<'buf> {
type Item = PortPair<'a>;
type IntoIter = PortPairsIter<'a>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.port_pairs()
}
}