mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-06 11:46:41 +01:00
47 lines
1.4 KiB
Rust
47 lines
1.4 KiB
Rust
|
|
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<Features>,
|
|
pub port_list: Vec<Port>,
|
|
pub input_buffer: Vec<LV2AtomSequence>,
|
|
pub ui_thread: Option<JoinHandle<()>>,
|
|
}
|
|
|
|
impl LV2Plugin {
|
|
const INPUT_BUFFER: usize = 1024;
|
|
pub fn new (uri: &str) -> Usually<Self> {
|
|
// 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
|
|
})
|
|
}
|
|
}
|