61 TaskScheduler(uint32_t default_sample_rate = 48000, uint32_t default_frame_rate = 60);
73 void add_task(
const std::shared_ptr<Routine>& routine,
const std::string&
name =
"",
bool initialize =
false);
80 std::shared_ptr<Routine> get_task(
const std::string&
name)
const;
91 bool cancel_task(
const std::shared_ptr<Routine>& routine);
112 std::vector<std::shared_ptr<Routine>> get_tasks_for_token(
ProcessingToken token)
const;
123 void process_token(
ProcessingToken token, uint64_t processing_units = 1);
132 void process_all_tokens();
156 void register_clock(
ProcessingToken token, std::shared_ptr<IClock> clock);
171 uint64_t current_units(
ProcessingToken token = ProcessingToken::SAMPLE_ACCURATE)
const;
178 unsigned int get_rate(
ProcessingToken token = ProcessingToken::SAMPLE_ACCURATE)
const;
199 return get_typed_clock<SampleClock>(ProcessingToken::SAMPLE_ACCURATE);
227 template <
typename ClockType>
230 return dynamic_cast<const ClockType&
>(get_clock(token));
240 template <
typename... Args>
243 auto it = find_task_by_name(
name);
244 if (it != m_tasks.end() && it->routine && it->routine->is_active()) {
245 it->routine->update_params(std::forward<Args>(args)...);
258 template <
typename T>
261 auto it = find_task_by_name(
name);
262 if (it != m_tasks.end() && it->routine && it->routine->is_active()) {
263 return it->routine->get_state<T>(state_key);
275 template <
typename T>
278 return [
this,
name, state_key]() -> T {
279 if (
auto value = get_task_state<T>(
name, state_key)) {
290 uint64_t get_next_task_id()
const;
303 std::vector<std::string> get_task_names()
const;
316 [[nodiscard]]
const std::vector<TaskEntry>& get_all_tasks();
321 void pause_all_tasks();
326 void resume_all_tasks();
336 void terminate_all_tasks();
360 return m_current_buffer_cycle;
369 m_current_buffer_cycle++;
372 void process_buffer_cycle_tasks();
377 [[nodiscard]]
bool is_terminating()
const {
return m_terminating.load(std::memory_order_acquire); }
385 std::string auto_generate_name(
const std::shared_ptr<Routine>& routine)
const;
392 std::vector<TaskEntry>::iterator find_task_by_name(
const std::string&
name);
399 std::vector<TaskEntry>::const_iterator find_task_by_name(
const std::string&
name)
const;
406 std::vector<TaskEntry>::iterator find_task_by_routine(
const std::shared_ptr<Routine>& routine);
427 void process_default(
ProcessingToken token, uint64_t processing_units);
432 void cleanup_completed_tasks();
440 void drain_pending_tasks();
448 void drain_conditional_pending();
455 bool initialize_routine_state(
const std::shared_ptr<Routine>& routine,
ProcessingToken token);
464 void start_conditional_thread();
488 void pump_conditional();
517 mutable std::atomic<uint64_t> m_next_task_id { 1 };
540 uint64_t m_current_buffer_cycle {};
542 uint64_t m_registered_sample_rate { 48000 };
543 uint32_t m_registered_frame_rate { 60 };
545 static constexpr size_t MAX_PENDING_TASKS = 256;
548 std::atomic<bool> active {
false };
550 bool is_addition {
true };
553 std::atomic<uint32_t> m_pending_count { 0 };
556 static constexpr size_t MAX_PENDING_CONDITIONAL = 64;
558 std::atomic<uint32_t> m_conditional_pending_count { 0 };
562 std::atomic<bool> m_terminating {
false };
563 std::atomic<uint32_t> m_inflight_submissions { 0 };
std::shared_ptr< Routine > routine
TaskEntry(const std::shared_ptr< Routine > &r, std::string n)