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_; }
137 const dsp::TempoMap &tempo_map);
144 auto get_time_nfo ()
const {
return time_nfo_; }
145 auto get_remaining_preroll_frames ()
const
147 return remaining_preroll_frames_;
158 assert (current_transport_.has_value ());
159 return current_transport_->get ();
170 assert (current_tempo_map_.has_value ());
171 return current_tempo_map_->get ();
178 [[gnu::hot]]
void trigger_node (
GraphNode &node);
184 void prepare_nodes_for_processing ();
190 void release_node_resources ();
193 boost::concurrent_flat_set<GraphThreadPtr> threads_;
194 GraphThreadPtr main_thread_;
204 std::optional<std::reference_wrapper<const dsp::ITransport>> current_transport_;
209 std::optional<std::reference_wrapper<const dsp::TempoMap>> current_tempo_map_;
217 moodycamel::LightweightSemaphore callback_start_sem_{ 0 };
218 moodycamel::LightweightSemaphore callback_done_sem_{ 0 };
221 std::atomic<int> idle_thread_cnt_ = 0;
225 moodycamel::LightweightSemaphore trigger_sem_{ 0 };
228 MPMCQueue<GraphNode *> trigger_queue_;
233 GraphNodeCollection graph_nodes_;
236 std::atomic<int> terminal_refcnt_ = 0;
242 std::optional<juce::Thread::RealtimeOptions> realtime_thread_options_;
245 std::optional<juce::AudioWorkgroup> thread_workgroup_;
247 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, const dsp::TempoMap &tempo_map)
To be called repeatedly by a system audio callback thread.