fix stream scope

This commit is contained in:
mii443
2024-02-14 20:15:14 +09:00
parent d25b8c515b
commit 3860a9caf5
3 changed files with 38 additions and 10 deletions

View File

@ -8,7 +8,7 @@ routes:
virtual_device: "mic" virtual_device: "mic"
device: device:
local: local:
name: "VoiceMeeter Aux Output (VB-Audio VoiceMeeter AUX VAIO)" name: "マイク (Logi C270 HD WebCam)"
output: output:
- name: "Speaker" - name: "Speaker"
input: input:

View File

@ -4,6 +4,34 @@ use cpal::{traits::{DeviceTrait, HostTrait, StreamTrait}, Device};
use crate::{args::Run, device::virtual_device}; use crate::{args::Run, device::virtual_device};
fn reshape_audio_data<T>(input: &[T], channels: usize) -> Vec<Vec<T>>
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<T>(input: &[Vec<T>]) -> Vec<T>
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) { pub fn run(run: Run) {
let config = std::path::Path::new(&run.config); 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 // attach real device to virtual device
for input_route in &config.routes.input { for input_route in &config.routes.input {
match &input_route.device { match &input_route.device {
@ -107,25 +137,23 @@ pub fn run(run: Run) {
.unwrap(); .unwrap();
let config = device.default_input_config().unwrap(); let config = device.default_input_config().unwrap();
let channels = config.channels(); 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::<Vec<_>>(); let virtual_devices = virtual_devices.iter().filter(|device| device.lock().unwrap().name == input_route.virtual_device).map(|d| d.clone()).collect::<Vec<_>>()[0].clone();
let stream = device.build_input_stream( let stream = device.build_input_stream(
&config.into(), &config.into(),
{ {
move |data, _| { move |data, _| {
println!("Reading input stream"); let audio_data = reshape_audio_data(&data, channels as usize);
for (i, buffer) in data.chunks(channels as usize).enumerate() {
let buffer = buffer.to_vec(); for (i, buffer) in audio_data.iter().enumerate() {
for virtual_device in &virtual_devices { virtual_devices.lock().unwrap().write_input(i as u8, buffer.clone());
virtual_device.lock().unwrap().write_input(i as u8, buffer.clone());
}
} }
} }
}, },
move |err| eprintln!("An error occurred on the input stream: {}", err), move |err| eprintln!("An error occurred on the input stream: {}", err),
None None
).unwrap(); ).unwrap();
println!("Playing input stream");
stream.play().unwrap(); stream.play().unwrap();
streams.push(stream);
} }
crate::config::Device::Remote { remote } => { crate::config::Device::Remote { remote } => {
unimplemented!(); unimplemented!();

View File

@ -56,7 +56,7 @@ impl VirtualDevice {
} }
pub fn write_input(&mut self, channel: u8, buffer: Vec<f32>) { pub fn write_input(&mut self, channel: u8, buffer: Vec<f32>) {
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); self.output_buffer[channel as usize].extend(buffer);
} }
} }