Early support for measurements
This commit is contained in:
parent
22a27e4b61
commit
6fdcaa0f5b
51
src/main.rs
51
src/main.rs
@ -2,7 +2,7 @@ use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
|||||||
use cpal::SampleFormat;
|
use cpal::SampleFormat;
|
||||||
|
|
||||||
use egui::epaint::Hsva;
|
use egui::epaint::Hsva;
|
||||||
use egui::Color32;
|
use egui::{Color32, Label, Widget};
|
||||||
use egui_plot::{Legend, Line, Plot};
|
use egui_plot::{Legend, Line, Plot};
|
||||||
|
|
||||||
use std::mem::swap;
|
use std::mem::swap;
|
||||||
@ -105,8 +105,49 @@ struct MyApp {
|
|||||||
ui_selections: MyAppUiSelections,
|
ui_selections: MyAppUiSelections,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Db(f64);
|
||||||
|
|
||||||
|
trait MeasurementValueType {
|
||||||
|
fn label_format(&self) -> String;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Measurement<T: MeasurementValueType> {
|
||||||
|
name: &'static str,
|
||||||
|
values: Vec<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MeasurementValueType for Db {
|
||||||
|
fn label_format(&self) -> String {
|
||||||
|
format!("{:2.2} dB", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: MeasurementValueType> Widget for Measurement<T> {
|
||||||
|
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
|
||||||
|
ui.group(|ui| {
|
||||||
|
ui.label(self.name);
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
for (chan, value) in self.values.iter().enumerate() {
|
||||||
|
ui.colored_label(CHANNEL_COLOURS[chan], value.label_format());
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}).response
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl eframe::App for MyApp {
|
impl eframe::App for MyApp {
|
||||||
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
||||||
|
let measurements = vec![Measurement::<Db> {
|
||||||
|
name: &"RMS",
|
||||||
|
values: self
|
||||||
|
.last_result
|
||||||
|
.fft_analyses
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.map(|x| Db(lin_to_db(x.total_power as f64)))
|
||||||
|
.collect(),
|
||||||
|
}];
|
||||||
egui::SidePanel::left("left_panel").show(ctx, |ui| {
|
egui::SidePanel::left("left_panel").show(ctx, |ui| {
|
||||||
egui::ComboBox::from_label("Source")
|
egui::ComboBox::from_label("Source")
|
||||||
.selected_text(self.audio_devices[self.ui_selections.audio_device].clone())
|
.selected_text(self.audio_devices[self.ui_selections.audio_device].clone())
|
||||||
@ -127,6 +168,11 @@ impl eframe::App for MyApp {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
for meas in measurements {
|
||||||
|
self.meas_box(ui, meas);
|
||||||
|
}
|
||||||
|
});
|
||||||
ui_plot(ui, self.last_result.clone());
|
ui_plot(ui, self.last_result.clone());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -178,6 +224,9 @@ impl MyApp {
|
|||||||
self.fft_progress.store(0, Ordering::Relaxed);
|
self.fft_progress.store(0, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fn meas_box<T: MeasurementValueType>(&mut self, ui: &mut egui::Ui, meas: Measurement<T>) {
|
||||||
|
ui.add(meas);
|
||||||
|
}
|
||||||
fn new(cc: &eframe::CreationContext) -> Self {
|
fn new(cc: &eframe::CreationContext) -> Self {
|
||||||
let host = cpal::default_host();
|
let host = cpal::default_host();
|
||||||
println!("Audio host: {}", host.id().name());
|
println!("Audio host: {}", host.id().name());
|
||||||
|
Loading…
Reference in New Issue
Block a user