Fixed-slot per-node live-DSP timing telemetry. More...
#include <atomic>#include <chrono>#include <cstdint>#include <span>#include <string_view>#include <vector>Go to the source code of this file.
Classes | |
| struct | pulp::audio::LiveDspNodeInfo |
| Immutable per-node identity, supplied to prepare() and copied into the store. More... | |
| struct | pulp::audio::LiveDspTelemetryConfig |
| struct | pulp::audio::LiveDspSpectralDiagnostic |
| struct | pulp::audio::LiveDspNodeSummary |
| Per-node rolling summary produced by drain(). More... | |
| struct | pulp::audio::LiveDspTelemetrySnapshot |
| Latest published summary. Owned by the store; valid until the next drain(). More... | |
| class | pulp::audio::LiveDspTelemetryNodeScope |
| RAII per-node timing scope, constructed inside begin_block()'s active block. More... | |
| class | pulp::audio::LiveDspTelemetryBlockWriter |
| Handle for one audio block. More... | |
| class | pulp::audio::LiveDspTelemetryStore |
| The store. One producer (audio thread) and one consumer (drain/owner thread). More... | |
Namespaces | |
| namespace | pulp |
| namespace | pulp::audio |
Enumerations | |
| enum class | pulp::audio::LiveDspNodeKind : std::uint8_t { pulp::audio::Unknown = 0 , pulp::audio::AudioInput , pulp::audio::AudioOutput , pulp::audio::Plugin , pulp::audio::Gain , pulp::audio::MidiInput , pulp::audio::MidiOutput , pulp::audio::Custom , pulp::audio::Utility } |
| Coarse node classification, interned at prepare() time (never on the RT thread). More... | |
Functions | |
| const char * | pulp::audio::to_string (LiveDspNodeKind kind) noexcept |
Fixed-slot per-node live-DSP timing telemetry.
Measures per-node/per-block DSP cost on the LIVE audio thread with zero allocation and zero locks on that thread, drains off-thread, and publishes rolling percentile/jitter summaries for UI + inspector polling.
This is deliberately NOT Perfetto: Perfetto's TRACE_EVENT takes a mutex at ring-chunk rollover, so it cannot run on a real-time callback. The audio thread here only reads a monotonic clock and writes into pre-allocated slots via relaxed/acquire-release atomics — the same discipline as AudioProcessLoadMeasurer, extended to per-node granularity. Percentiles, jitter, and overload attribution are computed on the draining (non-RT) side.
Lifecycle mirrors the load-measurer / audio-probe pattern: control thread : prepare(config, nodes) — allocates everything up front audio thread : begin_block() → node scopes → finish() — RT-safe writes owner/UI thread: drain(...) then latest() — aggregate + read a snapshot
Disabled by default; enable explicitly via set_enabled(true). When disabled the audio path is a single predicted-not-taken branch.