From 3860a9caf53c773f8694859f0c8eeb2188189ebf Mon Sep 17 00:00:00 2001 From: mii443 Date: Wed, 14 Feb 2024 20:15:14 +0900 Subject: [PATCH] fix stream scope --- local_test.yaml | 2 +- src/commands/run.rs | 44 +++++++++++++++++++++++++++++------- src/device/virtual_device.rs | 2 +- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/local_test.yaml b/local_test.yaml index 843db8a..f845f2b 100644 --- a/local_test.yaml +++ b/local_test.yaml @@ -8,7 +8,7 @@ routes: virtual_device: "mic" device: local: - name: "VoiceMeeter Aux Output (VB-Audio VoiceMeeter AUX VAIO)" + name: "マイク (Logi C270 HD WebCam)" output: - name: "Speaker" input: diff --git a/src/commands/run.rs b/src/commands/run.rs index 7106109..aacc5fc 100644 --- a/src/commands/run.rs +++ b/src/commands/run.rs @@ -4,6 +4,34 @@ use cpal::{traits::{DeviceTrait, HostTrait, StreamTrait}, Device}; use crate::{args::Run, device::virtual_device}; +fn reshape_audio_data(input: &[T], channels: usize) -> Vec> +where + T: Clone, +{ + let mut output = vec![vec![]; channels]; + for frame in input.chunks(channels) { + for (i, sample) in frame.iter().enumerate() { + output[i].push(sample.clone()); + } + } + output +} + +fn to_flat_audio_data(input: &[Vec]) -> Vec +where + T: Clone, +{ + let channels = input.len(); + let frames = input[0].len(); + let mut output = vec![]; + for i in 0..frames { + for j in 0..channels { + output.push(input[j][i].clone()); + } + } + output +} + pub fn run(run: Run) { let config = std::path::Path::new(&run.config); @@ -97,6 +125,8 @@ pub fn run(run: Run) { } } + let mut streams = vec![]; + // attach real device to virtual device for input_route in &config.routes.input { match &input_route.device { @@ -107,25 +137,23 @@ pub fn run(run: Run) { .unwrap(); let config = device.default_input_config().unwrap(); let channels = config.channels(); - let virtual_devices = virtual_devices.iter().filter(|device| device.lock().unwrap().name == input_route.virtual_device).map(|d| d.clone()).collect::>(); + let virtual_devices = virtual_devices.iter().filter(|device| device.lock().unwrap().name == input_route.virtual_device).map(|d| d.clone()).collect::>()[0].clone(); let stream = device.build_input_stream( &config.into(), { move |data, _| { - println!("Reading input stream"); - for (i, buffer) in data.chunks(channels as usize).enumerate() { - let buffer = buffer.to_vec(); - for virtual_device in &virtual_devices { - virtual_device.lock().unwrap().write_input(i as u8, buffer.clone()); - } + let audio_data = reshape_audio_data(&data, channels as usize); + + for (i, buffer) in audio_data.iter().enumerate() { + virtual_devices.lock().unwrap().write_input(i as u8, buffer.clone()); } } }, move |err| eprintln!("An error occurred on the input stream: {}", err), None ).unwrap(); - println!("Playing input stream"); stream.play().unwrap(); + streams.push(stream); } crate::config::Device::Remote { remote } => { unimplemented!(); diff --git a/src/device/virtual_device.rs b/src/device/virtual_device.rs index a306e2d..4c4057f 100644 --- a/src/device/virtual_device.rs +++ b/src/device/virtual_device.rs @@ -56,7 +56,7 @@ impl VirtualDevice { } pub fn write_input(&mut self, channel: u8, buffer: Vec) { - println!("Writing input to virtual device: {} {:?}", self.name, buffer); + println!("Buffer size: {}", self.output_buffer[channel as usize].len()); self.output_buffer[channel as usize].extend(buffer); } } \ No newline at end of file