From 9fbf549eb3cf36d9cbc39fce73a5d2121f26b0f4 Mon Sep 17 00:00:00 2001 From: Walter Smuts Date: Fri, 1 Jul 2022 16:54:39 +0530 Subject: [PATCH] Make display processor buffer variable sized Use const generics to make the display processor buffer defined by user. Unfortunately the default const type inference makes working with this clunky. See issue: https://github.com/rust-lang/rust/issues/98931 --- src/main.rs | 39 ++++++++++++++++++++------------------- src/signal_processing.rs | 14 +++++++------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2656050..df2977a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,50 +41,51 @@ enum SubCommand { } fn passthrough() { - let _streams = hardware::setup_passthrough_processor(DisplayProcessor::new(true)); + let display_processor: DisplayProcessor = DisplayProcessor::new(true); + let _streams = hardware::setup_passthrough_processor(display_processor); std::thread::park(); } fn naive_pitch_shifter() { + let display_processor: DisplayProcessor = DisplayProcessor::new(true); let composed_processor = ComposedProcessor::new( - DisplayProcessor::new(true), + display_processor, Segmenter::new(NaivePitchShifter::new(1.2)), ); - let composed_processor = - ComposedProcessor::new(composed_processor, DisplayProcessor::new(false)); + let display_processor: DisplayProcessor = DisplayProcessor::new(false); + let composed_processor = ComposedProcessor::new(composed_processor, display_processor); let _streams = hardware::setup_passthrough_processor(composed_processor); std::thread::park(); } fn high_pass_filter() { - let composed_processor = ComposedProcessor::new( - DisplayProcessor::new(true), - Segmenter::new(HighPassFilter::new()), - ); + let display_processor: DisplayProcessor = DisplayProcessor::new(true); let composed_processor = - ComposedProcessor::new(composed_processor, DisplayProcessor::new(false)); + ComposedProcessor::new(display_processor, Segmenter::new(HighPassFilter::new())); + let display_processor: DisplayProcessor = DisplayProcessor::new(false); + let composed_processor = ComposedProcessor::new(composed_processor, display_processor); let _streams = hardware::setup_passthrough_processor(composed_processor); std::thread::park(); } fn low_pass_filter() { - let composed_processor = ComposedProcessor::new( - DisplayProcessor::new(true), - Segmenter::new(LowPassFilter::new()), - ); + let display_processor: DisplayProcessor = DisplayProcessor::new(true); let composed_processor = - ComposedProcessor::new(composed_processor, DisplayProcessor::new(false)); + ComposedProcessor::new(display_processor, Segmenter::new(LowPassFilter::new())); + let display_processor: DisplayProcessor = DisplayProcessor::new(false); + let composed_processor = ComposedProcessor::new(composed_processor, display_processor); let _streams = hardware::setup_passthrough_processor(composed_processor); std::thread::park(); } fn frequency_domain_pitch_shifter() { + let display_processor: DisplayProcessor = DisplayProcessor::new(true); let composed_processor = ComposedProcessor::new( - DisplayProcessor::new(true), + display_processor, Segmenter::new(FrequencyDomainPitchShifter::new()), ); - let composed_processor = - ComposedProcessor::new(composed_processor, DisplayProcessor::new(false)); + let display_processor: DisplayProcessor = DisplayProcessor::new(false); + let composed_processor = ComposedProcessor::new(composed_processor, display_processor); let _streams = hardware::setup_passthrough_processor(composed_processor); std::thread::park(); } @@ -95,10 +96,10 @@ fn play() { let barrier = Arc::new(Barrier::new(2)); let barrier_clone = barrier.clone(); let once = std::sync::Once::new(); - + let display_processor: DisplayProcessor = DisplayProcessor::new(true); let pitch_halver = ComposedProcessor::new( Segmenter::new(FrequencyDomainPitchShifter::new()), - DisplayProcessor::new(true), + display_processor, ); for t in (0..SAMPLE_RATE * 5).map(|x| x as f32 / SAMPLE_RATE as f32) { diff --git a/src/signal_processing.rs b/src/signal_processing.rs index efd75e4..98f3d22 100644 --- a/src/signal_processing.rs +++ b/src/signal_processing.rs @@ -42,9 +42,9 @@ pub struct FrequencyDomainPitchShifter { scaling_ratio: f32, } -pub struct DisplayProcessor { +pub struct DisplayProcessor { buffer: SegQueue, - display_buffer: Mutex>, + display_buffer: Mutex<[f32; I]>, buffer_index: AtomicUsize, signal_drawer: SignalDrawer, } @@ -138,18 +138,18 @@ where } } -impl DisplayProcessor { +impl DisplayProcessor { pub fn new(should_clear_screen: bool) -> Self { Self { buffer: SegQueue::new(), - display_buffer: Mutex::new(Box::new([0.0; BUFFER_SIZE])), + display_buffer: Mutex::new([0.0; I]), buffer_index: AtomicUsize::new(0), signal_drawer: SignalDrawer::new(should_clear_screen), } } } -impl StreamProcessor for DisplayProcessor { +impl StreamProcessor for DisplayProcessor { fn push_sample(&self, sample: f32) { self.buffer.push(sample); } @@ -159,9 +159,9 @@ impl StreamProcessor for DisplayProcessor { let mut buffer = self.display_buffer.lock().unwrap(); buffer[self.buffer_index.load(Ordering::Relaxed)] = sample; self.buffer_index.fetch_add(1, Ordering::Relaxed); - if self.buffer_index.load(Ordering::Relaxed) >= BUFFER_SIZE { + if self.buffer_index.load(Ordering::Relaxed) >= I { self.buffer_index.swap(0, Ordering::Relaxed); - self.signal_drawer.draw_data(&buffer); + self.signal_drawer.draw_data(&*buffer); } Some(sample) }