Skip to content

Commit 89604bf

Browse files
refactor: simplify internal invariants and processing paths
Signed-off-by: Maika Namuo <httpworldview@gmail.com>
1 parent ac14379 commit 89604bf

28 files changed

Lines changed: 240 additions & 401 deletions

‎src/meter.rs‎

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -37,35 +37,26 @@ impl DspBatcher {
3737
}
3838
}
3939

40-
fn push(
41-
&mut self,
42-
manager: &mut VisualManager,
43-
mut samples: &[f32],
44-
format: AudioFormat,
45-
) -> usize {
40+
fn push(&mut self, manager: &mut VisualManager, mut samples: &[f32], format: AudioFormat) {
4641
if self.format.is_some_and(|current| current != format) {
4742
self.samples.clear();
4843
}
4944
self.format = Some(format);
5045
let batch = scaled_samples(DSP_BATCH_FRAMES_AT_48K, format);
51-
let mut count = 0;
5246
if !self.samples.is_empty() {
5347
let take = (batch - self.samples.len()).min(samples.len());
5448
self.samples.extend_from_slice(&samples[..take]);
5549
samples = &samples[take..];
5650
if self.samples.len() == batch {
5751
manager.ingest_samples(&self.samples, format);
5852
self.samples.clear();
59-
count += 1;
6053
}
6154
}
6255
let ready = samples.len() / batch * batch;
6356
for chunk in samples[..ready].chunks(scaled_samples(MAX_DSP_INGEST_FRAMES_AT_48K, format)) {
6457
manager.ingest_samples(chunk, format);
65-
count += 1;
6658
}
6759
self.samples.extend_from_slice(&samples[ready..]);
68-
count
6960
}
7061

7162
fn reset(&mut self, manager: &mut VisualManager) {
@@ -214,11 +205,8 @@ mod tests {
214205
let format = format(2, 48_000.0, 1);
215206
let block = [0.25; 64 * 2];
216207
let storage = (batcher.samples.as_ptr(), batcher.samples.capacity());
217-
for index in 0..4 {
218-
assert_eq!(
219-
batcher.push(&mut manager, &block, format),
220-
usize::from(index == 3)
221-
);
208+
for _ in 0..4 {
209+
batcher.push(&mut manager, &block, format);
222210
}
223211
assert!(batcher.samples.is_empty());
224212
assert_eq!(
@@ -230,43 +218,26 @@ mod tests {
230218
sample_rate: 96_000.0,
231219
..format
232220
};
233-
for index in 0..8 {
234-
assert_eq!(
235-
batcher.push(&mut manager, &block, high_rate),
236-
usize::from(index == 7)
237-
);
221+
for _ in 0..8 {
222+
batcher.push(&mut manager, &block, high_rate);
238223
}
239224
assert_eq!(
240225
(batcher.samples.as_ptr(), batcher.samples.capacity()),
241226
storage
242227
);
243228
}
244229

245-
#[test]
246-
fn dsp_batches_coalesce_large_capture_backlogs() {
247-
let mut manager = VisualManager::default();
248-
let mut batcher = DspBatcher::new();
249-
let format = format(2, 48_000.0, 1);
250-
assert_eq!(
251-
batcher.push(&mut manager, &[0.25; (256 * 6 + 17) * 2], format),
252-
2
253-
);
254-
assert_eq!(batcher.samples.len(), 17 * 2);
255-
assert_eq!(batcher.push(&mut manager, &[0.25; 239 * 2], format), 1);
256-
assert!(batcher.samples.is_empty());
257-
}
258-
259230
#[test]
260231
fn dsp_batches_never_mix_format_generations() {
261232
let mut manager = VisualManager::default();
262233
let mut batcher = DspBatcher::new();
263234
let old = format(2, 48_000.0, 1);
264-
assert_eq!(batcher.push(&mut manager, &[0.25; 128 * 2], old), 0);
235+
batcher.push(&mut manager, &[0.25; 128 * 2], old);
265236
let new = AudioFormat {
266237
generation: 2,
267238
..old
268239
};
269-
assert_eq!(batcher.push(&mut manager, &[0.5; 2], new), 0);
240+
batcher.push(&mut manager, &[0.5; 2], new);
270241
assert_eq!(batcher.samples.as_slice(), &[0.5, 0.5]);
271242
assert_eq!(batcher.format, Some(new));
272243
}
@@ -276,10 +247,7 @@ mod tests {
276247
let mut manager = VisualManager::default();
277248
let mut batcher = DspBatcher::new();
278249
let format = format(MAX_CAPTURE_CHANNELS, 192_000.0, 1);
279-
assert_eq!(
280-
batcher.push(&mut manager, &[0.25; 128 * MAX_CAPTURE_CHANNELS], format),
281-
0
282-
);
250+
batcher.push(&mut manager, &[0.25; 128 * MAX_CAPTURE_CHANNELS], format);
283251
let scratch = [0.0; SILENCE_CHUNK_FRAMES * MAX_CAPTURE_CHANNELS];
284252
ingest_silence(
285253
&mut manager,

‎src/persistence/palette.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ impl PaletteSettings {
4848
pub fn if_differs_from(colors: &[Color], defaults: &[Color]) -> Option<Self> {
4949
color_stops_if_differ(colors, defaults).map(|stops| Self {
5050
stops,
51-
stop_positions: None,
52-
stop_spreads: None,
51+
..Default::default()
5352
})
5453
}
5554

@@ -61,7 +60,6 @@ impl PaletteSettings {
6160
spreads: &[f32],
6261
) -> Option<Self> {
6362
let count = defaults.len();
64-
debug_assert_eq!(positions.len(), default_positions.len());
6563
let stops = color_stops_if_differ(colors, defaults);
6664
let positions_differ = positions
6765
.iter()

‎src/persistence/store.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,10 @@ impl SettingsHandle {
148148
pub fn borrow(&self) -> Ref<'_, SettingsManager> {
149149
self.0.borrow()
150150
}
151-
pub fn update<F: FnOnce(&mut SettingsManager) -> R, R>(&self, mutate: F) -> R {
151+
pub fn update(&self, mutate: impl FnOnce(&mut SettingsManager)) {
152152
let mut manager = self.0.borrow_mut();
153-
let result = mutate(&mut manager);
153+
mutate(&mut manager);
154154
schedule_persist(manager.path.clone(), manager.data.clone());
155-
result
156155
}
157156

158157
pub fn flush() {

‎src/ui/app.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ struct UiApp {
116116
use_layershell: bool,
117117
settings_window: Option<(window::Id, ActiveSettings)>,
118118
settings_scroll: ScrollGlow,
119+
// at most one popout exists for each VisualKind
119120
popout_windows: HashMap<window::Id, PopoutWindow>,
120121
exit_warning_until: Option<Instant>,
121122
}

‎src/ui/app/message.rs‎

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -96,39 +96,30 @@ pub(super) fn update(app: &mut UiApp, msg: Message) -> Task<Message> {
9696
ConfigMessage::DecorationsToggled(enabled) => app.recreate_windows(*enabled),
9797
_ => Task::none(),
9898
};
99-
let restore_popout = match &config_msg {
100-
ConfigMessage::VisualToggled {
101-
kind,
102-
enabled: true,
103-
} => Some(*kind),
99+
let toggled = match &config_msg {
100+
ConfigMessage::VisualToggled { kind, enabled } => Some((*kind, *enabled)),
104101
_ => None,
105102
};
106103
let bar_task = app.handle_bar_config_message(&config_msg);
107104
let theme_changed = matches!(&config_msg, ConfigMessage::ThemeChanged(_));
108-
let topology_changed = matches!(&config_msg, ConfigMessage::VisualToggled { .. });
109-
let frame_rate = match &config_msg {
110-
ConfigMessage::VisualFrameRateChanged(rate) => Some(*rate),
111-
_ => None,
112-
};
113-
app.config_page.update(config_msg);
114-
if let Some(rate) = frame_rate {
115-
app.frames.borrow_mut().set_rate(rate);
105+
if let ConfigMessage::VisualFrameRateChanged(rate) = &config_msg {
106+
app.frames.borrow_mut().set_rate(*rate);
116107
}
117-
if topology_changed {
108+
app.config_page.update(config_msg);
109+
let topology_task = toggled.map_or_else(Task::none, |(kind, enabled)| {
118110
let active = app.visuals_active();
119111
app.frames.borrow_mut().set_active(active);
112+
let restore = if enabled {
113+
app.restore_popout_window(kind)
114+
} else {
115+
Task::none()
116+
};
117+
Task::batch([restore, app.sync_all_windows()])
118+
});
119+
if theme_changed && let Some((_, panel)) = app.settings_window.as_mut() {
120+
*panel = super::ActiveSettings::new(panel.kind(), &app.visual_manager);
120121
}
121-
if theme_changed {
122-
app.refresh_settings_panel();
123-
}
124-
let restore_task =
125-
restore_popout.map_or_else(Task::none, |kind| app.restore_popout_window(kind));
126-
let topology_task = if topology_changed {
127-
app.sync_all_windows()
128-
} else {
129-
Task::none()
130-
};
131-
Task::batch([decoration_task, bar_task, restore_task, topology_task])
122+
Task::batch([decoration_task, bar_task, topology_task])
132123
}
133124
Message::Visuals(VisualsMessage::SettingsRequested(kind)) => {
134125
app.open_settings_window(kind, false)

‎src/ui/app/windowing.rs‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,6 @@ impl UiApp {
186186
}
187187
}
188188

189-
pub(super) fn refresh_settings_panel(&mut self) {
190-
let Some((_, panel)) = self.settings_window.as_mut() else {
191-
return;
192-
};
193-
*panel = ActiveSettings::new(panel.kind(), &self.visual_manager);
194-
}
195-
196189
pub(super) fn open_settings_window(
197190
&mut self,
198191
kind: VisualKind,
@@ -505,9 +498,6 @@ impl UiApp {
505498
}
506499

507500
pub(super) fn request_main_output_snapshot(&self) -> Task<Message> {
508-
if !self.main_window_is_layer {
509-
return Task::none();
510-
}
511501
let id = self.main_window_id;
512502
let (sender, receiver) = async_channel::bounded(1);
513503
Task::batch([

‎src/ui/config.rs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,12 @@ impl ConfigPage {
176176
}
177177
ConfigMessage::BgPalette(event) => {
178178
if self.bg_palette.update(event) {
179-
let color = self.bg_palette.colors().first().copied();
179+
let color = self.bg_palette.colors()[0];
180180
self.settings.update(|s| {
181-
s.data.background_color = color.map(Into::into);
182-
s.update_active_theme(|theme| theme.background = color.map(Into::into));
181+
s.data.background_color = Some(color.into());
182+
s.update_active_theme(|theme| theme.background = Some(color.into()));
183183
});
184-
self.window_themes = theme::window_themes(color);
184+
self.window_themes = theme::window_themes(Some(color));
185185
self.refresh_theme_choices_if_needed();
186186
}
187187
}

‎src/ui/settings.rs‎

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ use crate::persistence::settings::{
139139
BUILTIN_THEME, ModuleSettings, PaletteSettings, SettingsConfig, SettingsHandle,
140140
};
141141
use crate::ui::theme::Palette;
142-
use crate::ui::widgets::{SliderRange, palette_editor::PaletteEditor};
142+
use crate::ui::widgets::palette_editor::PaletteEditor;
143143
use crate::visuals::registry::{VisualKind, VisualManagerHandle};
144144
use iced::{Color, Element};
145145

@@ -155,29 +155,19 @@ fn set<T: PartialEq>(target: &mut T, value: T) -> bool {
155155
}
156156

157157
// Compare bits to avoid spurious writes for identical NaN payloads.
158-
fn set_f32(target: &mut f32, value: f32, range: SliderRange) -> bool {
159-
let value = range.snap(value);
158+
fn set_f32(target: &mut f32, value: f32) -> bool {
160159
if target.to_bits() == value.to_bits() {
161160
return false;
162161
}
163162
*target = value;
164163
true
165164
}
166165

167-
fn set_usize(target: &mut usize, value: f32, range: SliderRange) -> bool {
168-
debug_assert!(
169-
[range.min, range.max, range.step]
170-
.into_iter()
171-
.all(|value| value.fract().abs() <= f32::EPSILON),
172-
"set_usize expects integral slider bounds"
173-
);
174-
set(target, range.snap(value).round() as usize)
166+
fn set_usize(target: &mut usize, value: f32) -> bool {
167+
set(target, value.round() as usize)
175168
}
176169

177170
fn get_closest_hop_divisor(fft_size: usize, hop_size: usize) -> usize {
178-
if fft_size == 0 || hop_size == 0 {
179-
return 8;
180-
}
181171
let ratio = fft_size as f32 / hop_size as f32;
182172
HOP_DIVISORS
183173
.into_iter()
@@ -186,7 +176,7 @@ fn get_closest_hop_divisor(fft_size: usize, hop_size: usize) -> usize {
186176
.abs()
187177
.total_cmp(&(ratio - right as f32).abs())
188178
})
189-
.unwrap_or(8)
179+
.unwrap()
190180
}
191181

192182
// Preserve the hop:fft ratio when fft_size changes.
@@ -195,12 +185,12 @@ fn update_fft_size(fft_size: &mut usize, hop_size: &mut usize, new_size: usize)
195185
if !set(fft_size, new_size) {
196186
return false;
197187
}
198-
*hop_size = (new_size / hop_divisor).max(1);
188+
*hop_size = new_size / hop_divisor;
199189
true
200190
}
201191

202192
fn update_hop_divisor(fft_size: usize, hop_size: &mut usize, divisor: usize) -> bool {
203-
set(hop_size, (fft_size / divisor.max(1)).max(1))
193+
set(hop_size, (fft_size / divisor).max(1))
204194
}
205195

206196
settings_modules! {

‎src/ui/settings/oscilloscope.rs‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ impl fmt::Display for TriggerSourceChoice {
4545
}
4646

4747
settings_messages!(pane, settings, value {
48-
SegmentDuration(f32) => set_f32(&mut settings.segment_duration, value, DURATION_RANGE);
49-
Persistence(f32) => set_f32(&mut settings.persistence, value, PERSISTENCE_RANGE);
48+
SegmentDuration(f32) => set_f32(&mut settings.segment_duration, value);
49+
Persistence(f32) => set_f32(&mut settings.persistence, value);
5050
Preset(TriggerPreset) => {
5151
let mode = match value {
5252
TriggerPreset::Stable => TriggerMode::Stable { num_cycles: pane.num_cycles },
@@ -56,9 +56,8 @@ settings_messages!(pane, settings, value {
5656
};
5757
NumCycles(usize) => match settings.trigger_mode {
5858
TriggerMode::Stable { .. } => {
59-
let cycles = value.clamp(CYCLES_RANGE.min as usize, CYCLES_RANGE.max as usize);
60-
pane.num_cycles = cycles;
61-
set(&mut settings.trigger_mode, TriggerMode::Stable { num_cycles: cycles })
59+
pane.num_cycles = value;
60+
set(&mut settings.trigger_mode, TriggerMode::Stable { num_cycles: value })
6261
}
6362
TriggerMode::ZeroCrossing => false,
6463
};

‎src/ui/settings/spectrogram.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ settings_messages!(pane, settings, value {
2525
Window(WindowKind) => set(&mut settings.window, value);
2626
Scale(FrequencyScale) => set(&mut settings.frequency_scale, value);
2727
UseReassignment(bool) => set(&mut settings.use_reassignment, value);
28-
FloorDb(f32) => set_f32(&mut settings.floor_db, value, FLOOR_RANGE);
29-
TiltDb(f32) => set_f32(&mut settings.tilt_db, value, TILT_RANGE);
30-
Rotation(f32) => set(&mut settings.rotation, ROTATION_RANGE.snap(value).round() as i8);
28+
FloorDb(f32) => set_f32(&mut settings.floor_db, value);
29+
TiltDb(f32) => set_f32(&mut settings.tilt_db, value);
30+
Rotation(f32) => set(&mut settings.rotation, value.round() as i8);
3131
ZeroPadding(usize) => set(&mut settings.zero_padding_factor, value);
3232
PianoRoll(PianoRollOverlay) => set(&mut settings.piano_roll_overlay, value);
3333
});

0 commit comments

Comments
 (0)