Feat: lissajous

This commit is contained in:
2026-02-23 22:06:09 +01:00
parent 502f7afe8f
commit 8b745a77a6
17 changed files with 241 additions and 49 deletions

View File

@@ -11,6 +11,7 @@ use std::sync::atomic::AtomicU64;
pub struct ScopeBuffer {
pub samples: [AtomicU32; 256],
pub samples_right: [AtomicU32; 256],
peak_left: AtomicU32,
peak_right: AtomicU32,
}
@@ -25,6 +26,7 @@ impl ScopeBuffer {
pub fn new() -> Self {
Self {
samples: std::array::from_fn(|_| AtomicU32::new(0)),
samples_right: std::array::from_fn(|_| AtomicU32::new(0)),
peak_left: AtomicU32::new(0),
peak_right: AtomicU32::new(0),
}
@@ -44,10 +46,14 @@ impl ScopeBuffer {
// Downsample for scope display
let frames = data.len() / 2;
for (i, atom) in self.samples.iter().enumerate() {
for (i, (left_atom, right_atom)) in
self.samples.iter().zip(self.samples_right.iter()).enumerate()
{
let frame_idx = (i * frames) / self.samples.len();
let left = data.get(frame_idx * 2).copied().unwrap_or(0.0);
atom.store(left.to_bits(), Ordering::Relaxed);
let right = data.get(frame_idx * 2 + 1).copied().unwrap_or(0.0);
left_atom.store(left.to_bits(), Ordering::Relaxed);
right_atom.store(right.to_bits(), Ordering::Relaxed);
}
self.peak_left.store(peak_l.to_bits(), Ordering::Relaxed);
@@ -58,6 +64,10 @@ impl ScopeBuffer {
std::array::from_fn(|i| f32::from_bits(self.samples[i].load(Ordering::Relaxed)))
}
pub fn read_right(&self) -> [f32; 256] {
std::array::from_fn(|i| f32::from_bits(self.samples_right[i].load(Ordering::Relaxed)))
}
pub fn peaks(&self) -> (f32, f32) {
let left = f32::from_bits(self.peak_left.load(Ordering::Relaxed));
let right = f32::from_bits(self.peak_right.load(Ordering::Relaxed));