use super::*; use ::livi::{ World, Instance, Plugin as LiviPlugin, Features, FeaturesBuilder, Port, event::LV2AtomSequence, }; use std::thread::JoinHandle; /// A LV2 plugin. pub struct LV2Plugin { pub world: World, pub instance: Instance, pub plugin: LiviPlugin, pub features: Arc, pub port_list: Vec, pub input_buffer: Vec, pub ui_thread: Option>, } impl LV2Plugin { const INPUT_BUFFER: usize = 1024; pub fn new (uri: &str) -> Usually { // Get 1st plugin at URI let world = World::with_load_bundle(&uri); let features = FeaturesBuilder { min_block_length: 1, max_block_length: 65536 }; let features = world.build_features(features); let mut plugin = None; if let Some(p) = world.iter_plugins().next() { plugin = Some(p); } let plugin = plugin.expect("plugin not found"); let err = &format!("init {uri}"); let instance = unsafe { plugin.instantiate(features.clone(), 48000.0).expect(&err) }; let mut port_list = vec![]; for port in plugin.ports() { port_list.push(port); } let input_buffer = Vec::with_capacity(Self::INPUT_BUFFER); // Instantiate Ok(Self { world, instance, port_list, plugin, features, input_buffer, ui_thread: None }) } }