add config parser

This commit is contained in:
mii443
2024-02-13 15:01:50 +09:00
parent 56df294787
commit d8a7638775
8 changed files with 173 additions and 103 deletions

View File

@ -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);
}
}
}