mirror of
https://github.com/mii443/maudio-router.git
synced 2025-08-23 00:15:37 +00:00
add config parser
This commit is contained in:
95
src/main.rs
95
src/main.rs
@ -1,95 +1,20 @@
|
||||
mod args;
|
||||
|
||||
use std::{io::Write, sync::{Arc, Mutex}};
|
||||
mod config;
|
||||
mod commands;
|
||||
|
||||
use clap::Parser;
|
||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||
|
||||
use crate::args::Cli;
|
||||
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
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let cli = Cli::parse();
|
||||
|
||||
println!("{:?}", cli);
|
||||
|
||||
let host = cpal::default_host();
|
||||
|
||||
std::thread::sleep(std::time::Duration::from_secs(1));
|
||||
|
||||
println!("Available input devices:");
|
||||
host.input_devices().unwrap().enumerate().for_each(|(i, device)| println!("{}: {}", i, device.name().unwrap()));
|
||||
|
||||
print!("Select input device [0~{}]> ", host.input_devices().unwrap().count() - 1);
|
||||
std::io::stdout().flush().unwrap();
|
||||
|
||||
let mut input = String::new();
|
||||
std::io::stdin().read_line(&mut input).unwrap();
|
||||
let input = input.trim().parse::<usize>().unwrap();
|
||||
|
||||
let device = host.input_devices().unwrap().nth(input).unwrap();
|
||||
|
||||
let audio_data = Arc::new(Mutex::new(vec![]));
|
||||
|
||||
let input_stream = device.build_input_stream(
|
||||
&device.default_input_config().unwrap().config(),
|
||||
{
|
||||
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::<Vec<f32>>();
|
||||
}
|
||||
},
|
||||
move |err| eprintln!("error: {}", err),
|
||||
None
|
||||
).unwrap();
|
||||
|
||||
let output_stream = device.build_output_stream(
|
||||
&device.default_output_config().unwrap().config(),
|
||||
{
|
||||
let audio_data = audio_data.clone();
|
||||
move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
|
||||
let audio_data = audio_data.lock().unwrap().clone();
|
||||
let audio_data = reshape_audio_data(&audio_data, 22);
|
||||
|
||||
let audio_data = to_flat_audio_data(&audio_data);
|
||||
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(1000));
|
||||
drop(input_stream);
|
||||
drop(output_stream);
|
||||
match cli.command {
|
||||
args::Commands::Run(run) => {
|
||||
commands::run::run(run);
|
||||
}
|
||||
args::Commands::Device(device) => {
|
||||
commands::device::device(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user