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)?;
if inputs.is_empty() || outputs.len() < 2 {
eprintln!(
"needs one input and two outputs; this machine has {} and {}",
inputs.len(),
outputs.len()
);
return Ok(());
}
let first_output = common::name_of(&outputs[0]);
let channels = vec![2u16, 5];
println!("output channel counts: {channels:?}");
let engine = AudioEngine::<f32>::new(
vec![
AtomeDevice::input(inputs[0].clone(), common::host()),
AtomeDevice::input(
inputs.get(1).unwrap_or(&inputs[0]).clone(),
common::host(),
)
.route_to([first_output.clone()]),
],
outputs
.iter()
.take(2)
.map(|device| AtomeDevice::output(device.clone(), common::host()))
.collect(),
SampleRate::Hz48k,
channels,
Some(512),
vec![],
)?;
common::describe(&engine);
println!("\ninput 0 routes to {:?} (all of them)", engine.inputs()[0].routes());
println!("input 1 routes to {:?} (only {first_output:?})", engine.inputs()[1].routes());
let mismatch = AudioEngine::<f32>::new(
vec![],
outputs
.iter()
.take(2)
.map(|device| AtomeDevice::output(device.clone(), common::host()))
.collect(),
SampleRate::Hz48k,
vec![2],
Some(512),
vec![],
);
match mismatch {
Ok(_) => println!("\n(expected the short channel list to be refused, but it was not)"),
Err(error) => println!("\ntwo outputs and one channel count is refused:\n {error}"),
}
common::note_no_audio();
Ok(())
}