Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
audio_io_timing.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <limits>
5#include <optional>
6
7namespace pulp::audio {
8
15
23
31
60
61constexpr bool is_supported_audio_sample_rate(double sample_rate_hz) noexcept {
62 // Comparisons also reject NaN. The upper bound is deliberately above
63 // shipping audio hardware while refusing infinities and corrupt metadata.
64 return sample_rate_hz >= 1000.0 && sample_rate_hz <= 1536000.0;
65}
66
67constexpr std::uint64_t saturating_frame_add(
68 std::uint64_t lhs,
69 std::uint64_t rhs) noexcept {
70 constexpr auto max = std::numeric_limits<std::uint64_t>::max();
71 return rhs > max - lhs ? max : lhs + rhs;
72}
73
74constexpr std::optional<std::uint64_t> next_calibration_generation(
75 std::uint64_t generation) noexcept {
76 constexpr auto max = std::numeric_limits<std::uint64_t>::max();
77 return generation == max
78 ? std::nullopt
79 : std::optional<std::uint64_t>{generation + 1};
80}
81
87 double sample_rate_hz = 0.0;
88 std::uint64_t graph_latency_frames = 0;
89 std::optional<std::uint64_t> input_placement_offset_frames;
90 std::optional<std::uint64_t> monitoring_latency_frames;
91 std::optional<std::uint64_t> output_scheduling_offset_frames;
92
96 constexpr bool is_current_for(const AudioIoTiming& timing) const noexcept {
97 return audio_io.route_instance_token != 0 &&
98 audio_io.route_instance_token == timing.route_instance_token &&
99 audio_io.calibration_generation != 0 &&
100 audio_io.calibration_generation == timing.calibration_generation;
101 }
102};
103
108constexpr std::optional<LatencySnapshot> make_latency_snapshot(
109 const AudioIoTiming& timing,
110 std::uint64_t graph_latency_frames,
111 double graph_sample_rate_hz) noexcept {
112 if (!is_supported_audio_sample_rate(timing.sample_rate_hz) ||
113 graph_sample_rate_hz != timing.sample_rate_hz ||
114 timing.timestamp_domain == AudioTimestampDomain::unspecified ||
115 timing.timestamp_source == AudioTimingSource::unspecified ||
116 timing.confidence == AudioTimingConfidence::unavailable ||
117 timing.route_instance_token == 0 ||
118 timing.calibration_generation == 0) {
119 return std::nullopt;
120 }
121
122 std::optional<std::uint64_t> input_path;
123 if (timing.input_latency_frames && timing.input_safety_offset_frames &&
124 timing.io_buffer_frames) {
125 input_path = saturating_frame_add(
127 *timing.input_latency_frames,
128 *timing.input_safety_offset_frames),
129 *timing.io_buffer_frames);
130 }
131 std::optional<std::uint64_t> output_path;
132 if (timing.output_latency_frames && timing.output_safety_offset_frames &&
133 timing.io_buffer_frames) {
134 output_path = saturating_frame_add(
136 *timing.output_latency_frames,
137 *timing.output_safety_offset_frames),
138 *timing.io_buffer_frames);
139 }
140 if (!input_path && !output_path) return std::nullopt;
141
142 std::optional<std::uint64_t> monitoring;
143 if (input_path && output_path) {
144 monitoring = saturating_frame_add(
145 saturating_frame_add(*input_path, graph_latency_frames),
146 *output_path);
147 }
148 std::optional<std::uint64_t> output_scheduling;
149 if (output_path) {
150 output_scheduling =
151 saturating_frame_add(graph_latency_frames, *output_path);
152 }
153
154 return LatencySnapshot{
155 timing,
156 timing.sample_rate_hz,
157 graph_latency_frames,
158 input_path,
159 monitoring,
160 output_scheduling,
161 };
162}
163
164} // namespace pulp::audio
Definition analyzer_provider.hpp:12
constexpr bool is_supported_audio_sample_rate(double sample_rate_hz) noexcept
Definition audio_io_timing.hpp:61
constexpr std::uint64_t saturating_frame_add(std::uint64_t lhs, std::uint64_t rhs) noexcept
Definition audio_io_timing.hpp:67
AudioTimestampDomain
Clock domain used by the backend's audio timestamps.
Definition audio_io_timing.hpp:10
@ monotonic_host_time
Definition audio_io_timing.hpp:13
@ device_sample_frames
Definition audio_io_timing.hpp:12
@ unspecified
Definition audio_io_timing.hpp:11
AudioTimingSource
Authority behind the reported I/O timing.
Definition audio_io_timing.hpp:17
@ os_estimate
Definition audio_io_timing.hpp:20
@ device_clock
Definition audio_io_timing.hpp:19
@ unspecified
Definition audio_io_timing.hpp:18
@ user_calibration
Definition audio_io_timing.hpp:21
AudioTimingConfidence
How strongly callers may rely on the reported values.
Definition audio_io_timing.hpp:25
@ estimated
Definition audio_io_timing.hpp:27
@ calibrated
Definition audio_io_timing.hpp:29
@ unavailable
Definition audio_io_timing.hpp:26
@ reported
Definition audio_io_timing.hpp:28
@ unavailable
Definition analyzer_provider.hpp:68
constexpr std::optional< LatencySnapshot > make_latency_snapshot(const AudioIoTiming &timing, std::uint64_t graph_latency_frames, double graph_sample_rate_hz) noexcept
Compose I/O timing with a graph total obtained from the graph's public latency accessor.
Definition audio_io_timing.hpp:108
constexpr std::optional< std::uint64_t > next_calibration_generation(std::uint64_t generation) noexcept
Definition audio_io_timing.hpp:74
Immutable control-thread snapshot of one audio route's I/O timing.
Definition audio_io_timing.hpp:41
AudioTimingSource timestamp_source
Definition audio_io_timing.hpp:53
std::optional< std::uint32_t > input_safety_offset_frames
Definition audio_io_timing.hpp:44
std::uint64_t calibration_generation
Definition audio_io_timing.hpp:58
std::optional< std::uint32_t > io_buffer_frames
Frames in each CoreAudio I/O cycle.
Definition audio_io_timing.hpp:50
AudioTimestampDomain timestamp_domain
Definition audio_io_timing.hpp:52
std::uint64_t route_instance_token
Process-local identity of the AudioDevice instance that minted this report.
Definition audio_io_timing.hpp:57
std::optional< std::uint32_t > output_latency_frames
Definition audio_io_timing.hpp:43
std::optional< std::uint32_t > input_latency_frames
Definition audio_io_timing.hpp:42
std::optional< std::uint32_t > output_safety_offset_frames
Definition audio_io_timing.hpp:45
double sample_rate_hz
Definition audio_io_timing.hpp:51
AudioTimingConfidence confidence
Definition audio_io_timing.hpp:54
Control-thread composition of backend I/O timing with the graph's already computed total latency.
Definition audio_io_timing.hpp:85
constexpr bool is_current_for(const AudioIoTiming &timing) const noexcept
Whether this snapshot still describes the route calibration supplied by the backend.
Definition audio_io_timing.hpp:96
std::optional< std::uint64_t > input_placement_offset_frames
Definition audio_io_timing.hpp:89
double sample_rate_hz
Definition audio_io_timing.hpp:87
std::optional< std::uint64_t > output_scheduling_offset_frames
Definition audio_io_timing.hpp:91
AudioIoTiming audio_io
Definition audio_io_timing.hpp:86
std::uint64_t graph_latency_frames
Definition audio_io_timing.hpp:88
std::optional< std::uint64_t > monitoring_latency_frames
Definition audio_io_timing.hpp:90