9#include "dsp/tick_types.h"
11namespace zrythm::structure::arrangement
55template <std::invocable<const LoopSegment &> Func>
57for_each_loop_segment (
58 dsp::ContentTick clip_start,
59 dsp::ContentTick loop_start,
60 dsp::ContentTick loop_end,
61 dsp::ContentTick end_tick,
64 const auto loop_length =
65 max (dsp::ContentTick{ units::ticks (0.0) }, loop_end - loop_start);
67 auto virt_start = clip_start;
68 auto virt_end = loop_end;
69 auto abs_start = dsp::ContentTick{ units::ticks (0.0) };
70 auto abs_end = loop_end - clip_start;
73 if (abs_end > end_tick)
75 const auto diff = abs_end - end_tick;
76 virt_end = virt_end - diff;
77 abs_end = abs_end - diff;
80 while (abs_start < end_tick)
82 if (abs_end <= abs_start)
85 callback (LoopSegment{ virt_start, virt_end, abs_start, abs_end });
87 const auto current_len = abs_end - abs_start;
88 if (current_len <= dsp::ContentTick{})
92 virt_start = loop_start;
94 abs_start = abs_start + current_len;
95 abs_end = abs_end + loop_length;
97 if (abs_end > end_tick)
99 const auto diff = abs_end - end_tick;
100 virt_end = virt_end - diff;
101 abs_end = abs_end - diff;
122template <
typename WarpLookup>
123std::vector<dsp::TimelineTick>
124compute_loop_boundary_deltas (
125 WarpLookup &&warp_lookup,
126 dsp::ContentTick clip_start_ct,
127 dsp::ContentTick loop_start_ct,
128 dsp::ContentTick loop_end_ct,
129 dsp::TimelineTick max_delta_ticks,
130 int max_iterations = 1000)
132 std::vector<dsp::TimelineTick> result;
134 const auto loop_length =
135 max (dsp::ContentTick{ units::ticks (0.0) }, loop_end_ct - loop_start_ct);
136 if (loop_length <= dsp::ContentTick{})
139 auto cumulative = loop_end_ct - clip_start_ct;
141 for (
int i = 0; i < max_iterations; ++i)
143 const auto delta = warp_lookup (cumulative);
144 if (delta >= max_delta_ticks)
146 result.push_back (delta);
147 cumulative = cumulative + loop_length;
float max(std::span< const float > buf)
Gets the maximum of the buffer.
One iteration of the loop-expanded clip content.
dsp::ContentTick virt_end
End of this segment's range in source-content space.
dsp::ContentTick abs_end
End of this segment in clip-absolute space.
dsp::ContentTick abs_start
Start of this segment in clip-absolute space (0 = clip start).
dsp::ContentTick virt_start
Start of this segment's range in source-content space.