MayaFlux 0.4.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
38Vruta::SoundRoutine create_metro(double interval_seconds, std::function<void()> callback)
39{
40 return Kriya::metro(*get_scheduler(), interval_seconds, std::move(callback));
41}
42
43void schedule_metro(double interval_seconds, std::function<void()> callback, std::string name)
44{
45 auto scheduler = get_scheduler();
46 if (name.empty()) {
47 name = "metro_" + std::to_string(scheduler->get_next_task_id());
48 }
49 auto metronome = std::make_shared<Vruta::SoundRoutine>(create_metro(interval_seconds, std::move(callback)));
50
51 get_scheduler()->add_task(std::move(metronome), name, false);
52}
53
54Vruta::SoundRoutine create_sequence(std::vector<std::pair<double, std::function<void()>>> seq)
55{
56 return Kriya::sequence(*get_scheduler(), std::move(seq));
57}
58
59void schedule_sequence(std::vector<std::pair<double, std::function<void()>>> seq, std::string name)
60{
61 auto scheduler = get_scheduler();
62 if (name.empty()) {
63 name = "seq_" + std::to_string(scheduler->get_next_task_id());
64 }
65 auto tseq = std::make_shared<Vruta::SoundRoutine>(create_sequence(std::move(seq)));
66 get_scheduler()->add_task(std::move(tseq), name, false);
67}
68
69Vruta::SoundRoutine create_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool retain)
70{
71 return Kriya::line(*get_scheduler(), start_value, end_value, duration_seconds, step_duration, retain);
72}
73
74Vruta::SoundRoutine create_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, double interval_seconds)
75{
76 return Kriya::pattern(*get_scheduler(), std::move(pattern_func), std::move(callback), interval_seconds);
77}
78
79void schedule_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, double interval_seconds, std::string name)
80{
81 auto scheduler = get_scheduler();
82 if (name.empty()) {
83 name = "pattern_" + std::to_string(scheduler->get_next_task_id());
84 }
85 auto pattern = std::make_shared<Vruta::SoundRoutine>(create_pattern(std::move(pattern_func), std::move(callback), interval_seconds));
86 get_scheduler()->add_task(std::move(pattern), name, false);
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
110bool cancel_task(const std::string& name)
111{
112 return get_scheduler()->cancel_task(name);
113}
114
115bool restart_task(const std::string& name)
116{
117 return get_scheduler()->restart_task(name);
118}
119
120std::shared_ptr<Kriya::BufferPipeline> create_buffer_pipeline()
121{
123}
124
126 const std::shared_ptr<Core::Window>& window,
127 IO::Keys key,
128 std::function<void()> callback,
129 std::string name)
130{
131 auto event_manager = get_event_manager();
132 if (name.empty()) {
133 name = "key_press_" + std::to_string(event_manager->get_next_event_id());
134 }
135
136 auto event = std::make_shared<Vruta::Event>(
137 Kriya::key_pressed(window, key, std::move(callback)));
138
139 event_manager->add_event(event, name);
140}
141
143 const std::shared_ptr<Core::Window>& window,
144 IO::Keys key,
145 std::function<void()> callback,
146 std::string name)
147{
148 auto event_manager = get_event_manager();
149 if (name.empty()) {
150 name = "key_release_" + std::to_string(event_manager->get_next_event_id());
151 }
152
153 auto event = std::make_shared<Vruta::Event>(
154 Kriya::key_released(window, key, std::move(callback)));
155
156 event_manager->add_event(event, name);
157}
158
160 const std::shared_ptr<Core::Window>& window,
161 std::function<void(IO::Keys)> callback,
162 std::string name)
163{
164 auto event_manager = get_event_manager();
165 if (name.empty()) {
166 name = "any_key_" + std::to_string(event_manager->get_next_event_id());
167 }
168
169 auto event = std::make_shared<Vruta::Event>(
170 Kriya::any_key(window, std::move(callback)));
171
172 event_manager->add_event(event, name);
173}
174
176 const std::shared_ptr<Core::Window>& window,
177 IO::MouseButtons button,
178 std::function<void(double, double)> callback,
179 std::string name)
180{
181 auto event_manager = get_event_manager();
182 if (name.empty()) {
183 name = "mouse_press_" + std::to_string(event_manager->get_next_event_id());
184 }
185
186 auto event = std::make_shared<Vruta::Event>(
187 Kriya::mouse_pressed(window, button, std::move(callback)));
188
189 event_manager->add_event(event, name);
190}
191
193 const std::shared_ptr<Core::Window>& window,
194 IO::MouseButtons button,
195 std::function<void(double, double)> callback,
196 std::string name)
197{
198 auto event_manager = get_event_manager();
199 if (name.empty()) {
200 name = "mouse_release_" + std::to_string(event_manager->get_next_event_id());
201 }
202
203 auto event = std::make_shared<Vruta::Event>(
204 Kriya::mouse_released(window, button, std::move(callback)));
205
206 event_manager->add_event(event, name);
207}
208
210 const std::shared_ptr<Core::Window>& window,
211 std::function<void(double, double)> callback,
212 std::string name)
213{
214 auto event_manager = get_event_manager();
215 if (name.empty()) {
216 name = "mouse_move_" + std::to_string(event_manager->get_next_event_id());
217 }
218
219 auto event = std::make_shared<Vruta::Event>(
220 Kriya::mouse_moved(window, std::move(callback)));
221
222 event_manager->add_event(event, name);
223}
224
226 const std::shared_ptr<Core::Window>& window,
227 std::function<void(double, double)> callback,
228 std::string name)
229{
230 auto event_manager = get_event_manager();
231 if (name.empty()) {
232 name = "scroll_" + std::to_string(event_manager->get_next_event_id());
233 }
234
235 auto event = std::make_shared<Vruta::Event>(
236 Kriya::mouse_scrolled(window, std::move(callback)));
237
238 event_manager->add_event(event, name);
239}
240
241bool cancel_event_handler(const std::string& name)
242{
243 return get_event_manager()->cancel_event(name);
244}
245
246uint64_t seconds_to_samples(double seconds)
247{
248 uint64_t sample_rate = 48000;
249 if (get_context().is_running()) {
250 sample_rate = get_context().get_stream_info().sample_rate;
251 }
252 return static_cast<uint64_t>(seconds * (double)sample_rate);
253}
254
255uint64_t seconds_to_blocks(double seconds)
256{
257 uint32_t sample_rate = 48000;
258 uint32_t block_size = 512;
259
260 if (get_context().is_running()) {
261 sample_rate = get_context().get_stream_info().sample_rate;
262 block_size = get_context().get_stream_info().buffer_size;
263 }
264
265 return Vruta::seconds_to_blocks(seconds, sample_rate, block_size);
266}
267
268uint64_t samples_to_blocks(uint64_t samples)
269{
270 uint32_t block_size = 512;
271
272 if (get_context().is_running()) {
273 block_size = get_context().get_stream_info().buffer_size;
274 }
275
276 return Vruta::samples_to_blocks(samples, block_size);
277}
278
279double samples_to_seconds(uint64_t samples)
280{
281 uint64_t sample_rate = 48000;
282 if (get_context().is_running()) {
283 sample_rate = get_context().get_stream_info().sample_rate;
284 }
285
286 return static_cast<double>(samples) / (double)sample_rate;
287}
288
290 std::shared_ptr<Vruta::NetworkSource> source,
291 std::function<void(const Core::NetworkMessage&)> callback,
292 std::string name)
293{
294 auto event_manager = get_event_manager();
295 if (name.empty()) {
296 name = "net_msg_" + std::to_string(event_manager->get_next_event_id());
297 }
298 event_manager->add_event(
299 std::make_shared<Vruta::Event>(Kriya::on_message(std::move(source), std::move(callback))),
300 name);
301}
302
303std::shared_ptr<Vruta::NetworkSource> on_network_message(
304 const Core::EndpointInfo& info,
305 std::function<void(const Core::NetworkMessage&)> callback,
306 std::string name)
307{
308 auto source = std::make_shared<Vruta::NetworkSource>(info);
309 on_network_message(source, std::move(callback), std::move(name));
310 return source;
311}
312
314 std::shared_ptr<Vruta::NetworkSource> source,
315 std::string sender_address,
316 std::function<void(const Core::NetworkMessage&)> callback,
317 std::string name)
318{
319 auto event_manager = get_event_manager();
320 if (name.empty()) {
321 name = "net_msg_from_" + std::to_string(event_manager->get_next_event_id());
322 }
323 event_manager->add_event(
324 std::make_shared<Vruta::Event>(
325 Kriya::on_message_from(std::move(source), std::move(sender_address), std::move(callback))),
326 name);
327}
328
329std::shared_ptr<Vruta::NetworkSource> on_network_message_from(
330 const Core::EndpointInfo& info,
331 std::string sender_address,
332 std::function<void(const Core::NetworkMessage&)> callback,
333 std::string name)
334{
335 auto source = std::make_shared<Vruta::NetworkSource>(info);
336 on_network_message_from(source, std::move(sender_address), std::move(callback), std::move(name));
337 return source;
338}
339
341 std::shared_ptr<Vruta::NetworkSource> source,
342 std::function<bool(const Core::NetworkMessage&)> predicate,
343 std::function<void(const Core::NetworkMessage&)> callback,
344 std::string name)
345{
346 auto event_manager = get_event_manager();
347 if (name.empty()) {
348 name = "net_msg_match_" + std::to_string(event_manager->get_next_event_id());
349 }
350 event_manager->add_event(
351 std::make_shared<Vruta::Event>(
352 Kriya::on_message_matching(std::move(source), std::move(predicate), std::move(callback))),
353 name);
354}
355
356std::shared_ptr<Vruta::NetworkSource> on_network_message_matching(
357 const Core::EndpointInfo& info,
358 std::function<bool(const Core::NetworkMessage&)> predicate,
359 std::function<void(const Core::NetworkMessage&)> callback,
360 std::string name)
361{
362 auto source = std::make_shared<Vruta::NetworkSource>(info);
363 on_network_message_matching(source, std::move(predicate), std::move(callback), std::move(name));
364 return source;
365}
366
367}
#define MF_ERROR(comp, ctx,...)
Core engine lifecycle and configuration API.
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)
A C++20 coroutine-based audio processing task with sample-accurate timing.
Definition Routine.hpp:316
void initialize()
Definition main.cpp:11
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.
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 sequence(Vruta::TaskScheduler &scheduler, std::vector< std::pair< double, std::function< void()> > > sequence)
Creates a temporal sequence that executes callbacks at specified time offsets.
Definition Tasks.cpp:24
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::SoundRoutine pattern(Vruta::TaskScheduler &scheduler, std::function< std::any(uint64_t)> pattern_func, std::function< void(std::any)> callback, double interval_seconds)
Creates a generative algorithm that produces values based on a pattern function.
Definition Tasks.cpp:93
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.
Vruta::SoundRoutine line(Vruta::TaskScheduler &scheduler, 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:33
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::SoundRoutine metro(Vruta::TaskScheduler &scheduler, double interval_seconds, std::function< void()> callback)
Creates a periodic event generator that executes a callback at regular intervals.
Definition Tasks.cpp:10
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:241
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:209
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:225
void schedule_metro(double interval_seconds, std::function< void()> callback, std::string name)
Creates a metronome task and addes it to the default scheduler list for evaluation.
Definition Chronie.cpp:43
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:115
Vruta::SoundRoutine create_pattern(std::function< std::any(uint64_t)> pattern_func, std::function< void(std::any)> callback, double interval_seconds)
Schedules a pattern generator that produces values based on a pattern function.
Definition Chronie.cpp:74
void schedule_sequence(std::vector< std::pair< double, std::function< void()> > > seq, std::string name)
Creates a sequence task that calls functions at specified times and addes it to the default scheduler...
Definition Chronie.cpp:59
uint64_t seconds_to_samples(double seconds)
Converts a time duration in seconds to the equivalent number of audio samples.
Definition Chronie.cpp:246
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:175
void schedule_task(const std::string &name, Vruta::SoundRoutine &&task, bool initialize)
Schedules a new sound routine task.
Definition Chronie.cpp:104
void schedule_pattern(std::function< std::any(uint64_t)> pattern_func, std::function< void(std::any)> callback, double interval_seconds, std::string name)
Schedules a pattern generator that produces values based on a pattern function and addes it to the de...
Definition Chronie.cpp:79
float * get_line_value(const std::string &name)
Gets a pointer to a task's current value.
Definition Chronie.cpp:89
Vruta::SoundRoutine create_metro(double interval_seconds, std::function< void()> callback)
Creates a simple task that calls a function at a specified interval.
Definition Chronie.cpp:38
uint64_t seconds_to_blocks(double seconds)
Converts a time duration in seconds to the equivalent number of processing blocks.
Definition Chronie.cpp:255
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:142
std::shared_ptr< Kriya::BufferPipeline > create_buffer_pipeline()
Creates a new buffer pipeline instance.
Definition Chronie.cpp:120
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager from the default engine.
Definition Graph.cpp:133
bool cancel_task(const std::string &name)
Cancels a scheduled task.
Definition Chronie.cpp:110
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:313
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:68
double samples_to_seconds(uint64_t samples)
Converts a number of audio samples to the equivalent time duration in seconds.
Definition Chronie.cpp:279
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:192
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:289
Vruta::SoundRoutine create_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool retain)
Creates a line generator that interpolates between values over time.
Definition Chronie.cpp:69
Vruta::SoundRoutine create_sequence(std::vector< std::pair< double, std::function< void()> > > seq)
Creates a sequence task that calls functions at specified times.
Definition Chronie.cpp:54
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:340
uint64_t samples_to_blocks(uint64_t samples)
Converts samples to blocks based on current block size.
Definition Chronie.cpp:268
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:159
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:125
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.