use audio_visualizer::dynamic::live_input::{list_input_devs, AudioDevAndCfg};
use audio_visualizer::dynamic::window_top_btm::{open_window_connect_audio, TransformFn};
use cpal::traits::DeviceTrait;
use spectrum_analyzer::scaling::divide_by_N;
use spectrum_analyzer::windows::hann_window;
use spectrum_analyzer::{samples_fft_to_spectrum, FrequencyLimit, FrequencyValue};
use std::cell::RefCell;
use std::cmp::max;
use std::io::{stdin, BufRead};
fn main() {
let visualize_spectrum: RefCell<Vec<(f64, f64)>> = RefCell::new(vec![(0.0, 0.0); 1024]);
let to_spectrum_fn = move |audio: &[f32], sampling_rate| {
let skip_elements = audio.len() - 2048;
let relevant_samples = &audio[skip_elements..skip_elements + 2048];
let hann_window = hann_window(relevant_samples);
let latest_spectrum = samples_fft_to_spectrum(
&hann_window,
sampling_rate as u32,
FrequencyLimit::All,
Some(÷_by_N),
)
.unwrap();
latest_spectrum
.data()
.iter()
.zip(visualize_spectrum.borrow_mut().iter_mut())
.for_each(|((fr_new, fr_val_new), (fr_old, fr_val_old))| {
*fr_old = fr_new.val() as f64;
let old_val = *fr_val_old * 0.84;
let max = max(
*fr_val_new * 5000.0_f32.into(),
FrequencyValue::from(old_val as f32),
);
*fr_val_old = max.val() as f64;
});
visualize_spectrum.borrow().clone()
};
let in_dev = select_input_dev();
open_window_connect_audio(
"Live Spectrum View",
None,
None,
Some(0.0..22050.0),
Some(0.0..500.0),
"x-axis",
"y-axis",
AudioDevAndCfg::new(Some(in_dev), None),
TransformFn::Complex(&to_spectrum_fn),
);
}
fn select_input_dev() -> cpal::Device {
let mut devs = list_input_devs();
assert!(!devs.is_empty(), "no input devices found!");
if devs.len() == 1 {
return devs.remove(0).1;
}
println!();
devs.iter().enumerate().for_each(|(i, (name, dev))| {
println!(
" [{}] {} {:?}",
i,
name,
dev.default_input_config().unwrap()
);
});
let mut input = String::new();
stdin().lock().read_line(&mut input).unwrap();
let index = input[0..1].parse::<usize>().unwrap();
devs.remove(index).1
}