Add regex midi device choosing

Add regex
This commit is contained in:
GHOSCHT 2024-03-11 20:26:51 +01:00
parent 55636839b8
commit 0d9e8a4571
Signed by: ghoscht
GPG key ID: 2C2C1C62A5388E82
3 changed files with 68 additions and 64 deletions

39
Cargo.lock generated
View file

@ -17,6 +17,15 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "alsa" name = "alsa"
version = "0.7.1" version = "0.7.1"
@ -571,6 +580,7 @@ dependencies = [
"libpulse-binding", "libpulse-binding",
"midir", "midir",
"mpris", "mpris",
"regex",
"serde", "serde",
"toml", "toml",
] ]
@ -630,6 +640,35 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "regex"
version = "1.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.23" version = "0.1.23"

View file

@ -11,6 +11,7 @@ itertools = "0.11.0"
libpulse-binding = "2.28.1" libpulse-binding = "2.28.1"
midir = "0.9.1" midir = "0.9.1"
mpris = "2.0.1" mpris = "2.0.1"
regex = "1.10.3"
serde = {version ="1.0.188", features = ["derive"]} serde = {version ="1.0.188", features = ["derive"]}
toml = "0.7.6" toml = "0.7.6"

View file

@ -1,80 +1,44 @@
use delay_map::HashMapDelay; use crate::config::NanoKeys;
use midir::{Ignore, MidiInput}; use midir::{Ignore, MidiInput};
use mpris::PlayerFinder; use regex::Regex;
use std::error::Error; use std::error::Error;
use std::io::{stdin, stdout, Write};
pub fn run() -> Result<(), Box<dyn Error>> {
let mut input = String::new();
let mut midi_in = MidiInput::new("midir reading input")?; pub fn list_ports() -> () {
let midi_in = MidiInput::new("PicoKontroller").expect("Creating Midi device failed");
let in_ports = midi_in.ports();
println!("All available midi devices:");
for (_, p) in in_ports.iter().enumerate() {
println!("{}", midi_in.port_name(p).unwrap());
}
}
pub fn run(port_name: &str) -> Result<(), Box<dyn Error>> {
let port_filter = Regex::new(port_name).expect("Creating RegEx failed");
let mut midi_in = MidiInput::new("PicoKontroller").expect("Creating Midi device failed");
midi_in.ignore(Ignore::None); midi_in.ignore(Ignore::None);
// Get an input port (read from console if multiple are available)
let in_ports = midi_in.ports(); let in_ports = midi_in.ports();
let in_port = match in_ports.len() { let in_port = in_ports
0 => return Err("no input port found".into()), .iter()
1 => { .find(|p| port_filter.is_match(&midi_in.port_name(p).unwrap()))
println!( .expect("Couldn't find a port matching the supplied RegEx");
"Choosing the only available input port: {}",
midi_in.port_name(&in_ports[0]).unwrap()
);
&in_ports[0]
}
_ => {
println!("\nAvailable input ports:");
for (i, p) in in_ports.iter().enumerate() {
println!("{}: {}", i, midi_in.port_name(p).unwrap());
}
print!("Please select input port: ");
stdout().flush()?;
let mut input = String::new();
stdin().read_line(&mut input)?;
in_ports
.get(input.trim().parse::<usize>()?)
.ok_or("invalid input port selected")?
}
};
println!("\nOpening connection");
let in_port_name = midi_in.port_name(in_port)?;
// _conn_in needs to be a named parameter, because it needs to be kept alive until the end of the scope // _conn_in needs to be a named parameter, because it needs to be kept alive until the end of the scope
let _conn_in = midi_in.connect( let _conn_in = midi_in.connect(
in_port, in_port,
"midir-read-input", "PicoController Input",
move |stamp, message, _| { move |_, message, _| {
println!( let key = message[1];
"{}: {:.3} (len = {})",
stamp,
message[2] as f64 / 127.0,
message.len()
);
let volume = message[2] as f64 / 127.0; let volume = message[2] as f64 / 127.0;
set_volume("LibreWolf", volume); println!(
"Key: {:?} | State: {:.2}",
NanoKeys::try_from(key).unwrap(),
volume
);
}, },
(), (),
)?; )?;
println!( loop {}
"Connection open, reading input from '{}' (press enter to exit) ...",
in_port_name
);
input.clear();
stdin().read_line(&mut input)?; // wait for next enter key press
println!("Closing connection");
Ok(())
}
pub fn set_volume(player_id: &str, volume: f64) {
PlayerFinder::new()
.expect("Could not connect to D-Bus")
.find_all()
.unwrap_or_else(|_| Vec::new())
.into_iter()
.filter(|player| player.identity() == player_id)
.for_each(|player| {
let _ = player.set_volume(volume);
});
} }