wip: connect devices

This commit is contained in:
🪞👃🪞 2024-07-04 00:02:22 +03:00
parent 7f3425fe04
commit 394355331d
10 changed files with 235 additions and 145 deletions

View file

@ -7,28 +7,24 @@ pub mod vst3;
use self::lv2::*;
pub struct Plugin {
pub name: String,
pub path: Option<String>,
pub plugin: Option<PluginKind>,
pub selected: usize,
pub mapping: bool,
pub midi_ins: Vec<Port<MidiIn>>,
pub midi_outs: Vec<Port<MidiOut>>,
pub audio_ins: Vec<Port<AudioIn>>,
pub audio_outs: Vec<Port<AudioOut>>,
pub jack: Client,
pub name: String,
pub path: Option<String>,
pub plugin: Option<PluginKind>,
pub selected: usize,
pub mapping: bool,
pub ports: JackPorts,
}
render!(Plugin = crate::view::plugin::render);
handle!(Plugin = crate::control::plugin::handle);
process!(Plugin = Plugin::process);
ports!(Plugin {
audio: {
ins: |track|Ok(track.audio_ins.iter().collect()),
outs: |track|Ok(track.audio_outs.iter().collect()),
ins: |p|Ok(p.ports.audio_ins.values().collect()),
outs: |p|Ok(p.ports.audio_outs.values().collect()),
}
midi: {
ins: |track|Ok(track.midi_ins.iter().collect()),
outs: |track|Ok(track.midi_outs.iter().collect()),
ins: |p|Ok(p.ports.midi_ins.values().collect()),
outs: |p|Ok(p.ports.midi_outs.values().collect()),
}
});
@ -41,20 +37,15 @@ pub enum PluginKind {
}
impl Plugin {
/// Load a LV2 plugin.
/// Create a plugin host device.
pub fn new (name: &str) -> Usually<Self> {
let (jack, _) = Client::new(name, ClientOptions::NO_START_SERVER)?;
Ok(Self {
name: name.into(),
path: None,
plugin: None,
selected: 0,
mapping: false,
midi_ins: vec![],
midi_outs: vec![],
audio_ins: vec![],
audio_outs: vec![],
jack,
ports: JackPorts::default()
})
}
pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control {
@ -62,7 +53,7 @@ impl Plugin {
Some(PluginKind::LV2(LV2Plugin { features, ref mut instance, .. })) => {
let urid = features.midi_urid();
let mut inputs = vec![];
for port in self.midi_ins.iter() {
for port in self.ports.midi_ins.values() {
let mut atom = ::livi::event::LV2AtomSequence::new(
&features,
scope.n_frames() as usize
@ -80,7 +71,7 @@ impl Plugin {
inputs.push(atom);
}
let mut outputs = vec![];
for _ in self.midi_outs.iter() {
for _ in self.ports.midi_outs.iter() {
outputs.push(::livi::event::LV2AtomSequence::new(
&features,
scope.n_frames() as usize
@ -94,10 +85,10 @@ impl Plugin {
outputs.iter_mut()
)
.with_audio_inputs(
self.audio_ins.iter().map(|o|o.as_slice(scope))
self.ports.audio_ins.values().map(|o|o.as_slice(scope))
)
.with_audio_outputs(
self.audio_outs.iter_mut().map(|o|o.as_mut_slice(scope))
self.ports.audio_outs.values_mut().map(|o|o.as_mut_slice(scope))
);
unsafe {
instance.run(scope.n_frames() as usize, ports).unwrap()