From 55a85fafefa11701097628c48b9bfadf8f2aefde Mon Sep 17 00:00:00 2001 From: unspeaker Date: Wed, 3 Jul 2024 21:14:05 +0300 Subject: [PATCH] remove DynamicDevice from plugin --- src/model/plugin.rs | 102 +++++++++++----------------------------- src/model/plugin/lv2.rs | 44 +++++++++++++++++ src/view.rs | 2 +- 3 files changed, 73 insertions(+), 75 deletions(-) diff --git a/src/model/plugin.rs b/src/model/plugin.rs index df7baeec..867bd381 100644 --- a/src/model/plugin.rs +++ b/src/model/plugin.rs @@ -16,7 +16,21 @@ pub struct Plugin { pub midi_outs: Vec>, pub audio_ins: Vec>, pub audio_outs: Vec>, + pub jack: Client, } +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()), + } + midi: { + ins: |track|Ok(track.midi_ins.iter().collect()), + outs: |track|Ok(track.midi_outs.iter().collect()), + } +}); pub enum PluginKind { LV2(LV2Plugin), @@ -26,71 +40,22 @@ pub enum PluginKind { VST3, } -const HELM: &'static str = "file:///nix/store/ij3sz7nqg5l7v2dygdvzy3w6cj62bd6r-helm-0.9.0/lib/lv2/helm.lv2"; - impl Plugin { /// Load a LV2 plugin. - pub fn lv2 (name: &str, path: &str) -> Usually> { - let host = Self::new(name)?; - let plugin = LV2Plugin::new(path)?; - let mut state = host.state(); - let client = host.client.as_ref().unwrap().as_client(); - let (midi_ins, midi_outs, audio_ins, audio_outs) = ( - plugin.plugin.port_counts().atom_sequence_inputs, - plugin.plugin.port_counts().atom_sequence_outputs, - plugin.plugin.port_counts().audio_inputs, - plugin.plugin.port_counts().audio_outputs, - ); - state.midi_ins = { - let mut ports = vec![]; - for i in 0..midi_ins { - ports.push(client.register_port(&format!("midi-in-{i}"), MidiIn::default())?) - } - ports - }; - state.midi_outs = { - let mut ports = vec![]; - for i in 0..midi_outs { - ports.push(client.register_port(&format!("midi-out-{i}"), MidiOut::default())?) - } - ports - }; - state.audio_ins = { - let mut ports = vec![]; - for i in 0..audio_ins { - ports.push(client.register_port(&format!("audio-in-{i}"), AudioIn::default())?) - } - ports - }; - state.audio_outs = { - let mut ports = vec![]; - for i in 0..audio_outs { - ports.push(client.register_port(&format!("audio-out-{i}"), AudioOut::default())?) - } - ports - }; - state.plugin = Some(PluginKind::LV2(plugin)); - state.path = Some(String::from(path)); - std::mem::drop(state); - Ok(host) - } - pub fn new (name: &str) -> Usually> { - DynamicDevice::new( - crate::view::plugin::render, - crate::control::plugin::handle, - Self::process, - Self { - name: name.into(), - path: None, - plugin: None, - selected: 0, - mapping: false, - midi_ins: vec![], - midi_outs: vec![], - audio_ins: vec![], - audio_outs: vec![], - } - ).activate(Client::new(name, ClientOptions::NO_START_SERVER)?.0) + pub fn new (name: &str) -> Usually { + 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, + }) } pub fn process (&mut self, _: &Client, scope: &ProcessScope) -> Control { match self.plugin.as_mut() { @@ -143,14 +108,3 @@ impl Plugin { Control::Continue } } - -ports!(Plugin { - audio: { - ins: |track|Ok(track.audio_ins.iter().collect()), - outs: |track|Ok(track.audio_outs.iter().collect()), - } - midi: { - ins: |track|Ok(track.midi_ins.iter().collect()), - outs: |track|Ok(track.midi_outs.iter().collect()), - } -}); diff --git a/src/model/plugin/lv2.rs b/src/model/plugin/lv2.rs index 7d6664b5..b1ae54ad 100644 --- a/src/model/plugin/lv2.rs +++ b/src/model/plugin/lv2.rs @@ -40,3 +40,47 @@ impl LV2Plugin { } } +impl super::Plugin { + pub fn lv2 (name: &str, path: &str) -> Usually { + let mut host = Self::new(name)?; + let plugin = LV2Plugin::new(path)?; + let client = &host.jack; + let (midi_ins, midi_outs, audio_ins, audio_outs) = ( + plugin.plugin.port_counts().atom_sequence_inputs, + plugin.plugin.port_counts().atom_sequence_outputs, + plugin.plugin.port_counts().audio_inputs, + plugin.plugin.port_counts().audio_outputs, + ); + host.midi_ins = { + let mut ports = vec![]; + for i in 0..midi_ins { + ports.push(client.register_port(&format!("midi-in-{i}"), MidiIn::default())?) + } + ports + }; + host.midi_outs = { + let mut ports = vec![]; + for i in 0..midi_outs { + ports.push(client.register_port(&format!("midi-out-{i}"), MidiOut::default())?) + } + ports + }; + host.audio_ins = { + let mut ports = vec![]; + for i in 0..audio_ins { + ports.push(client.register_port(&format!("audio-in-{i}"), AudioIn::default())?) + } + ports + }; + host.audio_outs = { + let mut ports = vec![]; + for i in 0..audio_outs { + ports.push(client.register_port(&format!("audio-out-{i}"), AudioOut::default())?) + } + ports + }; + host.plugin = Some(super::PluginKind::LV2(plugin)); + host.path = Some(String::from(path)); + Ok(host) + } +} diff --git a/src/view.rs b/src/view.rs index 9b0ca070..1dddb07e 100644 --- a/src/view.rs +++ b/src/view.rs @@ -20,7 +20,7 @@ render!(App |self, buf, area| { y = y + TransportView { timebase: &self.timebase, - playing: *self.playing.as_ref().unwrap(), + playing: *self.playing.as_ref().unwrap_or(&TransportState::Stopped), record: false, overdub: false, monitor: false,