MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Chronie.cpp
Go to the documentation of this file.
1#include "Chronie.hpp"
2
3#include "Core.hpp"
4
11
13
17
19
20namespace MayaFlux {
21
22std::shared_ptr<Vruta::TaskScheduler> get_scheduler()
23{
24 return get_context().get_scheduler();
25}
26
27std::shared_ptr<Vruta::EventManager> get_event_manager()
28{
30}
31
32template <typename... Args>
33bool update_task_params(const std::string& name, Args... args)
34{
35 return get_scheduler()->update_task_params(name, args...);
36}
37
38void schedule_metro(double interval_seconds, std::function<void()> callback, std::string name, Vruta::ProcessingToken token)
39{
40 auto scheduler = get_scheduler();
41 if (name.empty()) {
42 name = "metro_" + std::to_string(scheduler->get_next_task_id());
43 }
44 auto metronome = Kriya::metro(interval_seconds, std::move(callback), token);
45
46 get_scheduler()->add_task(metronome, name, false);
47}
48
49void schedule_sequence(std::vector<std::pair<double, std::function<void()>>> seq, std::string name, Vruta::ProcessingToken token)
50{
51 auto scheduler = get_scheduler();
52 if (name.empty()) {
53 name = "seq_" + std::to_string(scheduler->get_next_task_id());
54 }
55
56 auto tseq = Kriya::sequence(std::move(seq), token);
57
58 get_scheduler()->add_task(tseq, name, false);
59}
60
61std::shared_ptr<Vruta::SoundRoutine> schedule_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool retain, std::string name)
62{
63 auto scheduler = get_scheduler();
64 if (name.empty()) {
65 name = "seq_" + std::to_string(scheduler->get_next_task_id());
66 }
67
68 auto line = std::make_shared<Vruta::SoundRoutine>(Kriya::line(start_value, end_value, duration_seconds, step_duration, retain));
69
70 get_scheduler()->add_task(line, name, true);
71 return line;
72}
73
74void schedule_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, std::vector<double> durations, std::string name, Vruta::ProcessingToken token)
75{
76 auto scheduler = get_scheduler();
77 if (name.empty()) {
78 name = "pattern_" + std::to_string(scheduler->get_next_task_id());
79 }
80
81 scheduler->add_task(Kriya::pattern(std::move(pattern_func), std::move(callback), std::move(durations), token), name, false);
82}
83
84void schedule_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, double interval_seconds, std::string name, Vruta::ProcessingToken token)
85{
86 schedule_pattern(std::move(pattern_func), std::move(callback), std::vector<double> { interval_seconds }, std::move(name), token);
87}
88
89float* get_line_value(const std::string& name)
90{
91 if (auto task = get_scheduler()->get_task(name)) {
92 auto cur_val = task->get_state<float>("current_value");
93 if (cur_val) {
94 return cur_val;
95 }
96
97 MF_ERROR(Journal::Component::API, Journal::Context::CoroutineScheduling, "line value not returned from task. Verify that tasks has not returned");
98 return nullptr;
99 }
100 MF_ERROR(Journal::Component::API, Journal::Context::CoroutineScheduling, "Task: {} not found. Verify task validity or if its been scheduled, or its set to retain after completion", name);
101 return nullptr;
102}
103
104void schedule_task(const std::string& name, Vruta::SoundRoutine&& task, bool initialize)
105{
106 auto task_ptr = std::make_shared<Vruta::SoundRoutine>(std::move(task));
107 get_scheduler()->add_task(std::move(task_ptr), name, initialize);
108}
109
110void schedule_task(const std::string& name, Vruta::GraphicsRoutine&& task, bool initialize)
111{
112 auto task_ptr = std::make_shared<Vruta::GraphicsRoutine>(std::move(task));
113 get_scheduler()->add_task(std::move(task_ptr), name, initialize);
114}
115
116void schedule_task(const std::string& name, Vruta::FreeRoutine&& task, bool initialize)
117{
118 auto task_ptr = std::make_shared<Vruta::FreeRoutine>(std::move(task));
119 get_scheduler()->add_task(std::move(task_ptr), name, initialize);
120}
121
122void schedule_task(const std::string& name, const std::shared_ptr<Vruta::Routine>& task, bool initialize)
123{
124 get_scheduler()->add_task(task, name, initialize);
125}
126
127bool cancel_task(const std::string& name)
128{
129 return get_scheduler()->cancel_task(name);
130}
131
132bool restart_task(const std::string& name)
133{
134 return get_scheduler()->restart_task(name);
135}
136
137std::shared_ptr<Kriya::BufferPipeline> create_buffer_pipeline()
138{
140}
141
142std::shared_ptr<Kriya::BufferPipeline> create_buffer_pipeline(std::shared_ptr<IO::IOManager> io_manager)
143{
144 return Kriya::BufferPipeline::create(*get_scheduler(), get_context().get_buffer_manager(), std::move(io_manager));
145}
146
148 const std::shared_ptr<Core::Window>& window,
149 IO::Keys key,
150 std::function<void()> callback,
151 std::string name)
152{
153 auto event_manager = get_event_manager();
154 if (name.empty()) {
155 name = "key_press_" + std::to_string(event_manager->get_next_event_id());
156 }
157
158 auto event = std::make_shared<Vruta::Event>(
159 Kriya::key_pressed(window, key, std::move(callback)));
160
161 event_manager->add_event(event, name);
162}
163
165 const std::shared_ptr<Core::Window>& window,
166 IO::Keys key,
167 std::function<void()> callback,
168 std::string name)
169{
170 auto event_manager = get_event_manager();
171 if (name.empty()) {
172 name = "key_release_" + std::to_string(event_manager->get_next_event_id());
173 }
174
175 auto event = std::make_shared<Vruta::Event>(
176 Kriya::key_released(window, key, std::move(callback)));
177
178 event_manager->add_event(event, name);
179}
180
182 const std::shared_ptr<Core::Window>& window,
183 std::function<void(IO::Keys)> callback,
184 std::string name)
185{
186 auto event_manager = get_event_manager();
187 if (name.empty()) {
188 name = "any_key_" + std::to_string(event_manager->get_next_event_id());
189 }
190
191 auto event = std::make_shared<Vruta::Event>(
192 Kriya::any_key(window, std::move(callback)));
193
194 event_manager->add_event(event, name);
195}
196
198 const std::shared_ptr<Core::Window>& window,
199 IO::MouseButtons button,
200 std::function<void(double, double)> callback,
201 std::string name)
202{
203 auto event_manager = get_event_manager();
204 if (name.empty()) {
205 name = "mouse_press_" + std::to_string(event_manager->get_next_event_id());
206 }
207
208 auto event = std::make_shared<Vruta::Event>(
209 Kriya::mouse_pressed(window, button, std::move(callback)));
210
211 event_manager->add_event(event, name);
212}
213
215 const std::shared_ptr<Core::Window>& window,
216 IO::MouseButtons button,
217 std::function<void(double, double)> callback,
218 std::string name)
219{
220 auto event_manager = get_event_manager();
221 if (name.empty()) {
222 name = "mouse_release_" + std::to_string(event_manager->get_next_event_id());
223 }
224
225 auto event = std::make_shared<Vruta::Event>(
226 Kriya::mouse_released(window, button, std::move(callback)));
227
228 event_manager->add_event(event, name);
229}
230
232 const std::shared_ptr<Core::Window>& window,
233 std::function<void(double, double)> callback,
234 std::string name)
235{
236 auto event_manager = get_event_manager();
237 if (name.empty()) {
238 name = "mouse_move_" + std::to_string(event_manager->get_next_event_id());
239 }
240
241 auto event = std::make_shared<Vruta::Event>(
242 Kriya::mouse_moved(window, std::move(callback)));
243
244 event_manager->add_event(event, name);
245}
246
248 const std::shared_ptr<Core::Window>& window,
249 IO::MouseButtons button,
250 std::function<void(double, double)> callback,
251 std::string name)
252{
253 auto event_manager = get_event_manager();
254 if (name.empty()) {
255 name = "mouse_drag_" + std::to_string(event_manager->get_next_event_id());
256 }
257
258 auto event = std::make_shared<Vruta::Event>(
259 Kriya::mouse_dragged(window, button, std::move(callback)));
260
261 event_manager->add_event(event, name);
262}
263
265 const std::shared_ptr<Core::Window>& window,
266 std::function<void(double, double)> callback,
267 std::string name)
268{
269 auto event_manager = get_event_manager();
270 if (name.empty()) {
271 name = "scroll_" + std::to_string(event_manager->get_next_event_id());
272 }
273
274 auto event = std::make_shared<Vruta::Event>(
276
277 event_manager->add_event(event, name);
278}
279
280bool cancel_event_handler(const std::string& name)
281{
282 return get_event_manager()->cancel_event(name);
283}
284
285uint64_t seconds_to_samples(double seconds)
286{
287 uint64_t sample_rate = 48000;
288 if (get_context().is_running()) {
289 sample_rate = get_context().get_stream_info().sample_rate;
290 }
291 return static_cast<uint64_t>(seconds * (double)sample_rate);
292}
293
294uint64_t seconds_to_blocks(double seconds)
295{
296 uint32_t sample_rate = 48000;
297 uint32_t block_size = 512;
298
299 if (get_context().is_running()) {
300 sample_rate = get_context().get_stream_info().sample_rate;
301 block_size = get_context().get_stream_info().buffer_size;
302 }
303
304 return Vruta::seconds_to_blocks(seconds, sample_rate, block_size);
305}
306
307uint64_t samples_to_blocks(uint64_t samples)
308{
309 uint32_t block_size = 512;
310
311 if (get_context().is_running()) {
312 block_size = get_context().get_stream_info().buffer_size;
313 }
314
315 return Vruta::samples_to_blocks(samples, block_size);
316}
317
318double samples_to_seconds(uint64_t samples)
319{
320 uint64_t sample_rate = 48000;
321 if (get_context().is_running()) {
322 sample_rate = get_context().get_stream_info().sample_rate;
323 }
324
325 return static_cast<double>(samples) / (double)sample_rate;
326}
327
329 std::shared_ptr<Vruta::NetworkSource> source,
330 std::function<void(const Core::NetworkMessage&)> callback,
331 std::string name)
332{
333 auto event_manager = get_event_manager();
334 if (name.empty()) {
335 name = "net_msg_" + std::to_string(event_manager->get_next_event_id());
336 }
337 event_manager->add_event(
338 std::make_shared<Vruta::Event>(Kriya::on_message(std::move(source), std::move(callback))),
339 name);
340}
341
342std::shared_ptr<Vruta::NetworkSource> on_network_message(
343 const Core::EndpointInfo& info,
344 std::function<void(const Core::NetworkMessage&)> callback,
345 std::string name)
346{
347 auto source = std::make_shared<Vruta::NetworkSource>(info);
348 on_network_message(source, std::move(callback), std::move(name));
349 return source;
350}
351
353 std::shared_ptr<Vruta::NetworkSource> source,
354 std::string sender_address,
355 std::function<void(const Core::NetworkMessage&)> callback,
356 std::string name)
357{
358 auto event_manager = get_event_manager();
359 if (name.empty()) {
360 name = "net_msg_from_" + std::to_string(event_manager->get_next_event_id());
361 }
362 event_manager->add_event(
363 std::make_shared<Vruta::Event>(
364 Kriya::on_message_from(std::move(source), std::move(sender_address), std::move(callback))),
365 name);
366}
367
368std::shared_ptr<Vruta::NetworkSource> on_network_message_from(
369 const Core::EndpointInfo& info,
370 std::string sender_address,
371 std::function<void(const Core::NetworkMessage&)> callback,
372 std::string name)
373{
374 auto source = std::make_shared<Vruta::NetworkSource>(info);
375 on_network_message_from(source, std::move(sender_address), std::move(callback), std::move(name));
376 return source;
377}
378
380 std::shared_ptr<Vruta::NetworkSource> source,
381 std::function<bool(const Core::NetworkMessage&)> predicate,
382 std::function<void(const Core::NetworkMessage&)> callback,
383 std::string name)
384{
385 auto event_manager = get_event_manager();
386 if (name.empty()) {
387 name = "net_msg_match_" + std::to_string(event_manager->get_next_event_id());
388 }
389 event_manager->add_event(
390 std::make_shared<Vruta::Event>(
391 Kriya::on_message_matching(std::move(source), std::move(predicate), std::move(callback))),
392 name);
393}
394
395std::shared_ptr<Vruta::NetworkSource> on_network_message_matching(
396 const Core::EndpointInfo& info,
397 std::function<bool(const Core::NetworkMessage&)> predicate,
398 std::function<void(const Core::NetworkMessage&)> callback,
399 std::string name)
400{
401 auto source = std::make_shared<Vruta::NetworkSource>(info);
402 on_network_message_matching(source, std::move(predicate), std::move(callback), std::move(name));
403 return source;
404}
405
406}
#define MF_ERROR(comp, ctx,...)
Core engine lifecycle and configuration API.
PickCallback callback
Definition Picker.cpp:22
std::weak_ptr< Core::Window > window
Definition Picker.cpp:23
std::string name
Definition VKDevice.cpp:123
GlobalStreamInfo & get_stream_info()
Gets the current stream configuration.
Definition Engine.hpp:224
std::shared_ptr< Vruta::EventManager > get_event_manager()
Gets the event manager.
Definition Engine.hpp:303
std::shared_ptr< Vruta::TaskScheduler > get_scheduler()
Gets the task scheduler.
Definition Engine.hpp:276
static std::shared_ptr< BufferPipeline > create(Vruta::TaskScheduler &scheduler, std::shared_ptr< Buffers::BufferManager > buffer_manager=nullptr, std::shared_ptr< IO::IOManager > io_manager=nullptr)
Coroutine resumed when a caller-supplied condition becomes true.
Definition Routine.hpp:779
A C++20 coroutine-based graphics processing task with frame-accurate timing.
Definition Routine.hpp:512
A C++20 coroutine-based audio processing task with sample-accurate timing.
Definition Routine.hpp:327
void initialize()
Definition main.cpp:10
MouseButtons
Enumeration for mouse buttons.
Definition Keys.hpp:147
@ CoroutineScheduling
Coroutine scheduling and temporal coordination (Vruta::TaskScheduler)
@ API
MayaFlux/API Wrapper and convenience functions.
Vruta::Event key_released(std::shared_ptr< Core::Window > window, IO::Keys key, std::function< void()> callback)
Creates an Event coroutine that triggers on specific key release.
Vruta::Event any_key(std::shared_ptr< Core::Window > window, std::function< void(IO::Keys)> callback)
Creates an Event coroutine that triggers on any key press.
std::shared_ptr< Vruta::Routine > pattern(std::function< std::any(uint64_t)> pattern_func, std::function< void(std::any)> callback, std::function< bool(uint64_t)> ready, Vruta::ProcessingToken token)
The std::any, uint64_t form of the condition driven pattern.
Definition Pattern.cpp:5
Vruta::Event key_pressed(std::shared_ptr< Core::Window > window, IO::Keys key, std::function< void()> callback)
Creates an Event coroutine that triggers on specific key press.
Vruta::Event mouse_moved(std::shared_ptr< Core::Window > window, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on mouse movement.
Vruta::SoundRoutine line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool restartable)
Creates a continuous interpolation generator between two values over time.
Definition Tasks.cpp:66
Vruta::Event mouse_scrolled(std::shared_ptr< Core::Window > window, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on mouse scroll.
Vruta::Event mouse_released(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on specific mouse button release.
Vruta::Event on_message_matching(std::shared_ptr< Vruta::NetworkSource > source, std::function< bool(const Core::NetworkMessage &)> predicate, std::function< void(const Core::NetworkMessage &)> callback)
Creates an Event coroutine that fires only when a predicate matches.
Vruta::Event mouse_pressed(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on specific mouse button press.
std::shared_ptr< Vruta::Routine > sequence(std::vector< std::pair< double, std::function< void()> > > sequence, Vruta::ProcessingToken token)
Creates a temporal sequence that executes callbacks at specified time offsets.
Definition Tasks.cpp:46
Vruta::Event mouse_dragged(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on mouse drag with specific button.
std::shared_ptr< Vruta::Routine > metro(double interval_seconds, std::function< void()> callback, Vruta::ProcessingToken token)
Creates a periodic event generator that executes a callback at regular intervals.
Definition Tasks.cpp:12
Vruta::Event on_message_from(std::shared_ptr< Vruta::NetworkSource > source, std::string sender_address, std::function< void(const Core::NetworkMessage &)> callback)
Creates an Event coroutine that fires only for messages from a specific sender.
Vruta::Event on_message(std::shared_ptr< Vruta::NetworkSource > source, std::function< void(const Core::NetworkMessage &)> callback)
Creates an Event coroutine that fires on every message received by a source.
uint64_t samples_to_blocks(uint64_t samples, uint32_t block_size)
Convert samples to number of processing blocks.
uint64_t seconds_to_blocks(double seconds, uint32_t sample_rate, uint32_t block_size)
Convert seconds to number of processing blocks.
bool cancel_event_handler(const std::string &name)
Cancel an event handler by name.
Definition Chronie.cpp:280
void on_mouse_move(const std::shared_ptr< Core::Window > &window, std::function< void(double, double)> callback, std::string name)
Schedule a mouse movement handler.
Definition Chronie.cpp:231
bool update_task_params(const std::string &name, Args... args)
Updates parameters of a scheduled task.
Definition Chronie.cpp:33
void on_scroll(const std::shared_ptr< Core::Window > &window, std::function< void(double, double)> callback, std::string name)
Schedule a mouse scroll handler.
Definition Chronie.cpp:264
void on_mouse_drag(const std::shared_ptr< Core::Window > &window, IO::MouseButtons button, std::function< void(double, double)> callback, std::string name)
Schedule a mouse drag handler.
Definition Chronie.cpp:247
std::shared_ptr< Vruta::EventManager > get_event_manager()
Gets the event manager from the default engine.
Definition Chronie.cpp:27
bool restart_task(const std::string &name)
Restarts a scheduled task.
Definition Chronie.cpp:132
void schedule_metro(double interval_seconds, std::function< void()> callback, std::string name, Vruta::ProcessingToken token)
Creates a metronome task and addes it to the default scheduler list for evaluation.
Definition Chronie.cpp:38
void schedule_sequence(std::vector< std::pair< double, std::function< void()> > > seq, std::string name, Vruta::ProcessingToken token)
Creates a sequence task that calls functions at specified times and addes it to the default scheduler...
Definition Chronie.cpp:49
uint64_t seconds_to_samples(double seconds)
Converts a time duration in seconds to the equivalent number of audio samples.
Definition Chronie.cpp:285
void on_mouse_pressed(const std::shared_ptr< Core::Window > &window, IO::MouseButtons button, std::function< void(double, double)> callback, std::string name)
Schedule a mouse button press handler.
Definition Chronie.cpp:197
void schedule_task(const std::string &name, Vruta::SoundRoutine &&task, bool initialize)
Schedules a new sound routine task.
Definition Chronie.cpp:104
float * get_line_value(const std::string &name)
Gets a pointer to a task's current value.
Definition Chronie.cpp:89
void schedule_pattern(std::function< std::any(uint64_t)> pattern_func, std::function< void(std::any)> callback, std::vector< double > durations, std::string name, Vruta::ProcessingToken token)
Schedules a pattern generator whose steps are spaced by a list of durations.
Definition Chronie.cpp:74
uint64_t seconds_to_blocks(double seconds)
Converts a time duration in seconds to the equivalent number of processing blocks.
Definition Chronie.cpp:294
void on_key_released(const std::shared_ptr< Core::Window > &window, IO::Keys key, std::function< void()> callback, std::string name)
Schedule a key release handler.
Definition Chronie.cpp:164
std::shared_ptr< Kriya::BufferPipeline > create_buffer_pipeline()
Creates a new buffer pipeline instance.
Definition Chronie.cpp:137
std::shared_ptr< Vruta::SoundRoutine > schedule_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool retain, std::string name)
Creates a line generator that interpolates between values over time and schedules it for evaluation.
Definition Chronie.cpp:61
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager from the default engine.
Definition Graph.cpp:148
bool cancel_task(const std::string &name)
Cancels a scheduled task.
Definition Chronie.cpp:127
void on_network_message_from(std::shared_ptr< Vruta::NetworkSource > source, std::string sender_address, std::function< void(const Core::NetworkMessage &)> callback, std::string name)
Schedule an on_message_from handler with an existing NetworkSource.
Definition Chronie.cpp:352
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:101
double samples_to_seconds(uint64_t samples)
Converts a number of audio samples to the equivalent time duration in seconds.
Definition Chronie.cpp:318
void on_mouse_released(const std::shared_ptr< Core::Window > &window, IO::MouseButtons button, std::function< void(double, double)> callback, std::string name)
Schedule a mouse button release handler.
Definition Chronie.cpp:214
void on_network_message(std::shared_ptr< Vruta::NetworkSource > source, std::function< void(const Core::NetworkMessage &)> callback, std::string name)
Schedule an on_message handler with an existing NetworkSource.
Definition Chronie.cpp:328
void on_network_message_matching(std::shared_ptr< Vruta::NetworkSource > source, std::function< bool(const Core::NetworkMessage &)> predicate, std::function< void(const Core::NetworkMessage &)> callback, std::string name)
Schedule an on_message_matching handler with an existing NetworkSource.
Definition Chronie.cpp:379
uint64_t samples_to_blocks(uint64_t samples)
Converts samples to blocks based on current block size.
Definition Chronie.cpp:307
std::shared_ptr< Vruta::TaskScheduler > get_scheduler()
Gets the task scheduler from the default engine.
Definition Chronie.cpp:22
void on_any_key(const std::shared_ptr< Core::Window > &window, std::function< void(IO::Keys)> callback, std::string name)
Schedule a handler for any key press.
Definition Chronie.cpp:181
void on_key_pressed(const std::shared_ptr< Core::Window > &window, IO::Keys key, std::function< void()> callback, std::string name)
Schedule a key press handler.
Definition Chronie.cpp:147
Main namespace for the Maya Flux audio engine.
Definition Runtime.cpp:12
Describes one logical send/receive endpoint managed by a backend.
uint32_t buffer_size
Number of samples per processing block.
uint32_t sample_rate
Number of samples processed per second (Hz)
A received datagram or framed message with sender metadata.