MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
ProcessingArchitecture.cpp
Go to the documentation of this file.
2
5
8
10
12
13namespace MayaFlux::Core {
14
16 std::shared_ptr<Buffers::BufferManager> manager,
18 : m_manager(std::move(manager))
19 , m_token(token)
20 , m_locked(false)
21{
22}
23
25{
26 if (!m_manager) {
28 std::source_location::current(),
29 "Invalid buffer processing handle: BufferManager is null");
30 }
31}
32
34{
35 if (!m_locked) {
36 m_locked = true;
37 }
38}
39
40void BufferProcessingHandle::process(uint32_t processing_units)
41{
43 m_manager->process_token(m_token, processing_units);
44}
45
46void BufferProcessingHandle::process_channel(uint32_t channel, uint32_t processing_units)
47{
49 m_manager->process_channel(m_token, channel, processing_units);
50}
51
53 uint32_t channel,
54 uint32_t processing_units,
55 const std::vector<double>& node_data)
56{
58 m_manager->process_channel(m_token, channel, processing_units, node_data);
59}
60
61void BufferProcessingHandle::destroy_window(const std::shared_ptr<Core::Window>& window)
62{
64 m_manager->get_root_graphics_buffer(m_token)->detach_window(window);
65}
66
67void BufferProcessingHandle::process_input(double* input_data, uint32_t num_channels, uint32_t num_frames)
68{
69 m_manager->process_input(input_data, num_channels, num_frames);
70}
71
72std::span<const double> BufferProcessingHandle::read_channel_data(uint32_t channel) const
73{
75 return m_manager->get_buffer_data(m_token, channel);
76}
77
78std::span<double> BufferProcessingHandle::write_channel_data(uint32_t channel)
79{
82 return m_manager->get_buffer_data(m_token, channel);
83}
84
86{
88 m_manager->update_routing_states(m_token);
89}
90
92{
94 m_manager->cleanup_completed_routing(m_token);
95}
96
97void BufferProcessingHandle::setup_channels(uint32_t num_channels, uint32_t buffer_size)
98{
100 m_manager->validate_num_channels(m_token, num_channels, buffer_size);
101}
102
104 std::shared_ptr<Nodes::NodeGraphManager> manager,
106 : m_manager(std::move(manager))
107 , m_token(token)
108{
109}
110
111void NodeProcessingHandle::process(uint32_t num_samples)
112{
113 m_manager->process_token(m_token, num_samples);
114}
115
116std::vector<double> NodeProcessingHandle::process_channel(uint32_t channel, uint32_t num_samples)
117{
118 return m_manager->process_channel(m_token, channel, num_samples);
119}
120
122{
123 return m_manager->process_sample(m_token, channel);
124}
125
126std::vector<std::vector<double>> NodeProcessingHandle::process_audio_networks(uint32_t num_samples, uint32_t channel)
127{
128 return m_manager->process_audio_networks(m_token, num_samples, channel);
129}
130
132{
133 m_manager->update_routing_states_for_cycle(m_token);
134}
135
137{
138 m_manager->cleanup_completed_routing(m_token);
139}
140
142 std::shared_ptr<Vruta::TaskScheduler> task_manager,
144 : m_scheduler(std::move(task_manager))
145 , m_token(token)
146{
147 if (!m_scheduler) {
149 std::source_location::current(),
150 "TaskSchedulerHandle requires valid TaskScheduler");
151 }
152}
153
155{
156 m_scheduler->register_token_processor(m_token, std::move(processor));
157}
158
159void TaskSchedulerHandle::register_clock(Vruta::ProcessingToken token, std::shared_ptr<Vruta::IClock> clock)
160{
161 m_scheduler->register_clock(token, std::move(clock));
162}
163
164void TaskSchedulerHandle::process(uint64_t processing_units)
165{
166 m_scheduler->process_token(m_token, processing_units);
167}
168
170{
171 m_scheduler->process_buffer_cycle_tasks();
172}
173
174WindowManagerHandle::WindowManagerHandle(std::shared_ptr<Core::WindowManager> window_manager)
175 : m_window_manager(std::move(window_manager))
176{
177}
178
180{
181 if (m_window_manager) {
182 m_window_manager->process();
183 }
184}
185
186std::vector<std::shared_ptr<Core::Window>> WindowManagerHandle::get_processing_windows() const
187{
188 if (m_window_manager) {
189 return m_window_manager->get_processing_windows();
190 }
191 return {};
192}
193
194InputManagerHandle::InputManagerHandle(std::shared_ptr<InputManager> input_manager)
195 : m_input_manager(std::move(input_manager))
196{
197}
198
200{
201 if (m_input_manager) {
202 m_input_manager->start();
203 }
204}
205
207{
208 if (m_input_manager) {
209 m_input_manager->stop();
210 }
211}
212
214{
215 if (m_input_manager) {
216 m_input_manager->unregister_all_nodes();
217 }
218}
219
221{
222 if (m_input_manager) {
223 m_input_manager->enqueue(value);
224 }
225}
226
228{
229 if (m_input_manager) {
230 m_input_manager->setup_osc_bridge(config);
231 }
232}
233
235 std::shared_ptr<Buffers::BufferManager> buffer_manager,
236 std::shared_ptr<Nodes::NodeGraphManager> node_manager,
237 std::shared_ptr<Vruta::TaskScheduler> task_scheduler,
238 std::shared_ptr<WindowManager> window_manager,
239 std::shared_ptr<InputManager> input_manager,
240 SubsystemTokens tokens)
241 : buffers(std::move(buffer_manager), tokens.Buffer)
242 , nodes(std::move(node_manager), tokens.Node)
243 , tasks(std::move(task_scheduler), tokens.Task)
244 , windows(std::move(window_manager))
245 , inputs(std::move(input_manager))
246 , m_tokens(tokens)
247{
248}
249
250}
std::weak_ptr< Core::Window > window
Definition Picker.cpp:23
Unified processing architecture for multimodal subsystem coordination.
glm::vec3 value
std::span< double > write_channel_data(uint32_t channel)
Get write access to channel data with automatic locking.
std::span< const double > read_channel_data(uint32_t channel) const
Get read-only access to channel data.
void process_channel(uint32_t channel, uint32_t processing_units)
Process specific channel.
BufferProcessingHandle(std::shared_ptr< Buffers::BufferManager > manager, Buffers::ProcessingToken token)
Constructs handle for specific buffer manager and token.
void process(uint32_t processing_units)
Process all channels in token domain.
void setup_channels(uint32_t num_channels, uint32_t buffer_size)
Configure channel layout for token domain.
void process_channel_with_node_data(uint32_t channel, uint32_t processing_units, const std::vector< double > &node_data)
Process channel with node output data integration.
std::shared_ptr< Buffers::BufferManager > m_manager
void process_input(double *input_data, uint32_t num_channels, uint32_t num_frames)
@brienf Process Input from backend into buffer manager
void destroy_window(const std::shared_ptr< Core::Window > &window)
Detach graphics presentation for a window in this token domain.
InputManagerHandle(std::shared_ptr< InputManager > input_manager)
Constructs handle for specific InputManager.
void unregister()
unregister all nodes from InputManager
void enqueue_input(const InputValue &value)
enqueue input value to InputManager
void setup_osc_bridge(const OSCConfigInfo &config)
enqueue batch of input values to InputManager
std::shared_ptr< InputManager > m_input_manager
void process(uint32_t num_samples)
Process all nodes in token domain.
std::vector< double > process_channel(uint32_t channel, uint32_t num_samples)
Process nodes for specific channel and return output.
std::vector< std::vector< double > > process_audio_networks(uint32_t num_samples, uint32_t channel=0)
std::shared_ptr< Nodes::NodeGraphManager > m_manager
NodeProcessingHandle(std::shared_ptr< Nodes::NodeGraphManager > manager, Nodes::ProcessingToken token)
Constructs handle for specific node manager and token.
SubsystemProcessingHandle(std::shared_ptr< Buffers::BufferManager > buffer_manager, std::shared_ptr< Nodes::NodeGraphManager > node_manager, std::shared_ptr< Vruta::TaskScheduler > task_scheduler, std::shared_ptr< WindowManager > window_manager, std::shared_ptr< InputManager > input_manager, SubsystemTokens tokens)
void register_token_processor(Vruta::token_processing_func_t processor)
Register custom processing function for token domain.
void process_buffer_cycle()
Process all tasks scheduled for current buffer cycle.
TaskSchedulerHandle(std::shared_ptr< MayaFlux::Vruta::TaskScheduler > task_manager, MayaFlux::Vruta::ProcessingToken token)
void register_clock(Vruta::ProcessingToken token, std::shared_ptr< Vruta::IClock > clock)
Register an externally-owned clock for a token domain.
std::shared_ptr< Vruta::TaskScheduler > m_scheduler
void process(uint64_t processing_units)
Process all tasks in token domain.
void process()
Process window events and frame hooks.
std::shared_ptr< Core::WindowManager > m_window_manager
std::vector< std::shared_ptr< Core::Window > > get_processing_windows() const
Get list of windows that are open and not minimized.
WindowManagerHandle(std::shared_ptr< Core::WindowManager > window_manager)
Constructs handle for specific window manager.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ CoroutineScheduling
Coroutine scheduling and temporal coordination (Vruta::TaskScheduler)
@ Core
Core engine, backend, subsystems.
ProcessingToken
Enumerates the different processing domains for nodes.
std::function< void(const std::vector< std::shared_ptr< Routine > > &, uint64_t)> token_processing_func_t
Function type for processing tasks in a specific token domain.
Generic input value container.
OSC backend configuration.
Processing token configuration for subsystem operation.