use crate::buffer::AudioBuffer;
use crate::bus::BusLayout;
use crate::error::Result;
use crate::events::EventList;
use crate::info::{ParameterInfo, PluginInfo, PresetInfo};
use crate::sample::Sample;
use crate::transport::TransportInfo;
pub struct ProcessContext<'a> {
pub sample_rate: f64,
pub max_block_size: usize,
pub transport: Option<TransportInfo>,
pub output_events: &'a mut EventList,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProcessStatus {
Continue,
Sleep,
Tail {
tail_samples: u32,
},
Error,
}
pub trait PluginCore: Send {
fn info(&self) -> &PluginInfo;
fn active_layout(&self) -> Option<&BusLayout>;
fn supported_layouts(&self) -> &[BusLayout];
fn parameter_count(&self) -> usize;
fn parameter_info(&self, index: usize) -> Result<ParameterInfo>;
fn parameter_value(&self, index: usize) -> Result<f64>;
fn parameter_value_string(&self, index: usize, value: f64) -> Result<String>;
fn set_parameter(&mut self, index: usize, value: f64) -> Result<()>;
fn preset_count(&self) -> usize;
fn preset_info(&self, index: usize) -> Result<PresetInfo>;
fn load_preset(&mut self, preset_number: i32) -> Result<()>;
fn save_state(&self) -> Result<Vec<u8>>;
fn load_state(&mut self, bytes: &[u8]) -> Result<()>;
fn activate(
&mut self,
layout: BusLayout,
sample_rate: f64,
max_block_size: usize,
) -> Result<()>;
fn deactivate(&mut self);
fn is_active(&self) -> bool;
fn editor(&mut self) -> Option<&mut dyn crate::editor::PluginEditor> {
None
}
}
pub trait Plugin<S: Sample>: PluginCore {
fn process(
&mut self,
buffer: &mut AudioBuffer<'_, S>,
events: &EventList,
context: &mut ProcessContext<'_>,
) -> Result<ProcessStatus>;
}