From b7c858c1272d8902ad5fdcf5aebbf2c8272881e2 Mon Sep 17 00:00:00 2001 From: mii443 Date: Mon, 12 Feb 2024 01:56:45 +0900 Subject: [PATCH] ASIO --- src/main.rs | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4b3341c..c4d093e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +use std::sync::{Arc, Mutex}; + use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; fn main() { @@ -9,15 +11,45 @@ fn main() { let device = host.devices().unwrap().find(|d| d.name().unwrap() == "Voicemeeter Insert Virtual ASIO").unwrap(); - let stream = device.build_input_stream( + let audio_data = Arc::new(Mutex::new(vec![])); + + let input_stream = device.build_input_stream( &device.default_input_config().unwrap().config(), - move |data: &[f32], _: &_| { - println!("{:?}", data.iter().map(|d| d.clone()).sum::()); + { + let audio_data = audio_data.clone(); + move |data: &[f32], _: &_| { + let audio_data = &mut *audio_data.lock().unwrap(); + *audio_data = data.iter().map(|d| d.clone()).collect::>(); + } }, move |err| eprintln!("error: {}", err), None ).unwrap(); - stream.play().unwrap(); + let output_stream = device.build_output_stream( + &device.default_output_config().unwrap().config(), + { + let audio_data = audio_data.clone(); + let mut count = 0f32; + move |data: &mut [f32], _: &cpal::OutputCallbackInfo| { + let mut audio_data = audio_data.lock().unwrap().clone(); + for frame in audio_data.chunks_mut(22) { + let value = count.sin(); + let value2 = (count / 2.).sin(); + for sample in frame.iter_mut() { + *sample += value * 0.1 + value2 * 0.1; + } + count += 0.05; + } + data.copy_from_slice(&audio_data); + } + }, + move |err| eprintln!("error: {}", err), + None + ).unwrap(); + + input_stream.play().unwrap(); + output_stream.play().unwrap(); + std::thread::sleep(std::time::Duration::from_secs(10)); }