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:?}") _ => panic!("unexpected in sampler {name}: {edn:?}")
}); });
let midi_in = jack.read().unwrap().client().register_port("in", MidiIn::default())?; Self::new(jack, &name)
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,
})
}); });
type MidiSample = (Option<u7>, Arc<RwLock<crate::Sample>>); type MidiSample = (Option<u7>, Arc<RwLock<crate::Sample>>);

View file

@ -1,5 +1,27 @@
use crate::*; 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. /// Trait for things that may expose JACK ports.
pub trait Ports { pub trait Ports {
fn audio_ins(&self) -> Usually<Vec<&Port<Unowned>>> { fn audio_ins(&self) -> Usually<Vec<&Port<Unowned>>> {

View file

@ -42,10 +42,33 @@ pub struct Sampler {
pub unmapped: Vec<Arc<RwLock<Sample>>>, pub unmapped: Vec<Arc<RwLock<Sample>>>,
pub voices: Arc<RwLock<Vec<Voice>>>, pub voices: Arc<RwLock<Vec<Voice>>>,
pub midi_in: Port<MidiIn>, pub midi_in: Port<MidiIn>,
pub audio_ins: Vec<Port<AudioIn>>,
pub audio_outs: Vec<Port<AudioOut>>, pub audio_outs: Vec<Port<AudioOut>>,
pub buffer: Vec<Vec<f32>>, pub buffer: Vec<Vec<f32>>,
pub output_gain: 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 struct SamplerTui {
pub state: Sampler, pub state: Sampler,
pub cursor: (usize, usize), pub cursor: (usize, usize),
@ -75,11 +98,6 @@ impl SamplerTui {
} }
} }
from_jack!(|jack|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 { Self {
cursor: (0, 0), cursor: (0, 0),
editing: None, editing: None,
@ -88,17 +106,7 @@ from_jack!(|jack|SamplerTui{
note_lo: 36.into(), note_lo: 36.into(),
note_pt: 36.into(), note_pt: 36.into(),
color: ItemPalette::from(Color::Rgb(64, 128, 32)), color: ItemPalette::from(Color::Rgb(64, 128, 32)),
state: Sampler { state: Sampler::new(jack, "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,
},
} }
}); });
render!(<Tui>|self: SamplerTui|{ render!(<Tui>|self: SamplerTui|{