Skip to content

Commit ad964f1

Browse files
refactor: various cleanups
Signed-off-by: Maika Namuo <httpworldview@gmail.com>
1 parent d8b2410 commit ad964f1

10 files changed

Lines changed: 136 additions & 224 deletions

File tree

‎src/meter.rs‎

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,23 @@ impl DspBatcher {
6262
self.samples.extend_from_slice(&samples[ready..]);
6363
}
6464

65+
fn push_silence(&mut self, manager: &mut VisualManager, frames: u64, format: AudioFormat) {
66+
let limit = (MAX_SILENCE_SECONDS as f64 * f64::from(format.sample_rate))
67+
.round()
68+
.max(1.0) as u64;
69+
if frames > limit {
70+
self.reset(manager);
71+
return;
72+
}
73+
let capacity = SILENCE.len() / format.channels;
74+
let mut remaining = frames;
75+
while remaining > 0 {
76+
let chunk = remaining.min(capacity as u64) as usize;
77+
self.push(manager, &SILENCE[..chunk * format.channels], format);
78+
remaining -= chunk as u64;
79+
}
80+
}
81+
6582
fn reset(&mut self, manager: &mut VisualManager) {
6683
self.clear();
6784
manager.reset_audio();
@@ -108,7 +125,7 @@ impl MeterEngine {
108125
batcher.push(&mut manager, samples, format);
109126
}
110127
CapturedSpan::Silence { frames, format } => {
111-
ingest_silence(&mut manager, batcher, frames, format);
128+
batcher.push_silence(&mut manager, frames, format);
112129
}
113130
CapturedSpan::Reset => batcher.reset(&mut manager),
114131
});
@@ -150,28 +167,6 @@ impl MeterEngine {
150167
}
151168
}
152169

