extern crate libloading;
use libloading::{Library, Symbol};
use crate::buffer::Buffer;
#[macro_export]
macro_rules! declare_plugin
{
($plugin_type:ty, $constructor:path) =>
{
#[no_mangle]
pub extern "C" fn _create() -> * mut dyn Processor
{
let constructor : fn() -> $plugin_type = $constructor;
let object = constructor();
let boxed : Box<dyn Processor> = Box::new(object);
return Box::into_raw(boxed);
}
};
}
pub trait Processor
{
fn init(& mut self);
fn name(& self) -> String;
fn get_parameter(& self, index : usize) -> f64;
fn set_parameter(& mut self, index : usize, value : f64);
fn get_parameter_name(& self, index : usize) -> String;
fn open_window(&self);
fn close_window(&self);
fn prepare_to_play(&mut self, buffer_size : usize, sample_rate : usize);
fn run(& self, input: &Buffer<Buffer<f64>>, sidechain_in : &Buffer<Buffer<f64>>,
output: &mut Buffer<Buffer<f64>>, sidechain_out : &mut Buffer<Buffer<f64>>);
}
pub fn load(path : &str, name : &str) -> Result<Box<dyn Processor>, libloading::Error>
{
unsafe
{
let file = format!("{}/{}.mkap", path, name);
let lib = Library::new(&file)?;
let constructor : Symbol<unsafe extern fn() -> * mut dyn Processor> = lib.get(b"_create\0")?;
let mut plugin = Box::from_raw(constructor());
plugin.init();
Ok(plugin)
}
}