34 lines
1.0 KiB
Rust
34 lines
1.0 KiB
Rust
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
pub fn play_audio(signal: &[f32]) -> Result<(), Box<dyn std::error::Error>> {
|
|
let host = cpal::default_host();
|
|
let device = host.default_output_device().ok_or("No output device found")?;
|
|
let config = device.default_output_config()?.config();
|
|
|
|
let signal = Arc::new(Mutex::new(signal.to_vec()));
|
|
let singal_clone = Arc::clone(&signal);
|
|
let mut index = 0;
|
|
|
|
let stream = device.build_output_stream(
|
|
&config,
|
|
move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
|
|
let signal = singal_clone.lock().unwrap();
|
|
|
|
for sample in data.iter_mut() {
|
|
*sample = if index < signal.len() {
|
|
signal[index]
|
|
} else {
|
|
0.0
|
|
};
|
|
index += 1;
|
|
}
|
|
},
|
|
|err| eprintln!("Error: {:?}", err),
|
|
None
|
|
)?;
|
|
|
|
stream.play()?;
|
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
|
Ok(())
|
|
} |