From 120a67ba21525e8ce6102f6b54c707bf0653e9c0 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 28 Dec 2024 14:16:27 +0100 Subject: [PATCH] autoregister sampler ports --- crates/edn/src/lib.rs | 13 +----------- crates/tek/src/jack/ports.rs | 22 ++++++++++++++++++++ crates/tek/src/sampler.rs | 40 +++++++++++++++++++++--------------- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/crates/edn/src/lib.rs b/crates/edn/src/lib.rs index 347f98a0..9b814a17 100644 --- a/crates/edn/src/lib.rs +++ b/crates/edn/src/lib.rs @@ -60,18 +60,7 @@ from_edn!("sampler" => |jack: &Arc>, args| -> crate::Sampler }, _ => panic!("unexpected in sampler {name}: {edn:?}") }); - let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?; - Ok(Self { - jack: jack.clone(), - mapped: samples, - unmapped: Default::default(), - voices: Default::default(), - buffer: Default::default(), - audio_outs: vec![], - output_gain: 0., - midi_in, - name, - }) + Self::new(jack, &name) }); type MidiSample = (Option, Arc>); diff --git a/crates/tek/src/jack/ports.rs b/crates/tek/src/jack/ports.rs index 299f123e..c64e050a 100644 --- a/crates/tek/src/jack/ports.rs +++ b/crates/tek/src/jack/ports.rs @@ -1,5 +1,27 @@ use crate::*; +pub trait RegisterPort { + fn midi_in (&self, name: &str) -> Usually>; + fn midi_out (&self, name: &str) -> Usually>; + fn audio_in (&self, name: &str) -> Usually>; + fn audio_out (&self, name: &str) -> Usually>; +} + +impl RegisterPort for &Arc> { + fn midi_in (&self, name: &str) -> Usually> { + Ok(self.read().unwrap().client().register_port(name, MidiIn::default())?) + } + fn midi_out (&self, name: &str) -> Usually> { + Ok(self.read().unwrap().client().register_port(name, MidiOut::default())?) + } + fn audio_out (&self, name: &str) -> Usually> { + Ok(self.read().unwrap().client().register_port(name, AudioOut::default())?) + } + fn audio_in (&self, name: &str) -> Usually> { + Ok(self.read().unwrap().client().register_port(name, AudioIn::default())?) + } +} + /// Trait for things that may expose JACK ports. pub trait Ports { fn audio_ins(&self) -> Usually>> { diff --git a/crates/tek/src/sampler.rs b/crates/tek/src/sampler.rs index c394b28e..0ffff68a 100644 --- a/crates/tek/src/sampler.rs +++ b/crates/tek/src/sampler.rs @@ -42,10 +42,33 @@ pub struct Sampler { pub unmapped: Vec>>, pub voices: Arc>>, pub midi_in: Port, + pub audio_ins: Vec>, pub audio_outs: Vec>, pub buffer: Vec>, pub output_gain: f32 } +impl Sampler { + pub fn new (jack: &Arc>, name: &str) -> Usually { + Ok(Self { + midi_in: jack.midi_in(&format!("M->{name}"))?, + audio_ins: vec![ + jack.audio_in(&format!("L/{name}"))?, + jack.audio_in(&format!("R/{name}"))? + ], + audio_outs: vec![ + jack.audio_out(&format!("{name}/L"))?, + jack.audio_out(&format!("{name}/R"))?, + ], + jack: jack.clone(), + name: name.into(), + mapped: BTreeMap::new(), + unmapped: vec![], + voices: Arc::new(RwLock::new(vec![])), + buffer: vec![vec![0.0;16384];2], + output_gain: 0.5, + }) + } +} pub struct SamplerTui { pub state: Sampler, pub cursor: (usize, usize), @@ -75,11 +98,6 @@ impl SamplerTui { } } from_jack!(|jack|SamplerTui{ - let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?; - let audio_outs = vec![ - jack.read().unwrap().client().register_port("outL", AudioOut::default())?, - jack.read().unwrap().client().register_port("outR", AudioOut::default())?, - ]; Self { cursor: (0, 0), editing: None, @@ -88,17 +106,7 @@ from_jack!(|jack|SamplerTui{ note_lo: 36.into(), note_pt: 36.into(), color: ItemPalette::from(Color::Rgb(64, 128, 32)), - state: Sampler { - jack: jack.clone(), - name: "Sampler".into(), - mapped: BTreeMap::new(), - unmapped: vec![], - voices: Arc::new(RwLock::new(vec![])), - buffer: vec![vec![0.0;16384];2], - output_gain: 0.5, - midi_in, - audio_outs, - }, + state: Sampler::new(jack, "sampler")?, } }); render!(|self: SamplerTui|{