mirror of
https://github.com/mii443/maudio-router.git
synced 2025-08-22 16:05:35 +00:00
fix stream scope
This commit is contained in:
@ -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:
|
||||||
|
@ -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!();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user