autoconnect to controller and ports

This commit is contained in:
🪞👃🪞 2024-06-26 01:58:16 +03:00
parent 22b44f562b
commit da1d3220f9
2 changed files with 40 additions and 20 deletions

View file

@ -34,40 +34,53 @@ impl Scene {
} }
} }
impl Launcher { impl Launcher {
pub fn new_with_controller (name: &str, pattern: &str) pub fn new_with_controller (
name: &str,
midi_in: &str,
audio_outs: &[&str],
)
-> Result<DynamicDevice<Self>, Box<dyn Error>> -> Result<DynamicDevice<Self>, Box<dyn Error>>
{ {
let launcher = Self::new(name)?; let launcher = Self::new(name)?;
{ {
let state = &launcher.state(); let state = &launcher.state();
let (client, _status) = Client::new(&format!("{name}-init"), ClientOptions::NO_START_SERVER)?; let (client, _status) = Client::new(
let controllers = client.ports(Some(pattern), None, ::jack::PortFlags::IS_OUTPUT); &format!("{name}-init"),
ClientOptions::NO_START_SERVER
)?;
let midi_ins = client.ports(
Some(midi_in),
None,
::jack::PortFlags::IS_OUTPUT
);
let audio_outs: Vec<Vec<String>> = audio_outs
.iter()
.map(|pattern|client.ports(
Some(pattern),
None,
::jack::PortFlags::IS_INPUT
))
.collect();
for (i, sequencer) in state.tracks.iter().enumerate() { for (i, sequencer) in state.tracks.iter().enumerate() {
for sequencer_midi_in in sequencer.midi_ins()?.iter() { for sequencer_midi_in in sequencer.midi_ins()?.iter() {
for controller in controllers.iter() { for midi_in in midi_ins.iter() {
client.connect_ports_by_name( client.connect_ports_by_name(
&controller, &midi_in,
&sequencer_midi_in &sequencer_midi_in
)?; )?;
} }
} }
let chain: &DynamicDevice<Chain> = &state.chains[i]; let chain: &DynamicDevice<Chain> = &state.chains[i];
for sequencer_midi_out in sequencer.midi_outs()?.iter() { for midi_out in sequencer.midi_outs()?.iter() {
for chain_midi_in in chain.midi_ins()?.iter() { for midi_in in chain.midi_ins()?.iter() {
client.connect_ports_by_name( client.connect_ports_by_name(&midi_out, &midi_in)?;
&sequencer_midi_out, }
&chain_midi_in }
)?; for (j, port) in chain.audio_outs()?.iter().enumerate() {
for audio_out in audio_outs[j % audio_outs.len()].iter() {
client.connect_ports_by_name(&port, &audio_out);
} }
} }
client.connect_ports_by_name(
&chain.audio_outs()?[0],
"Komplete Audio 6 Analog Stereo 1/2:playback_FL"
);
client.connect_ports_by_name(
&chain.audio_outs()?[1],
"Komplete Audio 6 Analog Stereo 1/2:playback_FR"
);
} }
} }
Ok(launcher) Ok(launcher)

View file

@ -19,5 +19,12 @@ fn main () -> Result<(), Box<dyn Error>> {
let _cli = cli::Cli::parse(); let _cli = cli::Cli::parse();
let xdg = microxdg::XdgApp::new("dawdle")?; let xdg = microxdg::XdgApp::new("dawdle")?;
crate::config::create_dirs(&xdg)?; crate::config::create_dirs(&xdg)?;
run(Launcher::new_with_controller("Launcher#0", ".*nanoKEY.*")?) run(Launcher::new_with_controller(
"Launcher#0",
".*nanoKEY.*",
&[
"Komplete.*:playback_FL",
"Komplete.*:playback_FR",
]
)?)
} }