diff --git a/Cargo.lock b/Cargo.lock index 80b4377b..696dee05 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2666,6 +2666,7 @@ dependencies = [ "tek_core", "uuid", "vst", + "wavers", ] [[package]] diff --git a/crates/tek_api/src/lib.rs b/crates/tek_api/src/lib.rs index 818d694f..68d10c70 100644 --- a/crates/tek_api/src/lib.rs +++ b/crates/tek_api/src/lib.rs @@ -212,6 +212,24 @@ pub struct Plugin { pub mapping: bool, pub ports: JackPorts, } +impl Plugin { + pub fn new_lv2 ( + jack: &Arc>, + name: &str, + path: &str, + ) -> Usually { + let plugin = LV2Plugin::new(path)?; + jack_from_lv2(name, &plugin.plugin)?.run(|ports|Box::new(Self { + jack: jack.clone(), + name: name.into(), + path: Some(String::from(path)), + plugin: Some(PluginKind::LV2(plugin)), + selected: 0, + mapping: false, + ports + })) + } +} /// Supported plugin formats. #[derive(Default)] @@ -243,3 +261,32 @@ pub struct LV2Plugin { pub input_buffer: Vec, pub ui_thread: Option>, } + +impl LV2Plugin { + const INPUT_BUFFER: usize = 1024; + pub fn new (uri: &str) -> Usually { + let world = livi::World::with_load_bundle(&uri); + let features = world + .build_features(livi::FeaturesBuilder { + min_block_length: 1, + max_block_length: 65536, + }); + let plugin = world + .iter_plugins() + .nth(0) + .expect(&format!("plugin not found: {uri}")); + Ok(Self { + instance: unsafe { + plugin + .instantiate(features.clone(), 48000.0) + .expect(&format!("instantiate failed: {uri}")) + }, + port_list: plugin.ports().collect::>(), + input_buffer: Vec::with_capacity(Self::INPUT_BUFFER), + ui_thread: None, + world, + features, + plugin, + }) + } +} diff --git a/crates/tek_tui/src/plugin.rs b/crates/tek_tui/src/plugin.rs index a21cd781..9757c05d 100644 --- a/crates/tek_tui/src/plugin.rs +++ b/crates/tek_tui/src/plugin.rs @@ -31,32 +31,3 @@ impl Plugin { }) } } - -impl Plugin { - pub fn new_lv2 ( - jack: &Arc>, - name: &str, - path: &str, - ) -> Usually> { - let plugin = LV2Plugin::new(path)?; - jack_from_lv2(name, &plugin.plugin)?.run(|ports|Box::new(Self { - _engine: Default::default(), - jack: jack.clone(), - name: name.into(), - path: Some(String::from(path)), - plugin: Some(PluginKind::LV2(plugin)), - selected: 0, - mapping: false, - ports - })) - } -} - -/// Supported plugin formats. -pub enum PluginKind { - LV2(LV2Plugin), - VST2 { - instance: ::vst::host::PluginInstance - }, - VST3, -}