50 void on_attach(
const std::shared_ptr<SignalSourceContainer>& container)
override;
51 void on_detach(
const std::shared_ptr<SignalSourceContainer>& container)
override;
63 void process(
const std::shared_ptr<SignalSourceContainer>& container)
override;
65 [[nodiscard]]
bool is_processing()
const override {
return m_is_processing.load(); }
82 void set_frames_per_block(uint64_t frames_per_block);
101 void set_loop_region(uint64_t start_frame, uint64_t end_frame);
111 void set_loop_count(
size_t n);
117 void set_on_end(std::function<
void()> cb) { m_on_end = std::move(cb); }
130 void set_speed(
double speed);
143 void set_time_map(
const std::shared_ptr<const Kinesis::TimeMap>& map);
157 void set_repeat(
const std::shared_ptr<const Kinesis::TimeMap>& length);
159 [[nodiscard]]
bool is_active()
const {
return m_active; }
160 [[nodiscard]] uint64_t
cursor()
const {
return m_cursor[0]; }
161 [[nodiscard]] uint64_t
loop_start()
const {
return m_loop_start; }
162 [[nodiscard]] uint64_t
loop_end()
const {
return m_loop_end; }
163 [[nodiscard]]
size_t loop_count()
const {
return m_loop_count; }
168 std::vector<uint64_t> m_cursor {};
169 uint64_t m_loop_start {};
170 uint64_t m_loop_end {};
173 size_t m_loop_count {};
174 size_t m_loops_remaining {};
175 double m_speed_remainder {};
176 double m_speed { 1.0 };
179 uint64_t m_clock_frames {};
181 uint64_t m_repeat_start {};
182 uint64_t m_repeat_length {};
189 uint32_t m_slot_index { std::numeric_limits<uint32_t>::max() };
191 std::atomic<bool> m_is_processing {
false };