62 std::vector<std::shared_ptr<Vruta::Routine>> synchronous_tasks;
69 std::shared_ptr<Vruta::Routine> task = frame_rate
73 if (branch.synchronous && task) {
74 synchronous_tasks.push_back(task);
78 return synchronous_tasks;
83 return std::ranges::any_of(tasks, [](
const auto& task) {
84 return task && task->is_active();
108 uint32_t cycles_executed = 0;
110 while ((max_cycles == 0 || cycles_executed < max_cycles) && (
m_continuous_execution || cycles_executed < max_cycles)) {
112 if (promise.should_terminate) {
128 for (uint32_t iter = 0; iter < op_iterations; ++iter) {
194 uint32_t cycles_executed = 0;
196 while ((max_cycles == 0 || cycles_executed < max_cycles) && (
m_continuous_execution || cycles_executed < max_cycles)) {
198 if (promise.should_terminate) {
217 for (uint32_t iter = 0; iter < op_iterations; ++iter) {
226 }
else if (samples_per_operation > 0) {
247 "PARALLEL strategy not yet implemented, using PHASED as fallback");
254 "REACTIVE strategy not yet implemented, using PHASED as fallback");
267 uint32_t cycles_executed = 0;
269 while ((max_cycles == 0 || cycles_executed < max_cycles) && (
m_continuous_execution || cycles_executed < max_cycles)) {
271 if (promise.should_terminate) {
289 for (uint32_t iter = 0; iter < op_iterations; ++iter) {
316 if (frames_per_operation > 0) {
352 uint32_t cycles_executed = 0;
354 while ((max_cycles == 0 || cycles_executed < max_cycles) && (
m_continuous_execution || cycles_executed < max_cycles)) {
356 if (promise.should_terminate) {
378 for (uint32_t iter = 0; iter < op_iterations; ++iter) {
388 }
else if (frames_per_operation > 0) {
422 "PARALLEL and REACTIVE strategies not yet implemented, using PHASED as fallback");
#define MF_WARN(comp, ctx,...)
uint32_t get_cycle_count() const
std::function< bool(uint32_t)> m_condition
static bool is_capture_phase_operation(const BufferOperation &op)
OpType get_type() const
Getters for internal state (read-only)
uint32_t m_cycle_interval
@ CONDITION
Conditional operation for branching logic.
@ CAPTURE
Capture data from source buffer using BufferCapture strategy.
static bool is_process_phase_operation(const BufferOperation &op)
Fundamental unit of operation in buffer processing pipelines.
ExecutionStrategy m_execution_strategy
@ READY
Data ready for processing.
@ CONSUMED
Data has been processed.
@ EMPTY
No data available.
Vruta::SoundRoutine execute_reactive(uint64_t max_cycles, uint64_t samples_per_operation)
Vruta::DelayContext m_process_timing
Vruta::GraphicsRoutine execute_frame_internal(uint64_t max_cycles, uint64_t frames_per_operation)
uint32_t operation_iterations(const BufferOperation &op) const
Vruta::GraphicsRoutine execute_frame_phased(uint64_t max_cycles, uint64_t frames_per_operation)
void cleanup_completed_branches()
void process_operation(BufferOperation &op, uint64_t cycle)
void reset_accumulated_data()
Vruta::DelayContext m_capture_timing
void flow_through(size_t index, uint64_t cycle)
std::vector< BranchInfo > m_branches
std::vector< BufferOperation > m_operations
std::vector< DataState > m_data_states
void cleanup_expired_data()
Vruta::SoundRoutine execute_streaming(uint64_t max_cycles, uint64_t samples_per_operation)
Vruta::SoundRoutine execute_parallel(uint64_t max_cycles, uint64_t samples_per_operation)
std::function< void(uint32_t)> m_cycle_end_callback
Vruta::GraphicsRoutine execute_frame_streaming(uint64_t max_cycles, uint64_t frames_per_operation)
bool m_continuous_execution
static bool any_active(const std::vector< std::shared_ptr< Vruta::Routine > > &tasks)
std::function< void(uint32_t)> m_cycle_start_callback
std::function< void()> m_on_complete
std::shared_ptr< Vruta::GraphicsRoutine > dispatch_frame_branch(BranchInfo &branch)
Vruta::SoundRoutine execute_phased(uint64_t max_cycles, uint64_t samples_per_operation)
bool operation_due(const BufferOperation &op) const
std::shared_ptr< Vruta::SoundRoutine > dispatch_branch_async(BranchInfo &branch, uint64_t cycle)
std::vector< std::shared_ptr< Vruta::Routine > > dispatch_cycle_branches(bool frame_rate)
A C++20 coroutine-based graphics processing task with frame-accurate timing.
A C++20 coroutine-based audio processing task with sample-accurate timing.
@ CoroutineScheduling
Coroutine scheduling and temporal coordination (Vruta::TaskScheduler)
@ Kriya
Automatable tasks and fluent scheduling api for Nodes and Buffers.
@ PHASED
PHASED: Traditional phased execution (default)
@ STREAMING
STREAMING: Immediate flow-through execution.
@ PARALLEL
PARALLEL: Concurrent capture with synchronization.
@ REACTIVE
REACTIVE: Data-driven reactive execution.
@ SAMPLE_BASED
Sample-accurate delay (audio domain)
@ BUFFER_BASED
Buffer-cycle delay (audio hardware boundary)
Awaiter for suspending until a buffer cycle boundary.
graphics-domain awaiter for frame-accurate timing delays
Templated awaitable for accessing a coroutine's promise object.
Awaitable object for precise sample-accurate timing delays.