This commit is contained in:
mii443
2024-02-14 19:08:50 +09:00
parent 2f3554e354
commit 11cce7ee17
2 changed files with 47 additions and 13 deletions

View File

@ -1,8 +1,8 @@
use std::io::Read; use std::{io::Read, sync::{Arc, Mutex}};
use cpal::{traits::{DeviceTrait, HostTrait}, Device}; use cpal::{traits::{DeviceTrait, HostTrait, StreamTrait}, Device};
use crate::args::Run; use crate::{args::Run, device::virtual_device};
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);
@ -32,19 +32,19 @@ pub fn run(run: Run) {
let mut virtual_devices = Vec::new(); let mut virtual_devices = Vec::new();
for virtual_device in config.virtual_devices { for virtual_device in config.virtual_devices {
let device = crate::device::virtual_device::VirtualDevice::new(virtual_device.name, virtual_device.channels, virtual_device.sample_rate); let device = crate::device::virtual_device::VirtualDevice::new(virtual_device.name, virtual_device.channels, virtual_device.sample_rate);
virtual_devices.push(device); virtual_devices.push(Arc::new(Mutex::new(device)));
} }
for input_route in config.routes.input { for input_route in &config.routes.input {
println!("Input: {}", input_route.name); println!("Input: {}", input_route.name);
println!(" Virtual device: {}", input_route.virtual_device); println!(" Virtual device: {}", input_route.virtual_device);
if virtual_devices.iter().any(|device| device.name == input_route.virtual_device) { if virtual_devices.iter().any(|device| device.lock().unwrap().name == input_route.virtual_device) {
println!(" Found"); println!(" Found");
} else { } else {
println!(" Not found"); println!(" Not found");
} }
match input_route.device { match &input_route.device {
crate::config::Device::Local { local } => { crate::config::Device::Local { local } => {
println!(" Local device: {}", local.name); println!(" Local device: {}", local.name);
if input_devices if input_devices
@ -66,16 +66,16 @@ pub fn run(run: Run) {
} }
} }
for output_route in config.routes.output { for output_route in &config.routes.output {
println!("Output: {}", output_route.name); println!("Output: {}", output_route.name);
println!(" Virtual device: {}", output_route.input.virtual_device); println!(" Virtual device: {}", output_route.input.virtual_device);
if virtual_devices.iter().any(|device| device.name == output_route.input.virtual_device) { if virtual_devices.iter().any(|device| device.lock().unwrap().name == output_route.input.virtual_device) {
println!(" Found"); println!(" Found");
} else { } else {
println!(" Not found"); println!(" Not found");
} }
match output_route.device { match &output_route.device {
crate::config::Device::Local { local } => { crate::config::Device::Local { local } => {
println!(" Local device: {}", local.name); println!(" Local device: {}", local.name);
if output_devices if output_devices
@ -96,4 +96,38 @@ pub fn run(run: Run) {
} }
} }
} }
// attach real device to virtual device
for input_route in &config.routes.input {
match &input_route.device {
crate::config::Device::Local { local } => {
let device = input_devices
.iter()
.find(|device| device.name().unwrap() == local.name)
.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::<Vec<_>>();
let mut stream = device.build_input_stream(
&config.into(),
{
move |data, _| {
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());
}
}
}
},
move |err| eprintln!("An error occurred on the input stream: {}", err),
None
).unwrap();
stream.play().unwrap();
}
crate::config::Device::Remote { remote } => {
unimplemented!();
}
}
}
} }

View File

@ -3,7 +3,7 @@ pub struct VirtualDevice {
pub channels: u8, pub channels: u8,
pub sample_rate: u32, pub sample_rate: u32,
output_index: Vec<usize>, output_index: Vec<usize>,
output_buffer: Vec<Vec<f64>>, output_buffer: Vec<Vec<f32>>,
} }
impl VirtualDevice { impl VirtualDevice {
@ -27,7 +27,7 @@ impl VirtualDevice {
self.output_index.len() - 1 self.output_index.len() - 1
} }
pub fn take_output(&mut self, index: usize, channel: u8, take_size: usize) -> Option<Vec<f64>> { pub fn take_output(&mut self, index: usize, channel: u8, take_size: usize) -> Option<Vec<f32>> {
let mut buffer = Vec::with_capacity(take_size); let mut buffer = Vec::with_capacity(take_size);
let start = self.output_index[index]; let start = self.output_index[index];
let end = start + take_size; let end = start + take_size;
@ -54,7 +54,7 @@ impl VirtualDevice {
Some(buffer) Some(buffer)
} }
pub fn write_input(&mut self, channel: u8, buffer: Vec<f64>) { pub fn write_input(&mut self, channel: u8, buffer: Vec<f32>) {
self.output_buffer[channel as usize].extend(buffer); self.output_buffer[channel as usize].extend(buffer);
} }
} }