Add FFT progress bar
This commit is contained in:
parent
6d105b11d9
commit
22a27e4b61
@ -203,6 +203,9 @@ impl FftAnalyzer {
|
||||
let mut lock = self.last_analysis.lock().unwrap();
|
||||
*lock = result;
|
||||
}
|
||||
fn progress(&self) -> f32 {
|
||||
self.audio_buf.lock().unwrap().read_since_last_update as f32 / self.fft_length as f32
|
||||
}
|
||||
}
|
||||
|
||||
impl Analyzer for FftAnalyzer {
|
||||
|
33
src/main.rs
33
src/main.rs
@ -6,6 +6,7 @@ use egui::Color32;
|
||||
use egui_plot::{Legend, Line, Plot};
|
||||
|
||||
use std::mem::swap;
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::mpsc::{channel, Receiver, Sender};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread::{self, JoinHandle};
|
||||
@ -90,6 +91,7 @@ struct MyApp {
|
||||
fft_thread: JoinHandle<()>,
|
||||
fft_close_channel: Sender<()>,
|
||||
fft_length: usize,
|
||||
fft_progress: Arc<AtomicUsize>,
|
||||
|
||||
audio_device: cpal::Device,
|
||||
audio_config: cpal::StreamConfig,
|
||||
@ -118,6 +120,11 @@ impl eframe::App for MyApp {
|
||||
});
|
||||
self.sample_rate_box(ui);
|
||||
self.fft_length_box(ui);
|
||||
|
||||
ui.separator();
|
||||
ui.with_layout(egui::Layout::bottom_up(egui::Align::Center), |ui| {
|
||||
self.fft_progress(ui)
|
||||
});
|
||||
});
|
||||
egui::CentralPanel::default().show(ctx, |ui| {
|
||||
ui_plot(ui, self.last_result.clone());
|
||||
@ -163,6 +170,14 @@ impl MyApp {
|
||||
self.set_fft_length(FFT_LENGTHS[self.ui_selections.fft_length]);
|
||||
}
|
||||
}
|
||||
fn fft_progress(&mut self, ui: &mut egui::Ui) {
|
||||
let percent = self.fft_progress.load(Ordering::Relaxed) as f32 / self.fft_length as f32;
|
||||
let fft_progress = egui::ProgressBar::new(percent);
|
||||
ui.add(fft_progress);
|
||||
if percent >= 1.0 {
|
||||
self.fft_progress.store(0, Ordering::Relaxed);
|
||||
}
|
||||
}
|
||||
fn new(cc: &eframe::CreationContext) -> Self {
|
||||
let host = cpal::default_host();
|
||||
println!("Audio host: {}", host.id().name());
|
||||
@ -223,6 +238,7 @@ impl MyApp {
|
||||
})
|
||||
.unwrap(),
|
||||
fft_length: FFT_LENGTHS[DEFAULT_FFT_LENGTH],
|
||||
fft_progress: Arc::new(AtomicUsize::new(0)),
|
||||
fft_close_channel: fft_close_channel.0,
|
||||
ui_selections: MyAppUiSelections {
|
||||
audio_device: device_names
|
||||
@ -295,12 +311,15 @@ impl MyApp {
|
||||
);
|
||||
|
||||
let new_channel = self.sample_channel.clone();
|
||||
let fft_progress_ref = self.fft_progress.clone();
|
||||
|
||||
self.audio_stream = Some(
|
||||
self.audio_device
|
||||
.build_input_stream(
|
||||
&self.audio_config,
|
||||
move |data, _| handle_audio_frame(data, new_channel.clone()),
|
||||
move |data, _| {
|
||||
handle_audio_frame(data, new_channel.clone(), fft_progress_ref.clone())
|
||||
},
|
||||
move |err| panic!("{:?}", err),
|
||||
Some(std::time::Duration::from_secs(1)),
|
||||
)
|
||||
@ -405,10 +424,18 @@ fn fft_thread_impl(
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_audio_frame(data: &[SampleType], chan: Sender<Vec<SampleType>>) {
|
||||
fn handle_audio_frame(
|
||||
data: &[SampleType],
|
||||
chan: Sender<Vec<SampleType>>,
|
||||
fft_progress: Arc<AtomicUsize>,
|
||||
) {
|
||||
// Copy and send to processor thread
|
||||
// FIXME: Fails at fft lengths > 16384. Are we too slow collecting data?
|
||||
chan.send(data.to_vec()).unwrap_or_default()
|
||||
chan.send(data.to_vec()).unwrap_or_default();
|
||||
fft_progress.store(
|
||||
fft_progress.load(Ordering::Relaxed) + data.len(),
|
||||
Ordering::Relaxed,
|
||||
);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
Loading…
Reference in New Issue
Block a user