Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
loop_point_analyzer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <limits>
6#include <span>
7#include <vector>
8
12
13namespace pulp::audio {
14
16 std::uint64_t start_hint_frame = 0;
17 std::uint64_t end_hint_frame = 0;
18 std::uint64_t search_radius_frames = 256;
19 std::uint64_t window_frames = 128;
20 std::uint64_t min_loop_frames = 16;
21 std::uint64_t crossfade_frames = 0;
22 double source_sample_rate = 0.0;
23 std::size_t max_candidates = 16;
24 // Upper bound on start/end candidate pairs considered. This keeps
25 // off-RT analysis predictable for long files or dense imported markers.
26 std::uint64_t max_evaluations = 65536;
28 std::span<const SliceMarker> anchor_markers{};
29};
30
32 bool valid = false;
34 double score = std::numeric_limits<double>::infinity();
35 double endpoint_delta = 0.0;
36 double slope_delta = 0.0;
37 double rms_delta = 0.0;
38 double correlation = 0.0;
39 double transient_penalty = 0.0;
40 double zero_crossing_cost = 0.0;
41};
42
43enum class LoopEndpointRole : std::uint8_t {
46};
47
49 bool valid = false;
50 std::uint64_t hint_frame = 0;
51 // Boundary frame in the caller's coordinate system. For ExclusiveEndFrame
52 // this may equal source.num_samples().
53 std::uint64_t frame = 0;
54 // Actual sample frame used for value/slope/zero-crossing scoring.
55 std::uint64_t scored_frame = 0;
58 double cost = std::numeric_limits<double>::infinity();
59 double value_delta = 0.0;
60 double slope_delta = 0.0;
61 double zero_crossing_cost = 0.0;
62};
63
65 bool ok = false;
67 std::uint64_t evaluated_candidates = 0;
68 std::vector<LoopPointCandidate> candidates;
69};
70
72public:
73 // Off-real-time/background analysis. May allocate and may examine long
74 // windows; never call from Processor::process().
76 const LoopPointAnalysisConfig& config) const;
77
79 const LoopRegion& region,
80 std::uint64_t window_frames) noexcept;
81
82 // Off-real-time helper for editor/importer workflows that need to move a
83 // hinted boundary to a click-reducing frame without running a full loop
84 // candidate search. `reference_frame` is a scored sample frame, not an
85 // exclusive-end boundary; pass `scored_frame` from another snap result when
86 // matching against an exclusive end.
89 std::uint64_t hint_frame,
90 LoopSnapPolicy policy,
91 std::uint64_t search_radius_frames,
92 std::uint64_t reference_frame = std::numeric_limits<std::uint64_t>::max(),
94};
95
96} // namespace pulp::audio
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition loop_point_analyzer.hpp:71
LoopPointAnalysisResult analyze(BufferView< const float > source, const LoopPointAnalysisConfig &config) const
static LoopPointCandidate score_candidate(BufferView< const float > source, const LoopRegion &region, std::uint64_t window_frames) noexcept
static LoopEndpointSnapResult snap_endpoint(BufferView< const float > source, std::uint64_t hint_frame, LoopSnapPolicy policy, std::uint64_t search_radius_frames, std::uint64_t reference_frame=std::numeric_limits< std::uint64_t >::max(), LoopEndpointRole role=LoopEndpointRole::StartFrame) noexcept
Definition analyzer_provider.hpp:12
LoopEndpointRole
Definition loop_point_analyzer.hpp:43
@ ExclusiveEndFrame
Definition loop_point_analyzer.hpp:45
@ StartFrame
Definition loop_point_analyzer.hpp:44
LoopSnapPolicy
Definition loop_types.hpp:26
@ None
Definition loop_types.hpp:27
@ ValueDirection
Definition loop_types.hpp:30
Definition loop_point_analyzer.hpp:48
std::uint64_t scored_frame
Definition loop_point_analyzer.hpp:55
bool valid
Definition loop_point_analyzer.hpp:49
double slope_delta
Definition loop_point_analyzer.hpp:60
LoopSnapPolicy policy
Definition loop_point_analyzer.hpp:56
std::uint64_t frame
Definition loop_point_analyzer.hpp:53
double cost
Definition loop_point_analyzer.hpp:58
double zero_crossing_cost
Definition loop_point_analyzer.hpp:61
LoopEndpointRole role
Definition loop_point_analyzer.hpp:57
std::uint64_t hint_frame
Definition loop_point_analyzer.hpp:50
double value_delta
Definition loop_point_analyzer.hpp:59
Definition loop_point_analyzer.hpp:15
std::uint64_t crossfade_frames
Definition loop_point_analyzer.hpp:21
std::uint64_t min_loop_frames
Definition loop_point_analyzer.hpp:20
double source_sample_rate
Definition loop_point_analyzer.hpp:22
std::uint64_t end_hint_frame
Definition loop_point_analyzer.hpp:17
std::uint64_t max_evaluations
Definition loop_point_analyzer.hpp:26
std::size_t max_candidates
Definition loop_point_analyzer.hpp:23
std::uint64_t search_radius_frames
Definition loop_point_analyzer.hpp:18
LoopSnapPolicy snap_policy
Definition loop_point_analyzer.hpp:27
std::uint64_t window_frames
Definition loop_point_analyzer.hpp:19
std::span< const SliceMarker > anchor_markers
Definition loop_point_analyzer.hpp:28
std::uint64_t start_hint_frame
Definition loop_point_analyzer.hpp:16
Definition loop_point_analyzer.hpp:64
std::vector< LoopPointCandidate > candidates
Definition loop_point_analyzer.hpp:68
bool evaluation_limit_reached
Definition loop_point_analyzer.hpp:66
bool ok
Definition loop_point_analyzer.hpp:65
std::uint64_t evaluated_candidates
Definition loop_point_analyzer.hpp:67
Definition loop_point_analyzer.hpp:31
double score
Definition loop_point_analyzer.hpp:34
LoopRegion region
Definition loop_point_analyzer.hpp:33
double slope_delta
Definition loop_point_analyzer.hpp:36
double zero_crossing_cost
Definition loop_point_analyzer.hpp:40
double rms_delta
Definition loop_point_analyzer.hpp:37
double correlation
Definition loop_point_analyzer.hpp:38
double transient_penalty
Definition loop_point_analyzer.hpp:39
double endpoint_delta
Definition loop_point_analyzer.hpp:35
bool valid
Definition loop_point_analyzer.hpp:32
Definition loop_types.hpp:42