1#[derive(Debug, Clone, Copy)]
3pub struct PluginMidiEvent {
4 pub sample_offset: u32,
5 pub status: u8,
6 pub data1: u8,
7 pub data2: u8,
8}
9
10#[derive(Debug, Clone, Copy)]
12pub struct PluginParamEvent {
13 pub sample_offset: u32,
14 pub param_id: u32,
15 pub value: f64,
17}
18
19pub struct PluginAudioBuffer {
21 pub channels: Vec<Vec<f32>>,
22 pub frames: usize,
23}
24
25impl PluginAudioBuffer {
26 pub fn new(channel_count: usize, frames: usize) -> Self {
27 Self {
28 channels: vec![vec![0.0; frames]; channel_count],
29 frames,
30 }
31 }
32
33 pub fn channel(&self, idx: usize) -> &[f32] {
34 &self.channels[idx]
35 }
36
37 pub fn channel_mut(&mut self, idx: usize) -> &mut [f32] {
38 &mut self.channels[idx]
39 }
40
41 pub fn channel_count(&self) -> usize {
42 self.channels.len()
43 }
44
45 pub fn clear(&mut self) {
46 for ch in self.channels.iter_mut() {
47 ch.fill(0.0);
48 }
49 }
50
51 pub unsafe fn as_raw_ptrs(&mut self) -> Vec<*mut f32> {
54 self.channels
55 .iter_mut()
56 .map(|ch| ch.as_mut_ptr())
57 .collect()
58 }
59}
60
61pub struct PluginProcessData<'a> {
63 pub inputs: &'a PluginAudioBuffer,
64 pub outputs: &'a mut PluginAudioBuffer,
65 pub midi_events: &'a [PluginMidiEvent],
66 pub param_events: &'a [PluginParamEvent],
67 pub sample_rate: f64,
68 pub block_size: usize,
69 pub transport: PluginTransportInfo,
71}
72
73#[derive(Debug, Clone, Copy, Default)]
75pub struct PluginTransportInfo {
76 pub is_playing: bool,
77 pub bpm: f64,
78 pub sample_pos: u64,
79 pub beat_pos: f64,
80 pub time_sig_numerator: u32,
81 pub time_sig_denominator: u32,
82}