Skip to content

Commit 9fbf549

Browse files
committed
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: rust-lang/rust#98931
1 parent 9f735d5 commit 9fbf549

File tree

2 files changed

+27
-26
lines changed

2 files changed

+27
-26
lines changed

src/main.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,50 +41,51 @@ enum SubCommand {
4141
}
4242

4343
fn passthrough() {
44-
let _streams = hardware::setup_passthrough_processor(DisplayProcessor::new(true));
44+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
45+
let _streams = hardware::setup_passthrough_processor(display_processor);
4546
std::thread::park();
4647
}
4748

4849
fn naive_pitch_shifter() {
50+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
4951
let composed_processor = ComposedProcessor::new(
50-
DisplayProcessor::new(true),
52+
display_processor,
5153
Segmenter::new(NaivePitchShifter::new(1.2)),
5254
);
53-
let composed_processor =
54-
ComposedProcessor::new(composed_processor, DisplayProcessor::new(false));
55+
let display_processor: DisplayProcessor = DisplayProcessor::new(false);
56+
let composed_processor = ComposedProcessor::new(composed_processor, display_processor);
5557
let _streams = hardware::setup_passthrough_processor(composed_processor);
5658
std::thread::park();
5759
}
5860

5961
fn high_pass_filter() {
60-
let composed_processor = ComposedProcessor::new(
61-
DisplayProcessor::new(true),
62-
Segmenter::new(HighPassFilter::new()),
63-
);
62+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
6463
let composed_processor =
65-
ComposedProcessor::new(composed_processor, DisplayProcessor::new(false));
64+
ComposedProcessor::new(display_processor, Segmenter::new(HighPassFilter::new()));
65+
let display_processor: DisplayProcessor = DisplayProcessor::new(false);
66+
let composed_processor = ComposedProcessor::new(composed_processor, display_processor);
6667
let _streams = hardware::setup_passthrough_processor(composed_processor);
6768
std::thread::park();
6869
}
6970

7071
fn low_pass_filter() {
71-
let composed_processor = ComposedProcessor::new(
72-
DisplayProcessor::new(true),
73-
Segmenter::new(LowPassFilter::new()),
74-
);
72+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
7573
let composed_processor =
76-
ComposedProcessor::new(composed_processor, DisplayProcessor::new(false));
74+
ComposedProcessor::new(display_processor, Segmenter::new(LowPassFilter::new()));
75+
let display_processor: DisplayProcessor = DisplayProcessor::new(false);
76+
let composed_processor = ComposedProcessor::new(composed_processor, display_processor);
7777
let _streams = hardware::setup_passthrough_processor(composed_processor);
7878
std::thread::park();
7979
}
8080

8181
fn frequency_domain_pitch_shifter() {
82+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
8283
let composed_processor = ComposedProcessor::new(
83-
DisplayProcessor::new(true),
84+
display_processor,
8485
Segmenter::new(FrequencyDomainPitchShifter::new()),
8586
);
86-
let composed_processor =
87-
ComposedProcessor::new(composed_processor, DisplayProcessor::new(false));
87+
let display_processor: DisplayProcessor = DisplayProcessor::new(false);
88+
let composed_processor = ComposedProcessor::new(composed_processor, display_processor);
8889
let _streams = hardware::setup_passthrough_processor(composed_processor);
8990
std::thread::park();
9091
}
@@ -95,10 +96,10 @@ fn play() {
9596
let barrier = Arc::new(Barrier::new(2));
9697
let barrier_clone = barrier.clone();
9798
let once = std::sync::Once::new();
98-
99+
let display_processor: DisplayProcessor = DisplayProcessor::new(true);
99100
let pitch_halver = ComposedProcessor::new(
100101
Segmenter::new(FrequencyDomainPitchShifter::new()),
101-
DisplayProcessor::new(true),
102+
display_processor,
102103
);
103104

104105
for t in (0..SAMPLE_RATE * 5).map(|x| x as f32 / SAMPLE_RATE as f32) {

src/signal_processing.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ pub struct FrequencyDomainPitchShifter {
4242
scaling_ratio: f32,
4343
}
4444

45-
pub struct DisplayProcessor {
45+
pub struct DisplayProcessor<const I: usize = BUFFER_SIZE> {
4646
buffer: SegQueue<f32>,
47-
display_buffer: Mutex<Box<[f32]>>,
47+
display_buffer: Mutex<[f32; I]>,
4848
buffer_index: AtomicUsize,
4949
signal_drawer: SignalDrawer,
5050
}
@@ -138,18 +138,18 @@ where
138138
}
139139
}
140140

141-
impl DisplayProcessor {
141+
impl<const I: usize> DisplayProcessor<I> {
142142
pub fn new(should_clear_screen: bool) -> Self {
143143
Self {
144144
buffer: SegQueue::new(),
145-
display_buffer: Mutex::new(Box::new([0.0; BUFFER_SIZE])),
145+
display_buffer: Mutex::new([0.0; I]),
146146
buffer_index: AtomicUsize::new(0),
147147
signal_drawer: SignalDrawer::new(should_clear_screen),
148148
}
149149
}
150150
}
151151

152-
impl StreamProcessor for DisplayProcessor {
152+
impl<const I: usize> StreamProcessor for DisplayProcessor<I> {
153153
fn push_sample(&self, sample: f32) {
154154
self.buffer.push(sample);
155155
}
@@ -159,9 +159,9 @@ impl StreamProcessor for DisplayProcessor {
159159
let mut buffer = self.display_buffer.lock().unwrap();
160160
buffer[self.buffer_index.load(Ordering::Relaxed)] = sample;
161161
self.buffer_index.fetch_add(1, Ordering::Relaxed);
162-
if self.buffer_index.load(Ordering::Relaxed) >= BUFFER_SIZE {
162+
if self.buffer_index.load(Ordering::Relaxed) >= I {
163163
self.buffer_index.swap(0, Ordering::Relaxed);
164-
self.signal_drawer.draw_data(&buffer);
164+
self.signal_drawer.draw_data(&*buffer);
165165
}
166166
Some(sample)
167167
}

0 commit comments

Comments
 (0)