Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
live_dsp_telemetry.hpp File Reference

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

Detailed Description

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.