mkaudiolibrary 0.1.1

Modular audio processing library including MKAU plugin format based on Rust.
Documentation
extern crate libloading;

use std::ops::Add;
use std::sync::{Arc, Barrier};
use libloading::{Library, Symbol};
use crate::buffer::CircularBuffer;

/// # Use
/// ```
/// use std::sync::{Arc, Barrier};
/// use mkaudiolibrary::buffer::*;
/// use mkaudiolibrary::processor::*;
///
/// #[derive(Debug, Default)]
/// struct Plugin;
/// impl Plugin
/// {
///     fn new() -> Self
///     {
///         todo!()
///     }
/// }
/// impl Processor for Plugin
/// {
///     fn init(&mut self)
///     {
///         todo!()
///     }
///
///     fn name(&self) -> String
///     {
///         todo!()
///     }
///
/// fn get_parameter(&self, index: usize) -> f64
///     {
///         todo!()
///     }
///
/// fn set_parameter(&mut self, index: usize, value: f64)
///     {
///         todo!()
///     }
///
/// fn run(&self, input: &mut Box<[CircularBuffer<Option<f64>>]>, sidechain_in: &mut Option<CircularBuffer<Option<f64>>>, output: &mut Box<[CircularBuffer<Option<f64>>]>, sidechain_out: &mut Option<CircularBuffer<Option<f64>>>, next: Arc<Barrier>, state: Arc<bool>)
///     {
///         todo!()
///     }
///
/// }
/// mkaudiolibrary::declare_plugin!(Plugin, Plugin::new());
/// ```

///Declare plugin.
#[macro_export]
macro_rules! declare_plugin
{
    ($plugin_type:ty, $constructor:path) =>
    {
        #[no_mangle]
        pub extern "C" fn _create() -> * mut dyn Processor
        {
            // make sure the constructor is the correct type.
            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
{
    ///Initialize processor when loaded.
    fn init(& mut self);
    ///Returns name.
    fn name(& self) -> String;
    ///Get parameter value of index.
    fn get_parameter(& self, index : usize) -> f64;
    ///Set parameter value of index.
    fn set_parameter(& mut self, index : usize, value : f64);
    ///Process with the plugin. Optional sidechain I/O, barrier for multithreading to pause by buffer size. State to stop.
    fn run(& self, input: & mut Box<[CircularBuffer<Option<f64>>]>, sidechain_in : & mut Option<CircularBuffer<Option<f64>>>,
           output: & mut Box<[CircularBuffer<Option<f64>>]>, sidechain_out : & mut Option<CircularBuffer<Option<f64>>>,
           next : Arc<Barrier>, state : Arc<bool>);
}
///Loads plugin.
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)
        }
}