use coremidi::{Client, EventList, Protocol, Source, Sources}; use std::env; fn main() { let source_index = get_source_index(); println!("Source index: {}", source_index); let source = Source::from_index(source_index).unwrap(); let source_id = source.unique_id().unwrap_or(0); println!("Source display name: {}", source.display_name().unwrap()); println!("Source unique id: {:08x}", source_id); let client = Client::new("Example Client").unwrap(); let callback = |event_list: &EventList, context: &mut u32| { print!("{:08x}: {:?}", *context, event_list); }; let mut input_port = client .input_port_with_protocol("Example Port", Protocol::Midi10, callback) .unwrap(); input_port.connect_source(&source, source_id).unwrap(); let mut input_line = String::new(); println!("Press Enter to Finish"); std::io::stdin() .read_line(&mut input_line) .expect("Failed to read line"); input_port.disconnect_source(&source).unwrap(); } fn get_source_index() -> usize { let mut args_iter = env::args(); let tool_name = args_iter .next() .and_then(|path| { path.split(std::path::MAIN_SEPARATOR) .last() .map(|v| v.to_string()) }) .unwrap_or_else(|| "receive".to_string()); match args_iter.next() { Some(arg) => match arg.parse::() { Ok(index) => { if index >= Sources::count() { println!("Source index out of range: {}", index); std::process::exit(-1); } index } Err(_) => { println!("Wrong source index: {}", arg); std::process::exit(-1); } }, None => { println!("Usage: {} ", tool_name); println!(); println!("Available Sources:"); print_sources(); std::process::exit(-1); } } } fn print_sources() { for (i, source) in Sources.into_iter().enumerate() { if let Some(display_name) = source.display_name() { println!("[{}] {}", i, display_name) } } }