Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
sample_preload_contract.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <cstdint>
5#include <limits>
6
7namespace pulp::audio {
8
17
30
40
46 const SamplePreloadContract& contract) noexcept {
48
49 const auto positive_finite = [](double value) noexcept {
50 return value > 0.0 && std::isfinite(value);
51 };
52 const auto nonnegative_finite = [](double value) noexcept {
53 return value >= 0.0 && std::isfinite(value);
54 };
55 if (!positive_finite(contract.source_sample_rate)) {
57 return result;
58 }
59 if (!positive_finite(contract.host_sample_rate)) {
61 return result;
62 }
63 if (!positive_finite(contract.maximum_playback_ratio)) {
65 return result;
66 }
67 if (!nonnegative_finite(contract.certified_io_latency_seconds) ||
68 !nonnegative_finite(contract.scheduler_margin_seconds) ||
69 !nonnegative_finite(contract.decoder_latency_seconds)) {
71 return result;
72 }
73
74 const double latency_seconds = contract.certified_io_latency_seconds +
75 contract.scheduler_margin_seconds +
76 contract.decoder_latency_seconds;
77 if (!std::isfinite(latency_seconds)) {
79 return result;
80 }
81
82 const double latency_frames = std::ceil(
83 latency_seconds * contract.source_sample_rate * contract.maximum_playback_ratio);
84 const double block_frames = std::ceil(
85 static_cast<double>(contract.maximum_host_block_frames) *
86 contract.source_sample_rate / contract.host_sample_rate *
87 contract.maximum_playback_ratio);
88 constexpr double kMaxFrames =
89 static_cast<double>(std::numeric_limits<std::uint64_t>::max());
90 if (!std::isfinite(latency_frames) || latency_frames >= kMaxFrames ||
91 !std::isfinite(block_frames) || block_frames >= kMaxFrames) {
93 return result;
94 }
95
96 result.latency_guard_frames = static_cast<std::uint64_t>(latency_frames);
97 result.block_guard_frames = static_cast<std::uint64_t>(block_frames);
98
99 const auto add_checked = [](std::uint64_t left,
100 std::uint64_t right,
101 std::uint64_t& sum) noexcept {
102 if (right > std::numeric_limits<std::uint64_t>::max() - left) return false;
103 sum = left + right;
104 return true;
105 };
106 std::uint64_t required = 0;
107 if (!add_checked(result.latency_guard_frames, result.block_guard_frames, required) ||
108 !add_checked(required, contract.interpolation_guard_frames, required) ||
109 !add_checked(required, contract.loop_prefetch_guard_frames, required)) {
111 return result;
112 }
113
115 result.required_preload_frames = required;
116 result.sufficient = contract.configured_preload_frames >= required;
117 return result;
118}
119
120} // namespace pulp::audio
Definition analyzer_provider.hpp:12
@ InvalidHostSampleRate
Definition sample_heritage_runtime_state.hpp:103
SamplePreloadContractStatus
Definition sample_preload_contract.hpp:9
@ Overflow
Definition sample_preload_contract.hpp:15
@ InvalidHostSampleRate
Definition sample_preload_contract.hpp:12
@ Ok
Definition sample_preload_contract.hpp:10
@ InvalidSourceSampleRate
Definition sample_preload_contract.hpp:11
@ InvalidLatency
Definition sample_preload_contract.hpp:14
@ InvalidPlaybackRatio
Definition sample_preload_contract.hpp:13
@ Ok
Definition loop_types.hpp:34
SamplePreloadContractResult evaluate_sample_preload_contract(const SamplePreloadContract &contract) noexcept
Calculate the resident head required to cover a certified streaming service interval at the fastest s...
Definition sample_preload_contract.hpp:45
Definition sample_preload_contract.hpp:31
SamplePreloadContractStatus status
Definition sample_preload_contract.hpp:32
std::uint64_t block_guard_frames
Definition sample_preload_contract.hpp:34
std::uint64_t latency_guard_frames
Definition sample_preload_contract.hpp:33
bool valid() const noexcept
Definition sample_preload_contract.hpp:38
std::uint64_t required_preload_frames
Definition sample_preload_contract.hpp:35
bool sufficient
Definition sample_preload_contract.hpp:36
Definition sample_preload_contract.hpp:18
double scheduler_margin_seconds
Definition sample_preload_contract.hpp:23
double certified_io_latency_seconds
Definition sample_preload_contract.hpp:22
double maximum_playback_ratio
Definition sample_preload_contract.hpp:21
double decoder_latency_seconds
Definition sample_preload_contract.hpp:24
std::uint64_t loop_prefetch_guard_frames
Definition sample_preload_contract.hpp:27
std::uint64_t maximum_host_block_frames
Definition sample_preload_contract.hpp:25
std::uint64_t interpolation_guard_frames
Definition sample_preload_contract.hpp:26
std::uint64_t configured_preload_frames
Definition sample_preload_contract.hpp:28
double host_sample_rate
Definition sample_preload_contract.hpp:20
double source_sample_rate
Definition sample_preload_contract.hpp:19