Skip to main content

plugin_host/
process.rs

1/// Evento MIDI para pasar al plugin durante process().
2#[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/// Cambio de parámetro con sample accuracy para automatización.
11#[derive(Debug, Clone, Copy)]
12pub struct PluginParamEvent {
13    pub sample_offset: u32,
14    pub param_id: u32,
15    /// Valor normalizado [0.0, 1.0]
16    pub value: f64,
17}
18
19/// Buffers de audio para el plugin — non-interleaved (un Vec por canal).
20pub 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    /// Punteros raw para pasar a la API C del plugin (CLAP/VST3).
52    /// SAFETY: Los punteros solo son válidos mientras PluginAudioBuffer vive.
53    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
61/// Todos los datos que se pasan al plugin en cada llamada a process().
62pub 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    /// Posición actual en el transport (para plugins que lo necesitan)
70    pub transport: PluginTransportInfo,
71}
72
73/// Información de transporte que el plugin puede solicitar.
74#[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}