153-
fn ingest_silence(
154-
manager: &mut VisualManager,
155-
batcher: &mut DspBatcher,
156-
frames: u64,
157-
format: AudioFormat,
158-
) {
159-
let limit = (MAX_SILENCE_SECONDS as f64 * f64::from(format.sample_rate))
160-
.round()
161-
.max(1.0) as u64;
162-
if frames > limit {
163-
batcher.reset(manager);
164-
return;
165-
}
166-
let capacity = SILENCE.len() / format.channels;
167-
let mut remaining = frames;
168-
while remaining > 0 {
169-
let chunk = remaining.min(capacity as u64) as usize;
170-
batcher.push(manager, &SILENCE[..chunk * format.channels], format);
171-
remaining -= chunk as u64;
172-
}
173-
}
174-
175170
#[cfg(test)]
176171
mod tests {
177172
use super::*;
@@ -283,7 +278,7 @@ mod tests {
283278
let mut reference = LoudnessProcessor::new(Default::default());
284279
reference.process_block(&AudioBlock::new(&signal, 1, 48_000.0));
285280
batcher.push(&mut manager, &[0.0], format);
286-
ingest_silence(&mut manager, &mut batcher, frames, format);
281+
batcher.push_silence(&mut manager, frames, format);
287282
let expected = if frames > 192_000 {
288283
assert!(batcher.samples.is_empty());
289284
reset_level

‎src/util/color.rs‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,13 @@ pub fn sanitize_stop_positions(raw: Option<&[f32]>, defaults: &[f32]) -> Vec<f32
149149
}
150150

151151
pub fn sanitize_stop_spreads(raw: Option<&[f32]>, count: usize) -> Vec<f32> {
152-
let mut out = vec![1.0; count];
153-
let Some(raw) = raw.filter(|raw| raw.len() == count) else {
154-
return out;
155-
};
156-
for (dst, &value) in out.iter_mut().zip(raw.iter()) {
157-
*dst = finite_or(value, 1.0).clamp(STOP_SPREAD_MIN, STOP_SPREAD_MAX);
152+
match raw.filter(|raw| raw.len() == count) {
153+
Some(raw) => raw
154+
.iter()
155+
.map(|&value| finite_or(value, 1.0).clamp(STOP_SPREAD_MIN, STOP_SPREAD_MAX))
156+
.collect(),
157+
None => vec![1.0; count],
158158
}
159-
out
160159
}
161160

162161
#[cfg(test)]

‎src/visuals/loudness/render.rs‎

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ impl LoudnessParams {
106106
let y1 = bounds.y + bounds.height;
107107
let height = y1 - y0;
108108
let y_of = |db| (y1 - height * db_to_ratio(db)).clamp(y0, y1);
109+
let hline =
110+
|x0, x1, y, width, color| line_instance((x0, y), (x1, y), color, color, width, clip);
109111
let bars = self.bar_groups();
110112
let bar_count = bars.len();
111113
let vertices = &mut scratch.instances;
@@ -140,14 +142,8 @@ impl LoudnessParams {
140142
let ceiling = ceiling.clamp(DB_RANGE.0, DB_RANGE.1);
141143
let upper = value.min(ceiling);
142144
if upper > lower {
143-
vertices.push(quad_instance(
144-
sx0,
145-
y_of(upper),
146-
sx1,
147-
y_of(lower),
148-
clip,
149-
color,
150-
));
145+
let (top, bottom) = (y_of(upper), y_of(lower));
146+
vertices.push(quad_instance(sx0, top, sx1, bottom, clip, color));
151147
}
152148
lower = lower.max(ceiling);
153149
if value <= ceiling {
@@ -156,44 +152,22 @@ impl LoudnessParams {
156152
}
157153

158154
if let Some((db, color)) = fill.peak {
159-
let cy = y_of(db);
160-
vertices.push(line_instance(
161-
(sx0, cy),
162-
(sx1, cy),
163-
color,
164-
color,
165-
PEAK_THICKNESS,
166-
clip,
167-
));
155+
vertices.push(hline(sx0, sx1, y_of(db), PEAK_THICKNESS, color));
168156
}
169157
}
170158
}
171159

172-
let guide_anchor = meter_x - GUIDE_PADDING;
160+
let guide = self.guide_color;
161+
let guide_x1 = meter_x - GUIDE_PADDING;
173162
for db in GUIDE_LEVELS {
174-
let cy = y_of(db);
175-
vertices.push(line_instance(
176-
(guide_anchor - GUIDE_LENGTH, cy),
177-
(guide_anchor, cy),
178-
self.guide_color,
179-
self.guide_color,
180-
GUIDE_THICKNESS,
181-
clip,
182-
));
163+
let x0 = guide_x1 - GUIDE_LENGTH;
164+
vertices.push(hline(x0, guide_x1, y_of(db), GUIDE_THICKNESS, guide));
183165
}
184166

185167
let cy = y_of(0.0);
186168
for i in 0..bar_count {
187169
let x0 = meter_x + i as f32 * stride;
188-
let x1 = x0 + bar_width;
189-
vertices.push(line_instance(
190-
(x0, cy),
191-
(x1, cy),
192-
self.guide_color,
193-
self.guide_color,
194-
THRESHOLD_THICKNESS,
195-
clip,
196-
));
170+
vertices.push(hline(x0, x0 + bar_width, cy, THRESHOLD_THICKNESS, guide));
197171
}
198172
}
199173
}

‎src/visuals/loudness/state.rs‎

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,12 @@ impl LoudnessState {
145145
}
146146

147147
fn visual_params(&self, bounds: Rectangle) -> LoudnessParams {
148-
let values = self.visible_values();
148+
let meters = self.visible_meters();
149149
LoudnessParams {
150150
geometry: self.geometry,
151151
bounds,
152152
bg_color: color_to_rgba(self.palette[PAL_BACKGROUND]),
153-
bars: [
154-
self.meter_fill(0, self.settings.left_mode, values[0]),
155-
self.meter_fill(1, self.settings.left_mode, values[1]),
156-
self.meter_fill(2, self.settings.right_mode, values[2]),
157-
],
153+
bars: std::array::from_fn(|i| self.meter_fill(self.peaks[i].db, meters[i])),
158154
guide_color: color_to_rgba(self.palette[PAL_GUIDE]),
159155
}
160156
}
@@ -174,33 +170,30 @@ impl LoudnessState {
174170
.unwrap_or(DB_RANGE.0)
175171
}
176172

177-
fn visible_values(&self) -> [f32; VISIBLE_METER_COUNT] {
173+
fn visible_meters(&self) -> [(MeterMode, f32); VISIBLE_METER_COUNT] {
174+
let (left, right) = (self.settings.left_mode, self.settings.right_mode);
178175
[
179-
self.aggregate_channels(self.settings.left_mode, MeterSide::Left),
180-
self.aggregate_channels(self.settings.left_mode, MeterSide::Right),
181-
self.aggregate_channels(self.settings.right_mode, MeterSide::Both),
176+
(left, MeterSide::Left),
177+
(left, MeterSide::Right),
178+
(right, MeterSide::Both),
182179
]
180+
.map(|(mode, side)| (mode, self.aggregate_channels(mode, side)))
183181
}
184182

185-
fn meter_fill(&self, peak_index: usize, mode: MeterMode, db: f32) -> MeterFill {
186-
let peak_db = self.peaks[peak_index].db;
183+
fn meter_fill(&self, peak_db: f32, (mode, db): (MeterMode, f32)) -> MeterFill {
184+
let thresholds = zone_thresholds(mode);
185+
let colors = &self.palette[PAL_LOW..];
187186
MeterFill {
188187
db,
189-
segments: self.meter_segments(mode),
188+
segments: std::array::from_fn(|i| (thresholds[i], color_to_rgba(colors[i]))),
190189
peak: (peak_db > DB_RANGE.0).then(|| {
191-
let danger = peak_db >= zone_thresholds(mode)[DANGER_THRESHOLD_INDEX];
190+
let danger = peak_db >= thresholds[DANGER_THRESHOLD_INDEX];
192191
let color = self.palette[if danger { PAL_DANGER } else { PAL_PEAK }];
193192
(peak_db, color_to_rgba(color))
194193
}),
195194
}
196195
}
197196

198-
fn meter_segments(&self, mode: MeterMode) -> [(f32, [f32; 4]); ZONE_COUNT] {
199-
let [low, mid, high] = zone_thresholds(mode);
200-
let thresholds = [low, mid, high, DB_RANGE.1];
201-
std::array::from_fn(|i| (thresholds[i], color_to_rgba(self.palette[PAL_LOW + i])))
202-
}
203-
204197
fn refresh_value_label(&mut self) {
205198
let mode = self.settings.right_mode;
206199
let unit = match mode {
@@ -219,8 +212,8 @@ impl LoudnessState {
219212
}
220213

221214
fn update_peak_holds(&mut self, now: Instant) {
222-
let values = self.visible_values();
223-
for (peak, value) in self.peaks.iter_mut().zip(values) {
215+
let meters = self.visible_meters();
216+
for (peak, (_, value)) in self.peaks.iter_mut().zip(meters) {
224217
peak.update(value.clamp(DB_RANGE.0, DB_RANGE.1), now);
225218
}
226219
}
@@ -254,10 +247,12 @@ fn channel_side(
254247
}
255248
}
256249

257-
fn zone_thresholds(mode: MeterMode) -> [f32; 3] {
250+
fn zone_thresholds(mode: MeterMode) -> [f32; ZONE_COUNT] {
258251
match mode {
259-
MeterMode::LufsShortTerm | MeterMode::LufsMomentary => [-24.0, -18.0, -9.0],
260-
MeterMode::RmsFast | MeterMode::RmsSlow | MeterMode::TruePeak => [-12.0, -6.0, -1.0],
252+
MeterMode::LufsShortTerm | MeterMode::LufsMomentary => [-24.0, -18.0, -9.0, DB_RANGE.1],
253+
MeterMode::RmsFast | MeterMode::RmsSlow | MeterMode::TruePeak => {
254+
[-12.0, -6.0, -1.0, DB_RANGE.1]
255+
}
261256
}
262257
}
263258

‎src/visuals/spectrum/render.rs‎

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -136,35 +136,28 @@ impl SpectrumParams {
136136
points2,
137137
..
138138
} = scratch;
139-
let normalized = self.normalized_points.as_ref();
140-
let has_primary = normalized.len() >= MIN_TRACE_POINTS;
141-
let has_secondary = self.secondary_points.len() >= MIN_TRACE_POINTS;
142-
let primary_segments = normalized.len().min(pixel_budget).saturating_sub(1);
143-
let secondary_segments = self
144-
.secondary_points
145-
.len()
146-
.min(pixel_budget)
147-
.saturating_sub(1);
148-
vertices.reserve(primary_segments * 2 + secondary_segments);
139+
let segments = |points: &[[f32; 2]]| points.len().min(pixel_budget).saturating_sub(1);
140+
vertices.reserve(segments(&self.normalized_points) * 2 + segments(&self.secondary_points));
149141
let baseline = bounds.y + bounds.height;
142+
let project = |out: &mut Vec<(f32, f32)>, normalized: &[[f32; 2]]| {
143+
let visible = normalized.len() >= MIN_TRACE_POINTS;
144+
if visible {
145+
out.extend(
146+
normalized
147+
.iter()
148+
.map(|&p| normalized_to_cartesian(bounds, p)),
149+
);
150+
decimate_line(out, pixel_budget);
151+
}
152+
visible
153+
};
150154

155+
let has_primary = project(points, &self.normalized_points);
151156
if has_primary {
152-
points.extend(
153-
normalized
154-
.iter()
155-
.map(|&p| normalized_to_cartesian(bounds, p)),
156-
);
157-
decimate_line(points, pixel_budget);
158157
self.push_highlight_columns(vertices, clip, baseline, bounds.height, points);
159158
}
160159

161-
if has_secondary {
162-
points2.extend(
163-
self.secondary_points
164-
.iter()
165-
.map(|&p| normalized_to_cartesian(bounds, p)),
166-
);
167-
decimate_line(points2, pixel_budget);
160+
if project(points2, &self.secondary_points) {
168161
extend_aa_line_list(
169162
vertices,
170163
points2,

‎src/visuals/spectrum/state.rs‎

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -497,17 +497,12 @@ fn peak_bin(bins: &[f32], db: &[f32], min_f: f32, max_f: f32) -> Option<usize> {
497497
}
498498

499499
fn interpolated_peak(bins: &[f32], db: &[f32], bin: usize) -> (f32, f32) {
500-
let next = bin + 1;
501500
let bin_hz = bins[1] - bins[0];
502501
let (center_freq, center) = (bins[bin], db[bin]);
503-
let (left, right) = (db[bin - 1], db[next]);
504-
let offset = if left.is_finite() && right.is_finite() {
505-
let denom = left - 2.0 * center + right;
506-
if denom < -EPSILON {
507-
(0.5 * (left - right) / denom).clamp(-0.5, 0.5)
508-
} else {
509-
0.0
510-
}
502+
let (left, right) = (db[bin - 1], db[bin + 1]);
503+
let denom = left - 2.0 * center + right;
504+
let offset = if left.is_finite() && right.is_finite() && denom < -EPSILON {
505+
(0.5 * (left - right) / denom).clamp(-0.5, 0.5)
511506
} else {
512507
0.0
513508
};

0 commit comments

Comments
 (0)