use crate::*; /// A LV2 plugin. #[derive(Debug)] pub struct Lv2 { /// JACK client handle (needs to not be dropped for standalone mode to work). pub jack: Jack, pub name: Arc, pub path: Option>, pub selected: usize, pub mapping: bool, pub midi_ins: Vec>, pub midi_outs: Vec>, pub audio_ins: Vec>, pub audio_outs: Vec>, pub lv2_world: livi::World, pub lv2_instance: livi::Instance, pub lv2_plugin: livi::Plugin, pub lv2_features: Arc, pub lv2_port_list: Vec, pub lv2_input_buffer: Vec, pub lv2_ui_thread: Option>, } impl Lv2 { pub fn new ( jack: &Jack, name: &str, uri: &str, ) -> Usually { let lv2_world = livi::World::with_load_bundle(&uri); let lv2_features = lv2_world.build_features(livi::FeaturesBuilder { min_block_length: 1, max_block_length: 65536, }); let lv2_plugin = lv2_world.iter_plugins().nth(0) .unwrap_or_else(||panic!("plugin not found: {uri}")); Ok(Self { jack: jack.clone(), name: name.into(), path: Some(String::from(uri).into()), selected: 0, mapping: false, midi_ins: vec![], midi_outs: vec![], audio_ins: vec![], audio_outs: vec![], lv2_instance: unsafe { lv2_plugin .instantiate(lv2_features.clone(), 48000.0) .expect(&format!("instantiate failed: {uri}")) }, lv2_port_list: lv2_plugin.ports().collect::>(), lv2_input_buffer: Vec::with_capacity(Self::INPUT_BUFFER), lv2_ui_thread: None, lv2_world, lv2_features, lv2_plugin, }) } const INPUT_BUFFER: usize = 1024; } //fn jack_from_lv2 (name: &str, plugin: &::livi::Plugin) -> Usually { //let counts = plugin.port_counts(); //let mut jack = Jack::new(name)?; //for i in 0..counts.atom_sequence_inputs { //jack = jack.midi_in(&format!("midi-in-{i}")) //} //for i in 0..counts.atom_sequence_outputs { //jack = jack.midi_out(&format!("midi-out-{i}")); //} //for i in 0..counts.audio_inputs { //jack = jack.audio_in(&format!("audio-in-{i}")); //} //for i in 0..counts.audio_outputs { //jack = jack.audio_out(&format!("audio-out-{i}")); //} //Ok(jack) //}