Feat: lissajous
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user