60 friend class GraphThread;
61 static constexpr int MAX_GRAPH_THREADS = 128;
80 units::sample_rate_t sample_rate,
81 units::sample_u32_t max_block_length,
82 bool realtime_threads =
true,
83 std::optional<juce::AudioWorkgroup> thread_workgroup = std::nullopt);
108 units::sample_rate_t sample_rate,
109 units::sample_u32_t max_block_length);
126 auto &get_nodes () {
return graph_nodes_; }
138 units::sample_u64_t remaining_preroll_frames,
140 const dsp::TempoMap &tempo_map);
147 auto get_time_nfo ()
const {
return time_nfo_; }
148 auto get_remaining_preroll_frames ()
const
150 return remaining_preroll_frames_;
161 assert (current_transport_.has_value ());
162 return current_transport_->get ();
173 assert (current_tempo_map_.has_value ());
174 return current_tempo_map_->get ();
181 [[gnu::hot]]
void trigger_node (
GraphNode &node);
187 void prepare_nodes_for_processing ();
193 void release_node_resources ();
197 std::unique_ptr<ThreadSet> thread_set_;
198 [[nodiscard]]
size_t num_threads () const noexcept [[clang::nonblocking]];
208 std::optional<std::reference_wrapper<const dsp::
ITransport>> current_transport_;
213 std::optional<std::reference_wrapper<const dsp::TempoMap>> current_tempo_map_;
218 units::sample_u64_t remaining_preroll_frames_;
221 moodycamel::LightweightSemaphore callback_start_sem_{ 0 };
222 moodycamel::LightweightSemaphore callback_done_sem_{ 0 };
225 std::atomic<int> idle_thread_cnt_ = 0;
229 moodycamel::LightweightSemaphore trigger_sem_{ 0 };
237 GraphNodeCollection graph_nodes_;
240 std::atomic<int> terminal_refcnt_ = 0;
246 std::optional<juce::Thread::RealtimeOptions> realtime_thread_options_;
249 std::optional<juce::AudioWorkgroup> thread_workgroup_;
251 units::sample_rate_t sample_rate_;
252 units::sample_u32_t max_block_length_;
GraphScheduler(RunOnMainThreadFunc run_on_main_thread_func, units::sample_rate_t sample_rate, units::sample_u32_t max_block_length, bool realtime_threads=true, std::optional< juce::AudioWorkgroup > thread_workgroup=std::nullopt)
Construct a new Graph Scheduler.
void run_cycle(dsp::graph::EngineProcessTimeInfo time_nfo, units::sample_u64_t remaining_preroll_frames, const dsp::ITransport &transport, const dsp::TempoMap &tempo_map)
To be called repeatedly by a system audio callback thread.