extern crate libloading;
use std::ops::Add;
use libloading::{Library, Symbol};
use crate::buffer::CircularBuffer;
#[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 run(& self, input: & mut Box<[CircularBuffer<f64>]>, sidechain_in : & mut CircularBuffer<f64>,
output: & mut Box<[CircularBuffer<f64>]>, sidechain_out : & mut CircularBuffer<f64>);
}
pub fn load(filename : String) -> Result<Box<dyn Processor>, Box<dyn std::error::Error>>
{
unsafe
{
let lib = Library::new(filename.add(".mkap").as_str())?;
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)
}
}