Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
audio_inspector.hpp
Go to the documentation of this file.
1// audio_inspector.hpp — Audio domain monitoring for the inspector
2// Buffer underrun detection, per-channel metering, MIDI event logging.
3#pragma once
4
6
7#include <atomic>
8#include <chrono>
9#include <cstdint>
10#include <mutex>
11#include <string>
12#include <vector>
13
14namespace pulp::inspect {
15
18 double sample_rate = 0;
19 int buffer_size = 0;
23};
24
27 uint8_t status;
28 uint8_t data1;
29 uint8_t data2;
30 std::chrono::steady_clock::time_point time;
31 std::string description; // e.g., "Note On C4 vel=100"
32};
33
36 uint64_t frame;
38 float budget_ms;
39 std::chrono::steady_clock::time_point time;
40};
41
44 float peak = 0;
45 float rms = 0;
46};
47
55
59public:
60 AudioInspector() = default;
61
62 // ── Configuration ───────────────────────────────────────────────
65
66 // ── Callback timing (call from audio thread) ────────────────────
69 void end_callback(uint64_t frame_number);
70
71 // ── Metering (call from audio thread) ───────────────────────────
73 void report_levels(const std::vector<ChannelLevels>& levels);
74
75 // ── MIDI logging (call from audio thread) ───────────────────────
76 void log_midi(uint8_t status, uint8_t data1, uint8_t data2,
77 const std::string& description = {});
78
79 // ── Runtime telemetry bridge (call from owner/control thread) ───
81 const pulp::audio::AudioProcessLoadSnapshot& process_load,
82 uint64_t xrun_count);
85 void set_xrun_count(uint64_t xrun_count);
88
89 // ── Queries (call from any thread) ──────────────────────────────
90 std::vector<BufferUnderrun> recent_underruns() const;
91 std::vector<MidiLogEntry> recent_midi() const;
92 std::vector<ChannelLevels> latest_levels() const;
93 bool metering_enabled() const { return metering_enabled_; }
94 void set_metering_enabled(bool enabled) { metering_enabled_ = enabled; }
95
96private:
97 mutable std::mutex mutex_;
98 AudioConfig config_;
99 bool metering_enabled_ = false;
100
101 // Callback timing
102 std::chrono::steady_clock::time_point callback_start_;
103
104 // Underrun ring buffer
105 std::vector<BufferUnderrun> underruns_;
106 static constexpr size_t kMaxUnderruns = 50;
107
108 // MIDI ring buffer
109 std::vector<MidiLogEntry> midi_log_;
110 static constexpr size_t kMaxMidi = 200;
111
112 // Latest levels
113 std::vector<ChannelLevels> levels_;
114
115 std::atomic<float> telemetry_load_{0.0f};
116 std::atomic<float> telemetry_peak_load_{0.0f};
117 std::atomic<float> telemetry_last_load_{0.0f};
118 std::atomic<int64_t> telemetry_elapsed_ns_{0};
119 std::atomic<int64_t> telemetry_available_ns_{0};
120 std::atomic<uint64_t> telemetry_callback_count_{0};
121 std::atomic<uint64_t> telemetry_overload_count_{0};
122 std::atomic<uint64_t> telemetry_xrun_count_{0};
123 std::atomic<bool> telemetry_available_{false};
124};
125
126} // namespace pulp::inspect
std::vector< BufferUnderrun > recent_underruns() const
bool metering_enabled() const
Definition audio_inspector.hpp:93
void log_midi(uint8_t status, uint8_t data1, uint8_t data2, const std::string &description={})
void set_xrun_count(uint64_t xrun_count)
Update the independently valid backend xrun counter without claiming a process-load producer is attac...
void begin_callback()
Call at the start/end of each audio callback to measure duration.
AudioConfig config() const
void end_callback(uint64_t frame_number)
AudioRuntimeTelemetry runtime_telemetry() const
void set_metering_enabled(bool enabled)
Definition audio_inspector.hpp:94
void set_config(const AudioConfig &config)
void set_runtime_telemetry(const pulp::audio::AudioProcessLoadSnapshot &process_load, uint64_t xrun_count)
std::vector< ChannelLevels > latest_levels() const
std::vector< MidiLogEntry > recent_midi() const
void report_levels(const std::vector< ChannelLevels > &levels)
Report output levels for the current buffer.
Real-time CPU load measurement for audio callbacks.
Definition agent_context.hpp:7
Snapshot published by AudioProcessLoadMeasurer.
Definition load_measurer.hpp:25
Audio configuration snapshot.
Definition audio_inspector.hpp:17
int buffer_size
Definition audio_inspector.hpp:19
int latency_samples
Definition audio_inspector.hpp:22
double sample_rate
Definition audio_inspector.hpp:18
int output_channels
Definition audio_inspector.hpp:21
int input_channels
Definition audio_inspector.hpp:20
Cheap runtime telemetry bridge for agent/UI polling.
Definition audio_inspector.hpp:50
uint64_t xrun_count
Definition audio_inspector.hpp:52
bool available
Definition audio_inspector.hpp:53
pulp::audio::AudioProcessLoadSnapshot process_load
Definition audio_inspector.hpp:51
Buffer underrun event.
Definition audio_inspector.hpp:35
std::chrono::steady_clock::time_point time
Definition audio_inspector.hpp:39
float callback_time_ms
Definition audio_inspector.hpp:37
uint64_t frame
Definition audio_inspector.hpp:36
float budget_ms
Definition audio_inspector.hpp:38
Per-channel audio levels.
Definition audio_inspector.hpp:43
float rms
Definition audio_inspector.hpp:45
float peak
Definition audio_inspector.hpp:44
A single MIDI event for logging.
Definition audio_inspector.hpp:26
std::chrono::steady_clock::time_point time
Definition audio_inspector.hpp:30
uint8_t data1
Definition audio_inspector.hpp:28
uint8_t status
Definition audio_inspector.hpp:27
std::string description
Definition audio_inspector.hpp:31
uint8_t data2
Definition audio_inspector.hpp:29