Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
transport_quantizer.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <cstdint>
6
7namespace pulp::format {
8
16
30
37
39 bool transport_jumped = false;
40 bool timeline_valid = false;
41};
42
44 bool scheduled = false;
45 // May equal ProcessContext::num_samples to represent the boundary just
46 // after the current block. It is not always a sample index.
47 std::uint32_t block_offset = 0;
48 double target_beats = 0.0;
49 bool transport_jumped = false;
51};
52
54public:
55 class BlockPlan {
56 public:
58 const TransportQuantizeRequest& request) const noexcept;
59
60 const ProcessContext& context() const noexcept { return context_; }
61 TransportQuantizerBlock block() const noexcept { return block_; }
62 bool transport_jumped() const noexcept { return block_.transport_jumped; }
63 bool timeline_valid() const noexcept { return block_.timeline_valid; }
64
65 private:
66 friend class TransportQuantizer;
67
68 BlockPlan(const TransportQuantizer& owner,
71
72 const TransportQuantizer& owner_;
73 ProcessContext context_;
75 };
76
77 TransportQuantizer() = default;
78
79 void reset() noexcept;
81
82 // Preferred call shape for new users: captures the exact ProcessContext
83 // and block metadata together so resolves cannot accidentally pair a stale
84 // TransportQuantizerBlock with a different host block.
85 BlockPlan begin_block_plan(const ProcessContext& context) noexcept;
86
88 const TransportQuantizeRequest& request,
89 TransportQuantizerBlock block) const noexcept;
90
91 static double beats_per_bar(int numerator, int denominator) noexcept;
92
93private:
94 struct LastBlock {
95 bool valid = false;
96 bool is_playing = false;
97 bool is_looping = false;
98 double sample_rate = 0.0;
99 double tempo_bpm = 0.0;
100 double position_beats = 0.0;
101 double loop_start_beats = 0.0;
102 double loop_end_beats = 0.0;
103 int num_samples = 0;
104 };
105
106 static bool valid_sample_rate(double sample_rate) noexcept;
107 static bool valid_tempo(double tempo_bpm) noexcept;
108 static bool valid_grid(double grid_beats) noexcept;
109 static bool valid_timeline(const ProcessContext& context) noexcept;
110 static bool valid_loop_range(double start_beats, double end_beats) noexcept;
111 static bool valid_loop(const ProcessContext& context) noexcept;
112 static double frames_to_beats(double frames,
113 double sample_rate,
114 double tempo_bpm) noexcept;
115 static double beats_to_frames(double beats,
116 double sample_rate,
117 double tempo_bpm) noexcept;
118 static double next_grid_boundary(double position_beats,
119 double grid_beats) noexcept;
120 static double next_host_loop_start_boundary(const ProcessContext& context) noexcept;
121 static double wrap_loop_position(double position_beats,
122 double loop_start_beats,
123 double loop_end_beats) noexcept;
124 static double timeline_tolerance_beats(const ProcessContext& context) noexcept;
125
126 TransportQuantizeResult offset_for_target(const ProcessContext& context,
127 double target_beats,
128 bool transport_jumped) const noexcept;
129 bool detect_transport_jump(const ProcessContext& context,
130 bool timeline_valid) const noexcept;
131 void remember(const ProcessContext& context, bool timeline_valid) noexcept;
132
133 LastBlock last_;
134};
135
136} // namespace pulp::format
Definition transport_quantizer.hpp:55
bool timeline_valid() const noexcept
Definition transport_quantizer.hpp:63
bool transport_jumped() const noexcept
Definition transport_quantizer.hpp:62
const ProcessContext & context() const noexcept
Definition transport_quantizer.hpp:60
TransportQuantizeResult resolve(const TransportQuantizeRequest &request) const noexcept
TransportQuantizerBlock block() const noexcept
Definition transport_quantizer.hpp:61
friend class TransportQuantizer
Definition transport_quantizer.hpp:66
TransportQuantizerBlock begin_block(const ProcessContext &context) noexcept
BlockPlan begin_block_plan(const ProcessContext &context) noexcept
static double beats_per_bar(int numerator, int denominator) noexcept
TransportQuantizeResult resolve(const ProcessContext &context, const TransportQuantizeRequest &request, TransportQuantizerBlock block) const noexcept
What the product grants a device: the quota table indexed by capability tier and live thermal state.
Definition aax_editor.hpp:31
TransportQuantizePolicy
Definition transport_quantizer.hpp:9
@ NextBar
Definition transport_quantizer.hpp:12
@ HostLoopStart
Definition transport_quantizer.hpp:14
@ Immediate
Definition transport_quantizer.hpp:10
@ NextGrid
Definition transport_quantizer.hpp:13
@ NextBeat
Definition transport_quantizer.hpp:11
TransportQuantizeStatus
Definition transport_quantizer.hpp:17
@ TransportStopped
Definition transport_quantizer.hpp:20
@ TransportJumped
Definition transport_quantizer.hpp:28
@ Scheduled
Definition transport_quantizer.hpp:18
@ InvalidGrid
Definition transport_quantizer.hpp:25
@ InvalidSampleRate
Definition transport_quantizer.hpp:22
@ InvalidTimeSignature
Definition transport_quantizer.hpp:24
@ InvalidTimeline
Definition transport_quantizer.hpp:26
@ InvalidBlockSize
Definition transport_quantizer.hpp:21
@ InvalidTempo
Definition transport_quantizer.hpp:23
@ OutsideBlock
Definition transport_quantizer.hpp:19
@ LoopUnavailable
Definition transport_quantizer.hpp:27
Process context — passed every audio callback with transport state.
Definition process_context.hpp:89
Definition transport_quantizer.hpp:31
bool require_playing
Definition transport_quantizer.hpp:34
TransportQuantizePolicy policy
Definition transport_quantizer.hpp:32
double grid_beats
Definition transport_quantizer.hpp:33
bool cancel_on_transport_jump
Definition transport_quantizer.hpp:35
Definition transport_quantizer.hpp:43
TransportQuantizeStatus status
Definition transport_quantizer.hpp:50
std::uint32_t block_offset
Definition transport_quantizer.hpp:47
bool scheduled
Definition transport_quantizer.hpp:44
double target_beats
Definition transport_quantizer.hpp:48
bool transport_jumped
Definition transport_quantizer.hpp:49
Definition transport_quantizer.hpp:38
bool transport_jumped
Definition transport_quantizer.hpp:39
bool timeline_valid
Definition transport_quantizer.hpp:40