mod common;
use common::audio::{self, AudioConfig};
use laser_dac::{
list_devices, open_device, ChunkRequest, ChunkResult, LaserPoint, Result, StreamConfig,
};
fn main() -> Result<()> {
env_logger::init();
if !audio::ensure_audio_initialized() {
eprintln!("Failed to initialize audio capture. Make sure you have a microphone connected.");
return Ok(());
}
println!("Scanning for DACs...\n");
let devices = list_devices()?;
if devices.is_empty() {
println!("No DACs found.");
return Ok(());
}
let device_info = &devices[0];
println!(" Found: {} ({})", device_info.name, device_info.kind);
let device = open_device(&device_info.id)?;
let config = StreamConfig::new(30_000);
let (stream, info) = device.start_stream(config)?;
println!(
"\nStreaming audio to {}... Press Ctrl+C to stop\n",
info.name
);
stream.control().arm()?;
let control = stream.control().clone();
ctrlc::set_handler(move || {
let _ = control.stop();
})
.expect("failed to set Ctrl+C handler");
let audio_config = AudioConfig::default();
let exit = stream.run(
move |req: &ChunkRequest, buffer: &mut [LaserPoint]| {
let n = req.target_points.min(buffer.len());
audio::fill_audio_points(req, buffer, n, &audio_config);
ChunkResult::Filled(n)
},
|err| {
eprintln!("Stream error: {}", err);
},
)?;
println!("\nStream ended: {:?}", exit);
Ok(())
}