use atome::device::AtomeDevice;
use atome::output::SampleRate;
use atome::{input, output, AudioEngine};
mod common;
fn main() -> Result<(), cpal::Error> {
let inputs = input::list_devices(None)?;
let outputs = output::list_devices(None)?;
let Some(input) = inputs.first() else {
eprintln!("no input devices on this machine");
return Ok(());
};
if outputs.len() < 2 {
eprintln!(
"needs two output devices to show routing; this machine has {}",
outputs.len()
);
return Ok(());
}
let tied_to = common::name_of(&outputs[1]);
println!("tying the input to {tied_to:?}, leaving {:?} alone", common::name_of(&outputs[0]));
let engine = AudioEngine::<f32>::new(
vec![AtomeDevice::input(input.clone(), common::host()).route_to([tied_to.clone()])],
outputs
.iter()
.take(2)
.map(|device| AtomeDevice::output(device.clone(), common::host()))
.collect(),
SampleRate::Hz48k,
vec![2, 2],
Some(512),
vec![],
)?;
common::describe(&engine);
let routes = engine.inputs()[0].routes();
println!("\nroutes to indices {routes:?} — output 0 is not among them");
let mistake = AudioEngine::<f32>::new(
vec![AtomeDevice::input(input.clone(), common::host()).route_to(["Speakers That Are Not Here"])],
vec![AtomeDevice::output(outputs[0].clone(), common::host())],
SampleRate::Hz48k,
vec![2],
Some(512),
vec![],
);
match mistake {
Ok(_) => println!("\n(expected the bad route to be refused, but it was not)"),
Err(error) => println!("\na route to a device that is not there is refused:\n {error}"),
}
common::note_no_audio();
Ok(())
}