From 2ef9628ab8e9a13a97fcd047c501745e73d270a5 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Sat, 10 May 2025 21:44:27 +0300 Subject: [PATCH] device: add RMSMeter --- crates/device/Cargo.toml | 3 ++- crates/device/src/meter.rs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 crates/device/src/meter.rs diff --git a/crates/device/Cargo.toml b/crates/device/Cargo.toml index aacae057..0f8b2230 100644 --- a/crates/device/Cargo.toml +++ b/crates/device/Cargo.toml @@ -19,8 +19,9 @@ winit = { workspace = true, optional = true } default = [ "clock", "editor", "sequencer", "sampler", "lv2" ] clock = [] editor = [] +meter = [] sequencer = [ "clock", "uuid" ] -sampler = [ "symphonia", "wavers" ] +sampler = [ "meter", "symphonia", "wavers" ] lv2 = [ "livi", "winit" ] vst2 = [] vst3 = [] diff --git a/crates/device/src/meter.rs b/crates/device/src/meter.rs new file mode 100644 index 00000000..74dba443 --- /dev/null +++ b/crates/device/src/meter.rs @@ -0,0 +1,16 @@ +use crate::*; + +#[derive(Debug, Default, Clone)] +pub struct RMSMeter(f32); + +impl RMSMeter { + pub fn set (&mut self, samples: &[u32]) { + let sum: usize = samples.iter().map(|s|*s as usize).reduce(|sum, sample|sum + sample) + .unwrap_or(0); + self.0 = (sum as f32 / samples.len() as f32).sqrt(); + } +} + +render!(TuiOut: |self: RMSMeter, to| { + let [x, y, w, h] = to.area(); +});