use crate::{MidiEvent, ParameterInfo, PluginInfo, PresetInfo, Result};
pub trait PluginScanner {
type Plugin: PluginInstance;
fn scan(&self) -> Result<Vec<PluginInfo>>;
fn scan_path(&self, path: &std::path::Path) -> Result<Vec<PluginInfo>>;
fn load(&self, info: &PluginInfo) -> Result<Self::Plugin>;
}
pub trait PluginInstance: Send {
fn initialize(&mut self, sample_rate: f64, max_block_size: usize) -> Result<()>;
fn reset(&mut self) -> Result<()>;
fn process(
&mut self,
inputs: &[&[f32]],
outputs: &mut [&mut [f32]],
num_frames: usize,
) -> Result<()>;
fn parameter_count(&self) -> usize;
fn parameter_info(&self, index: usize) -> Result<ParameterInfo>;
fn get_parameter(&self, index: usize) -> Result<f32>;
fn set_parameter(&mut self, index: usize, value: f32) -> Result<()>;
fn send_midi(&mut self, events: &[MidiEvent]) -> Result<()>;
fn preset_count(&self) -> Result<usize>;
fn preset_info(&self, index: usize) -> Result<PresetInfo>;
fn load_preset(&mut self, preset_number: i32) -> Result<()>;
fn get_state(&self) -> Result<Vec<u8>>;
fn set_state(&mut self, data: &[u8]) -> Result<()>;
fn info(&self) -> &PluginInfo;
fn is_initialized(&self) -> bool;
}