Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
audio_inspector_panel.hpp
Go to the documentation of this file.
1#pragma once
2
19
23#include <pulp/view/view.hpp>
24#include <pulp/view/widgets.hpp>
25
26#include <array>
27#include <cstdint>
28#include <memory>
29#include <vector>
30
31namespace pulp::view {
32
37
41class AudioWaveformView : public View {
42 public:
44 static constexpr int kCapacity = 512;
45
49 enum class TriggerMode {
52 };
53
55
58 void set_samples(const float* samples, int count);
59
62
63 int sample_count() const {
64 return count_;
65 }
66 float sample_at(int i) const {
67 return (i >= 0 && i < count_) ? data_[i] : 0.0f;
68 }
69
70 void set_show_grid(bool show);
71 bool show_grid() const {
72 return show_grid_;
73 }
74
77 return trigger_mode_;
78 }
79
83 float horizontal_scale() const {
84 return horizontal_scale_;
85 }
86
91
94 void set_live(bool live) {
95 live_ = live;
96 }
97 bool is_live() const {
98 return live_;
99 }
100
101 void paint(canvas::Canvas& canvas) override;
102
103 private:
104 int find_rising_zero_crossing() const;
105
106 std::array<float, kCapacity> data_{};
107 int count_ = 0;
108 bool live_ = false;
109 bool show_grid_ = true;
110 TriggerMode trigger_mode_ = TriggerMode::kRaw;
111 float horizontal_scale_ = 1.0f;
112};
113
115inline constexpr float kInspectorMeterFloorDb = -60.0f;
116
122float dbfs_meter_fill(float linear);
123
126class AudioInspectorPanel : public View {
127 public:
129 enum class Status {
133 };
134
136
143 const audio::AudioStats& stats, const float* waveform, int waveform_count);
144
147 return mode_;
148 }
149
152
154
155 // ── State accessors (for headless tests; no GPU/window needed) ──────────
156
157 Status status() const {
158 return status_;
159 }
161 return snapshot_.stage_id;
162 }
163 float peak() const {
164 return snapshot_.peak_max;
165 }
166 float rms() const {
167 return snapshot_.rms_max;
168 }
169 std::uint64_t clip_count() const {
170 return snapshot_.clip_count;
171 }
172 std::uint64_t nan_inf_count() const {
173 return snapshot_.nan_inf_count;
174 }
175 std::uint64_t silence_run_blocks() const {
176 return snapshot_.silence_run_blocks;
177 }
178 std::uint64_t sequence_number() const {
179 return snapshot_.sequence_number;
180 }
181
188 float lr_match() const {
189 return lr_match_;
190 }
191
194 float balance() const {
195 return balance_;
196 }
197
199 return *waveform_view_;
200 }
202 return *waveform_view_;
203 }
204
208
210 float peak_meter_held_peak() const;
211 float rms_meter_held_peak() const;
212
213 // ── Rendered-text accessors (for headless tests) ────────────────────────
214 // The exact strings the labels paint. A test can assert these are
215 // populated (e.g. the status reads "live", the level reads "dBFS") so a
216 // regression that leaves the panel visually blank is caught in CI, not
217 // only by eye.
218 const std::string& status_text() const {
219 return status_label_->text();
220 }
221 const std::string& level_text() const {
222 return level_label_->text();
223 }
224 const std::string& content_text() const {
225 return content_label_->text();
226 }
227
232 return status_label_->text_color();
233 }
234
235 private:
236 void build_ui();
237 void refresh_labels();
238
239 Status status_ = Status::kNoProbe;
241 audio::AudioProbeSnapshot snapshot_{};
242 audio::AudioStats stats_{};
243 audio::AudioScopeResult scope_result_{};
244 bool has_scope_result_ = false;
245 float lr_match_ = 0.0f;
246 float balance_ = 0.0f;
247 float meter_dt_seconds_ = 1.0f / 60.0f;
248
249 // Widget pointers (owned by the view tree).
250 Label* status_label_ = nullptr;
251 ToggleButton* signal_button_ = nullptr;
252 ToggleButton* scope_button_ = nullptr;
253 Label* stage_label_ = nullptr;
254 Meter* peak_meter_ = nullptr;
255 Meter* rms_meter_ = nullptr;
256 Label* level_label_ = nullptr;
257 Label* content_label_ = nullptr;
258 Label* phase_label_ = nullptr;
259 Label* device_label_ = nullptr;
260 AudioWaveformView* waveform_view_ = nullptr;
261};
262
263} // namespace pulp::view
The realtime-produced probe summary — the shared schema between the RT producer (pulp::audio::AudioPr...
UI-independent acquisition and measurement helpers for Audio Scope.
Small POD counter struct for release-safe audio observability.
Definition canvas.hpp:240
AudioInspectorMode mode() const
Definition audio_inspector_panel.hpp:146
std::uint64_t sequence_number() const
Definition audio_inspector_panel.hpp:178
audio::AudioProbeStage observed_stage() const
Definition audio_inspector_panel.hpp:160
std::uint64_t silence_run_blocks() const
Definition audio_inspector_panel.hpp:175
std::uint64_t nan_inf_count() const
Definition audio_inspector_panel.hpp:172
void set_waveform_grid_visible(bool visible)
void set_mode(AudioInspectorMode mode)
std::uint64_t clip_count() const
Definition audio_inspector_panel.hpp:169
canvas::Color status_color() const
Color the status heading paints with.
Definition audio_inspector_panel.hpp:231
float balance() const
Channel balance in [-1, +1]: -1 = all left, 0 = centered, +1 = all right.
Definition audio_inspector_panel.hpp:194
void set_scope_result(const audio::AudioScopeResult &result)
float rms() const
Definition audio_inspector_panel.hpp:166
const AudioWaveformView & waveform() const
Definition audio_inspector_panel.hpp:198
float peak() const
Definition audio_inspector_panel.hpp:163
void update(Status status, const audio::AudioProbeSnapshot &snap, const audio::AudioStats &stats, const float *waveform, int waveform_count)
Push the latest probe summary + device stats.
const std::string & level_text() const
Definition audio_inspector_panel.hpp:221
Status
Availability of the underlying probe, surfaced honestly to the user.
Definition audio_inspector_panel.hpp:129
@ kNoProbe
No probe wired — nothing to observe.
Definition audio_inspector_panel.hpp:130
@ kStale
Probe wired but its sequence number stopped advancing.
Definition audio_inspector_panel.hpp:131
@ kLive
Probe wired and publishing fresh snapshots.
Definition audio_inspector_panel.hpp:132
const std::string & status_text() const
Definition audio_inspector_panel.hpp:218
float lr_match() const
L/R level-match in [0, 1]: the ratio of the quieter to the louder channel RMS (1 = equal energy,...
Definition audio_inspector_panel.hpp:188
void set_waveform_trigger_mode(AudioWaveformView::TriggerMode mode)
void set_waveform_horizontal_scale(float scale)
Status status() const
Definition audio_inspector_panel.hpp:157
std::function< void(AudioInspectorMode)> on_mode_changed
Definition audio_inspector_panel.hpp:153
const std::string & content_text() const
Definition audio_inspector_panel.hpp:224
AudioWaveformView & waveform()
Definition audio_inspector_panel.hpp:201
Time-domain waveform plot over a copied, fixed-capacity sample buffer.
Definition audio_inspector_panel.hpp:41
TriggerMode trigger_mode() const
Definition audio_inspector_panel.hpp:76
void set_horizontal_scale(float scale)
Horizontal zoom for the diagnostic trace.
float horizontal_scale() const
Definition audio_inspector_panel.hpp:83
static constexpr int kCapacity
Fixed display capacity. The window copies at most this many frames.
Definition audio_inspector_panel.hpp:44
TriggerMode
Display-only acquisition alignment.
Definition audio_inspector_panel.hpp:49
@ kRisingZero
Definition audio_inspector_panel.hpp:51
@ kRaw
Definition audio_inspector_panel.hpp:50
int sample_count() const
Definition audio_inspector_panel.hpp:63
void set_samples(const float *samples, int count)
Replace the displayed samples (mono, interleaved-by-frame channel 0).
void set_trigger_mode(TriggerMode mode)
void paint(canvas::Canvas &canvas) override
bool is_live() const
Definition audio_inspector_panel.hpp:97
float sample_at(int i) const
Definition audio_inspector_panel.hpp:66
bool show_grid() const
Definition audio_inspector_panel.hpp:71
int display_start_index() const
Index into data_ where the current display window starts.
void set_live(bool live)
When false the view paints a dimmed baseline + no trace (stale / no probe).
Definition audio_inspector_panel.hpp:94
void clear_samples()
Drop all samples (renders the empty baseline).
bool visible() const
Definition view.hpp:333
float scale() const
Definition view.hpp:1902
AudioProbeStage
Identifies which audio boundary a snapshot was produced at.
Definition audio_probe_snapshot.hpp:28
Definition affine_transform.hpp:24
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
AudioInspectorMode
Definition audio_inspector_panel.hpp:33
@ kScope
Definition audio_inspector_panel.hpp:35
@ kSignal
Definition audio_inspector_panel.hpp:34
float dbfs_meter_fill(float linear)
Map a linear amplitude (1.0 == full scale) to a 0..1 meter fill on the SAME dBFS scale the panel's te...
constexpr float kInspectorMeterFloorDb
dBFS floor used by the inspector's meter fill (and the empty-bar anchor).
Definition audio_inspector_panel.hpp:115
@ Label
Definition text_accessibility.hpp:29
@ i
Definition input_events.hpp:40
Realtime-produced, fixed-capacity, trivially-copyable probe summary.
Definition audio_probe_snapshot.hpp:42
Definition audio_scope.hpp:62
Minimal release-safe audio counter aggregate.
Definition audio_stats.hpp:36
Definition canvas.hpp:52