60 friend class GraphThread;
61 using GraphThreadPtr = std::unique_ptr<GraphThread>;
62 static constexpr int MAX_GRAPH_THREADS = 128;
81 units::sample_rate_t sample_rate,
83 bool realtime_threads =
true,
84 std::optional<juce::AudioWorkgroup> thread_workgroup = std::nullopt);
105 units::sample_rate_t sample_rate,
123 auto &get_nodes () {
return graph_nodes_; }
141 auto get_time_nfo ()
const {
return time_nfo_; }
142 auto get_remaining_preroll_frames ()
const
144 return remaining_preroll_frames_;
155 assert (current_transport_.has_value ());
156 return current_transport_->get ();
163 [[gnu::hot]]
void trigger_node (
GraphNode &node);
169 void prepare_nodes_for_processing ();
175 void release_node_resources ();
178 boost::concurrent_flat_set<GraphThreadPtr> threads_;
179 GraphThreadPtr main_thread_;
189 std::optional<std::reference_wrapper<const dsp::ITransport>> current_transport_;
197 moodycamel::LightweightSemaphore callback_start_sem_{ 0 };
198 moodycamel::LightweightSemaphore callback_done_sem_{ 0 };
201 std::atomic<int> idle_thread_cnt_ = 0;
205 moodycamel::LightweightSemaphore trigger_sem_{ 0 };
208 MPMCQueue<GraphNode *> trigger_queue_;
213 GraphNodeCollection graph_nodes_;
216 std::atomic<int> terminal_refcnt_ = 0;
222 std::optional<juce::Thread::RealtimeOptions> realtime_thread_options_;
225 std::optional<juce::AudioWorkgroup> thread_workgroup_;
227 units::sample_rate_t sample_rate_;
GraphScheduler(RunOnMainThreadFunc run_on_main_thread_func, units::sample_rate_t sample_rate, nframes_t max_block_length, bool realtime_threads=true, std::optional< juce::AudioWorkgroup > thread_workgroup=std::nullopt)
Construct a new Graph Scheduler.
void run_cycle(EngineProcessTimeInfo time_nfo, nframes_t remaining_preroll_frames, const dsp::ITransport &transport)
To be called repeatedly by a system audio callback thread.