MayaFlux 0.3.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
15
17
18namespace MayaFlux {
19
20std::shared_ptr<Vruta::TaskScheduler> get_scheduler()
21{
22 return get_context().get_scheduler();
23}
24
25std::shared_ptr<Vruta::EventManager> get_event_manager()
26{
28}
29
30template <typename... Args>
31bool update_task_params(const std::string& name, Args... args)
32{
33 return get_scheduler()->update_task_params(name, args...);
34}
35
36Vruta::SoundRoutine create_metro(double interval_seconds, std::function<void()> callback)
37{
38 return Kriya::metro(*get_scheduler(), interval_seconds, std::move(callback));
39}
40
41void schedule_metro(double interval_seconds, std::function<void()> callback, std::string name)
42{
43 auto scheduler = get_scheduler();
44 if (name.empty()) {
45 name = "metro_" + std::to_string(scheduler->get_next_task_id());
46 }
47 auto metronome = std::make_shared<Vruta::SoundRoutine>(create_metro(interval_seconds, std::move(callback)));
48
49 get_scheduler()->add_task(std::move(metronome), name, false);
50}
51
52Vruta::SoundRoutine create_sequence(std::vector<std::pair<double, std::function<void()>>> seq)
53{
54 return Kriya::sequence(*get_scheduler(), std::move(seq));
55}
56
57void schedule_sequence(std::vector<std::pair<double, std::function<void()>>> seq, std::string name)
58{
59 auto scheduler = get_scheduler();
60 if (name.empty()) {
61 name = "seq_" + std::to_string(scheduler->get_next_task_id());
62 }
63 auto tseq = std::make_shared<Vruta::SoundRoutine>(create_sequence(std::move(seq)));
64 get_scheduler()->add_task(std::move(tseq), name, false);
65}
66
67Vruta::SoundRoutine create_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool loop)
68{
69 return Kriya::line(*get_scheduler(), start_value, end_value, duration_seconds, step_duration, loop);
70}
71
72Vruta::SoundRoutine create_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, double interval_seconds)
73{
74 return Kriya::pattern(*get_scheduler(), std::move(pattern_func), std::move(callback), interval_seconds);
75}
76
77void schedule_pattern(std::function<std::any(uint64_t)> pattern_func, std::function<void(std::any)> callback, double interval_seconds, std::string name)
78{
79 auto scheduler = get_scheduler();
80 if (name.empty()) {
81 name = "pattern_" + std::to_string(scheduler->get_next_task_id());
82 }
83 auto pattern = std::make_shared<Vruta::SoundRoutine>(create_pattern(std::move(pattern_func), std::move(callback), interval_seconds));
84 get_scheduler()->add_task(std::move(pattern), name, false);
85}
86
87float* get_line_value(const std::string& name)
88{
89 if (auto task = get_scheduler()->get_task(name)) {
90 auto cur_val = task->get_state<float>("current_value");
91 if (cur_val) {
92 return cur_val;
93 }
94
95 MF_ERROR(Journal::Component::API, Journal::Context::CoroutineScheduling, "line value not returned from task. Verify that tasks has not returned");
96 return nullptr;
97 }
98 MF_ERROR(Journal::Component::API, Journal::Context::CoroutineScheduling, "Task: {} not found. Verify task validity or if its been scheduled", name);
99 return nullptr;
100}
101
102void schedule_task(const std::string& name, Vruta::SoundRoutine&& task, bool initialize)
103{
104 auto task_ptr = std::make_shared<Vruta::SoundRoutine>(std::move(task));
105 get_scheduler()->add_task(std::move(task_ptr), name, initialize);
106}
107
108bool cancel_task(const std::string& name)
109{
110 return get_scheduler()->cancel_task(name);
111}
112
113bool restart_task(const std::string& name)
114{
115 return get_scheduler()->restart_task(name);
116}
117
118std::shared_ptr<Kriya::BufferPipeline> create_buffer_pipeline()
119{
121}
122
124 const std::shared_ptr<Core::Window>& window,
125 IO::Keys key,
126 std::function<void()> callback,
127 std::string name)
128{
129 auto event_manager = get_event_manager();
130 if (name.empty()) {
131 name = "key_press_" + std::to_string(event_manager->get_next_event_id());
132 }
133
134 auto event = std::make_shared<Vruta::Event>(
135 Kriya::key_pressed(window, key, std::move(callback)));
136
137 event_manager->add_event(event, name);
138}
139
141 const std::shared_ptr<Core::Window>& window,
142 IO::Keys key,
143 std::function<void()> callback,
144 std::string name)
145{
146 auto event_manager = get_event_manager();
147 if (name.empty()) {
148 name = "key_release_" + std::to_string(event_manager->get_next_event_id());
149 }
150
151 auto event = std::make_shared<Vruta::Event>(
152 Kriya::key_released(window, key, std::move(callback)));
153
154 event_manager->add_event(event, name);
155}
156
158 const std::shared_ptr<Core::Window>& window,
159 std::function<void(IO::Keys)> callback,
160 std::string name)
161{
162 auto event_manager = get_event_manager();
163 if (name.empty()) {
164 name = "any_key_" + std::to_string(event_manager->get_next_event_id());
165 }
166
167 auto event = std::make_shared<Vruta::Event>(
168 Kriya::any_key(window, std::move(callback)));
169
170 event_manager->add_event(event, name);
171}
172
174 const std::shared_ptr<Core::Window>& window,
175 IO::MouseButtons button,
176 std::function<void(double, double)> callback,
177 std::string name)
178{
179 auto event_manager = get_event_manager();
180 if (name.empty()) {
181 name = "mouse_press_" + std::to_string(event_manager->get_next_event_id());
182 }
183
184 auto event = std::make_shared<Vruta::Event>(
185 Kriya::mouse_pressed(window, button, std::move(callback)));
186
187 event_manager->add_event(event, name);
188}
189
191 const std::shared_ptr<Core::Window>& window,
192 IO::MouseButtons button,
193 std::function<void(double, double)> callback,
194 std::string name)
195{
196 auto event_manager = get_event_manager();
197 if (name.empty()) {
198 name = "mouse_release_" + std::to_string(event_manager->get_next_event_id());
199 }
200
201 auto event = std::make_shared<Vruta::Event>(
202 Kriya::mouse_released(window, button, std::move(callback)));
203
204 event_manager->add_event(event, name);
205}
206
208 const std::shared_ptr<Core::Window>& window,
209 std::function<void(double, double)> callback,
210 std::string name)
211{
212 auto event_manager = get_event_manager();
213 if (name.empty()) {
214 name = "mouse_move_" + std::to_string(event_manager->get_next_event_id());
215 }
216
217 auto event = std::make_shared<Vruta::Event>(
218 Kriya::mouse_moved(window, std::move(callback)));
219
220 event_manager->add_event(event, name);
221}
222
224 const std::shared_ptr<Core::Window>& window,
225 std::function<void(double, double)> callback,
226 std::string name)
227{
228 auto event_manager = get_event_manager();
229 if (name.empty()) {
230 name = "scroll_" + std::to_string(event_manager->get_next_event_id());
231 }
232
233 auto event = std::make_shared<Vruta::Event>(
234 Kriya::mouse_scrolled(window, std::move(callback)));
235
236 event_manager->add_event(event, name);
237}
238
239bool cancel_event_handler(const std::string& name)
240{
241 return get_event_manager()->cancel_event(name);
242}
243
244uint64_t seconds_to_samples(double seconds)
245{
246 uint64_t sample_rate = 48000;
247 if (get_context().is_running()) {
248 sample_rate = get_context().get_stream_info().sample_rate;
249 }
250 return static_cast<uint64_t>(seconds * sample_rate);
251}
252
253uint64_t seconds_to_blocks(double seconds)
254{
255 uint32_t sample_rate = 48000;
256 uint32_t block_size = 512;
257
258 if (get_context().is_running()) {
259 sample_rate = get_context().get_stream_info().sample_rate;
260 block_size = get_context().get_stream_info().buffer_size;
261 }
262
263 return Vruta::seconds_to_blocks(seconds, sample_rate, block_size);
264}
265
266uint64_t samples_to_blocks(uint64_t samples)
267{
268 uint32_t block_size = 512;
269
270 if (get_context().is_running()) {
271 block_size = get_context().get_stream_info().buffer_size;
272 }
273
274 return Vruta::samples_to_blocks(samples, block_size);
275}
276
277}
#define MF_ERROR(comp, ctx,...)
Core engine lifecycle and configuration API.
GlobalStreamInfo & get_stream_info()
Gets the current stream configuration.
Definition Engine.hpp:212
std::shared_ptr< Vruta::EventManager > get_event_manager()
Gets the event manager.
Definition Engine.hpp:285
std::shared_ptr< Vruta::TaskScheduler > get_scheduler()
Gets the task scheduler.
Definition Engine.hpp:258
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:22
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::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:91
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:31
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:8
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:239
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:207
bool update_task_params(const std::string &name, Args... args)
Updates parameters of a scheduled task.
Definition Chronie.cpp:31
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:223
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:41
std::shared_ptr< Vruta::EventManager > get_event_manager()
Gets the event manager from the default engine.
Definition Chronie.cpp:25
bool restart_task(const std::string &name)
Restarts a scheduled task.
Definition Chronie.cpp:113
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:72
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:57
uint64_t seconds_to_samples(double seconds)
Converts a time duration in seconds to the equivalent number of audio samples.
Definition Chronie.cpp:244
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:173
Vruta::SoundRoutine create_line(float start_value, float end_value, float duration_seconds, uint32_t step_duration, bool loop)
Creates a line generator that interpolates between values over time.
Definition Chronie.cpp:67
void schedule_task(const std::string &name, Vruta::SoundRoutine &&task, bool initialize)
Schedules a new sound routine task.
Definition Chronie.cpp:102
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:77
float * get_line_value(const std::string &name)
Gets a pointer to a task's current value.
Definition Chronie.cpp:87
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:36
uint64_t seconds_to_blocks(double seconds)
Converts a time duration in seconds to the equivalent number of processing blocks.
Definition Chronie.cpp:253
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:140
std::shared_ptr< Kriya::BufferPipeline > create_buffer_pipeline()
Creates a new buffer pipeline instance.
Definition Chronie.cpp:118
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:108
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:58
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:190
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:52
uint64_t samples_to_blocks(uint64_t samples)
Converts samples to blocks based on current block size.
Definition Chronie.cpp:266
std::shared_ptr< Vruta::TaskScheduler > get_scheduler()
Gets the task scheduler from the default engine.
Definition Chronie.cpp:20
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:157
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:123
Main namespace for the Maya Flux audio engine.
Definition LiveAid.hpp:6
uint32_t buffer_size
Number of samples per processing block.
uint32_t sample_rate
Number of samples processed per second (Hz)