Skip to content

Commit

Permalink
Make display processor buffer variable sized
Browse files Browse the repository at this point in the history
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: rust-lang/rust#98931
  • Loading branch information
WalterSmuts committed Jul 7, 2022
1 parent 9f735d5 commit 9fbf549
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 26 deletions.
39 changes: 20 additions & 19 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand All @@ -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) {
Expand Down
14 changes: 7 additions & 7 deletions src/signal_processing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ pub struct FrequencyDomainPitchShifter {
scaling_ratio: f32,
}

pub struct DisplayProcessor {
pub struct DisplayProcessor<const I: usize = BUFFER_SIZE> {
buffer: SegQueue<f32>,
display_buffer: Mutex<Box<[f32]>>,
display_buffer: Mutex<[f32; I]>,
buffer_index: AtomicUsize,
signal_drawer: SignalDrawer,
}
Expand Down Expand Up @@ -138,18 +138,18 @@ where
}
}

impl DisplayProcessor {
impl<const I: usize> DisplayProcessor<I> {
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<const I: usize> StreamProcessor for DisplayProcessor<I> {
fn push_sample(&self, sample: f32) {
self.buffer.push(sample);
}
Expand All @@ -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)
}
Expand Down

0 comments on commit 9fbf549

Please sign in to comment.