autoregister sampler ports

This commit is contained in:
🪞👃🪞 2024-12-28 14:16:27 +01:00
parent 9f739fe040
commit 120a67ba21
3 changed files with 47 additions and 28 deletions

View file

@ -60,18 +60,7 @@ from_edn!("sampler" => |jack: &Arc<RwLock<JackClient>>, 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<u7>, Arc<RwLock<crate::Sample>>);

View file

@ -1,5 +1,27 @@
use crate::*;
pub trait RegisterPort {
fn midi_in (&self, name: &str) -> Usually<Port<MidiIn>>;
fn midi_out (&self, name: &str) -> Usually<Port<MidiOut>>;
fn audio_in (&self, name: &str) -> Usually<Port<AudioIn>>;
fn audio_out (&self, name: &str) -> Usually<Port<AudioOut>>;
}
impl RegisterPort for &Arc<RwLock<JackClient>> {
fn midi_in (&self, name: &str) -> Usually<Port<MidiIn>> {
Ok(self.read().unwrap().client().register_port(name, MidiIn::default())?)
}
fn midi_out (&self, name: &str) -> Usually<Port<MidiOut>> {
Ok(self.read().unwrap().client().register_port(name, MidiOut::default())?)
}
fn audio_out (&self, name: &str) -> Usually<Port<AudioOut>> {
Ok(self.read().unwrap().client().register_port(name, AudioOut::default())?)
}
fn audio_in (&self, name: &str) -> Usually<Port<AudioIn>> {
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<Vec<&Port<Unowned>>> {

View file

@ -42,10 +42,33 @@ pub struct Sampler {
pub unmapped: Vec<Arc<RwLock<Sample>>>,
pub voices: Arc<RwLock<Vec<Voice>>>,
pub midi_in: Port<MidiIn>,
pub audio_ins: Vec<Port<AudioIn>>,
pub audio_outs: Vec<Port<AudioOut>>,
pub buffer: Vec<Vec<f32>>,
pub output_gain: f32
}
impl Sampler {
pub fn new (jack: &Arc<RwLock<JackClient>>, name: &str) -> Usually<Self> {
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!(<Tui>|self: SamplerTui|{