MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Graph.cpp
Go to the documentation of this file.
1#include "Graph.hpp"
2
3#include "Core.hpp"
4
10
12
13namespace MayaFlux {
14
15namespace internal {
16 std::shared_ptr<Buffers::BufferProcessor> attach_quick_process_audio(Buffers::AudioProcessingFunction processor, const std::shared_ptr<Buffers::AudioBuffer>& buffer)
17 {
18 return get_buffer_manager()->attach_quick_process(std::move(processor), buffer, Buffers::ProcessingToken::AUDIO_BACKEND);
19 }
20
21 std::shared_ptr<Buffers::BufferProcessor> attach_quick_process_graphics(Buffers::GraphicsProcessingFunction processor, const std::shared_ptr<Buffers::VKBuffer>& buffer)
22 {
23 return get_buffer_manager()->attach_quick_process(std::move(processor), buffer, Buffers::ProcessingToken::GRAPHICS_BACKEND);
24 }
25}
26
27//-------------------------------------------------------------------------
28// Node Graph Management
29//-------------------------------------------------------------------------
30
31std::shared_ptr<Nodes::NodeGraphManager> get_node_graph_manager()
32{
34}
35
36void register_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
37{
38 auto manager = get_node_graph_manager();
39 if (!manager) {
41 "Node graph manager not initialized - cannot register audio node");
42 return;
43 }
44 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
45 std::out_of_range err("Channel index out of range for audio node registration");
46 std::cerr << err.what() << '\n';
47 }
48 manager->add_to_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
49}
50
51void register_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
52{
53 for (const auto& channel : channels) {
54 register_audio_node(node, channel);
55 }
56}
57
58void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
59{
60 auto manager = get_node_graph_manager();
61 if (!manager) {
63 "Node graph manager not initialized - cannot unregister audio node");
64 return;
65 }
66
67 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
69 "Channel index out of range for audio node registration");
70 }
71 manager->remove_from_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
72}
73
74void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
75{
76 for (const auto& channel : channels) {
77 unregister_audio_node(node, channel);
78 }
79}
80
81void unregister_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
82{
83 auto manager = get_node_graph_manager();
84 if (!manager) {
86 "Node graph manager not initialized - cannot register node");
87 return;
88 }
89
90 if (channel >= manager->get_channel_count(token)) {
92 "Channel index out of range for audio node registration");
93 }
94 manager->remove_from_root(node, token, channel);
95}
96
98{
99 return *get_context().get_node_graph_manager()->get_all_root_nodes(Nodes::ProcessingToken::AUDIO_RATE)[channel];
100}
101
102void register_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
103{
104 get_context().get_node_graph_manager()->add_to_root(node, token, channel);
105}
106
107//-------------------------------------------------------------------------
108// Buffer Management
109//-------------------------------------------------------------------------
110
111std::shared_ptr<Buffers::BufferManager> get_buffer_manager()
112{
114}
115
116void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, const std::shared_ptr<Buffers::Buffer>& buffer, Buffers::ProcessingToken token)
117{
118 get_buffer_manager()->add_processor(processor, buffer, token);
119}
120
121void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token, uint32_t channel)
122{
123 get_buffer_manager()->add_processor(processor, token, channel);
124}
125
126void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token)
127{
128 get_buffer_manager()->add_processor(processor, token);
129}
130
131std::shared_ptr<Buffers::BufferProcessingChain> create_processing_chain()
132{
133 return std::make_shared<Buffers::BufferProcessingChain>();
134}
135
137{
138 return *get_buffer_manager()->get_root_audio_buffer(Buffers::ProcessingToken::AUDIO_BACKEND, channel);
139}
140
141void connect_node_to_channel(const std::shared_ptr<Nodes::Node>& node, uint32_t channel_index, float mix, bool clear_before)
142{
143 auto token = get_buffer_manager()->get_default_audio_token();
144 get_buffer_manager()->connect_node_to_channel(node, token, channel_index, mix, clear_before);
145}
146
147void connect_node_to_buffer(const std::shared_ptr<Nodes::Node>& node, const std::shared_ptr<Buffers::AudioBuffer>& buffer, float mix, bool clear_before)
148{
149 get_buffer_manager()->connect_node_to_buffer(node, buffer, mix, clear_before);
150}
151
152//-------------------------------------------------------------------------
153// Node Network Management
154//-------------------------------------------------------------------------
155
156void register_node_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const Nodes::ProcessingToken& token)
157{
158 get_context().get_node_graph_manager()->add_network(network, token);
159}
160
161void unregister_node_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const Nodes::ProcessingToken& token)
162{
163 get_context().get_node_graph_manager()->remove_network(network, token);
164}
165
166//-------------------------------------------------------------------------
167// Audio Processing
168//-------------------------------------------------------------------------
169
170std::shared_ptr<Buffers::BufferProcessor> attach_quick_process(Buffers::AudioProcessingFunction processor, unsigned int channel_id)
171{
172 return get_buffer_manager()->attach_quick_process(std::move(processor), Buffers::ProcessingToken::AUDIO_BACKEND, channel_id);
173}
174
175void register_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
176{
177 get_buffer_manager()->add_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
178}
179
180void unregister_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
181{
182 get_buffer_manager()->remove_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
183}
184
185void register_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer, Buffers::ProcessingToken token)
186{
187 get_buffer_manager()->add_buffer(buffer, token);
188}
189
190void unregister_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer)
191{
193}
194
195void read_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
196{
197 get_buffer_manager()->register_input_listener(buffer, channel);
198}
199
200void detach_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
201{
202 get_buffer_manager()->unregister_input_listener(buffer, channel);
203}
204
205std::shared_ptr<Buffers::AudioBuffer> create_input_listener_buffer(uint32_t channel, bool add_to_output)
206{
207 std::shared_ptr<Buffers::AudioBuffer> buffer = std::make_shared<Buffers::AudioBuffer>(channel);
208
209 if (add_to_output) {
210 register_audio_buffer(buffer, channel);
211 }
212 read_from_audio_input(buffer, channel);
213
214 return buffer;
215}
216
217std::vector<std::shared_ptr<Buffers::AudioBuffer>> clone_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
218 const std::vector<uint32_t>& channels)
219{
220 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, Buffers::ProcessingToken::AUDIO_BACKEND);
221}
222
223std::vector<std::shared_ptr<Buffers::AudioBuffer>> clone_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer, const std::vector<uint32_t>& channels, const Buffers::ProcessingToken& token)
224{
225 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, token);
226}
227
228void supply_buffer_to_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
229 uint32_t channel, double mix)
230{
231 auto manager = get_buffer_manager();
232 if (!manager) {
234 "Buffer manager not initialized - cannot perform supply_buffer_to_channel");
235 return;
236 }
237 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
238 manager->supply_buffer_to(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel, mix);
239 }
240}
241
242void supply_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
243 const std::vector<uint32_t>& channels,
244 double mix)
245{
246 for (const auto& channel : channels) {
247 supply_buffer_to_channel(buffer, channel, mix);
248 }
249}
250
251void remove_supplied_buffer_from_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
252 const uint32_t channel)
253{
254 auto manager = get_buffer_manager();
255
256 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
257 manager->remove_supplied_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
258 }
259}
260
261void remove_supplied_buffer_from_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
262 const std::vector<uint32_t>& channels)
263{
264 for (const auto& channel : channels) {
266 }
267}
268
269}
#define MF_ERROR(comp, ctx,...)
Core engine lifecycle and configuration API.
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
Top-level aggregation buffer for computational data streams.
std::shared_ptr< Nodes::NodeGraphManager > get_node_graph_manager()
Gets the node graph manager.
Definition Engine.hpp:229
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager.
Definition Engine.hpp:247
Container for top-level nodes in a processing channel with multi-modal support.
Definition RootNode.hpp:29
std::function< void(const std::shared_ptr< AudioBuffer > &)> AudioProcessingFunction
Audio processing function - receives correctly-typed AudioBuffer.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ AUDIO_BACKEND
Standard audio processing backend configuration.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
std::function< void(const std::shared_ptr< VKBuffer > &)> GraphicsProcessingFunction
Graphics processing function - receives correctly-typed VKBuffer.
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ API
MayaFlux/API Wrapper and convenience functions.
ProcessingToken
Enumerates the different processing domains for nodes.
@ AUDIO_RATE
Nodes that process at the audio sample rate.
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process_audio(Buffers::AudioProcessingFunction processor, const std::shared_ptr< Buffers::AudioBuffer > &buffer)
Definition Graph.cpp:16
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process_graphics(Buffers::GraphicsProcessingFunction processor, const std::shared_ptr< Buffers::VKBuffer > &buffer)
Definition Graph.cpp:21
void connect_node_to_buffer(const std::shared_ptr< Nodes::Node > &node, const std::shared_ptr< Buffers::AudioBuffer > &buffer, float mix, bool clear_before)
Connects a node to a specific buffer.
Definition Graph.cpp:147
std::shared_ptr< Buffers::AudioBuffer > create_input_listener_buffer(uint32_t channel, bool add_to_output)
Creates a new AudioBuffer for input listening.
Definition Graph.cpp:205
void register_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Definition Graph.cpp:102
std::shared_ptr< Buffers::BufferProcessingChain > create_processing_chain()
Creates a new processing chain for the default engine.
Definition Graph.cpp:131
void unregister_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Removes a node from the root node of specified channels.
Definition Graph.cpp:81
void unregister_graphics_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Unregisters a VKBuffer from the default engine's buffer manager.
Definition Graph.cpp:190
void add_processor(const std::shared_ptr< Buffers::BufferProcessor > &processor, const std::shared_ptr< Buffers::Buffer > &buffer, Buffers::ProcessingToken token)
Adds a processor to a specific buffer.
Definition Graph.cpp:116
std::shared_ptr< Nodes::NodeGraphManager > get_node_graph_manager()
Gets the node graph manager from the default engine.
Definition Graph.cpp:31
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process(Buffers::AudioProcessingFunction processor, unsigned int channel_id)
Attaches a processing function to a specific channel.
Definition Graph.cpp:170
Buffers::RootAudioBuffer & get_root_audio_buffer(uint32_t channel)
Gets the audio buffer for a specific channel.
Definition Graph.cpp:136
void register_node_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const Nodes::ProcessingToken &token)
Registers a node network with the default engine's node graph manager.
Definition Graph.cpp:156
void remove_supplied_buffer_from_channels(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const std::vector< uint32_t > &channels)
Removes a supplied buffer from multiple channels.
Definition Graph.cpp:261
std::vector< std::shared_ptr< Buffers::AudioBuffer > > clone_buffer_to_channels(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const std::vector< uint32_t > &channels)
Clones a buffer to multiple channels.
Definition Graph.cpp:217
void unregister_audio_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel)
Unregisters an AudioBuffer from the default engine's buffer manager.
Definition Graph.cpp:180
void supply_buffer_to_channels(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const std::vector< uint32_t > &channels, double mix)
Supplies a buffer to multiple channels with mixing.
Definition Graph.cpp:242
void supply_buffer_to_channel(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel, double mix)
Supplies a buffer to a single channel with mixing.
Definition Graph.cpp:228
void register_audio_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel)
Registers an AudioBuffer with the default engine's buffer manager.
Definition Graph.cpp:175
void detach_from_audio_input(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel)
Stops reading audio data from the default input source.
Definition Graph.cpp:200
void register_audio_node(const std::shared_ptr< Nodes::Node > &node, uint32_t channel)
Adds a node to the root node of a specific channel.
Definition Graph.cpp:36
void unregister_node_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const Nodes::ProcessingToken &token)
Unregisters a node network from the default engine's node graph manager.
Definition Graph.cpp:161
void unregister_audio_node(const std::shared_ptr< Nodes::Node > &node, uint32_t channel)
Removes a node from the root node of a specific channel.
Definition Graph.cpp:58
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager from the default engine.
Definition Graph.cpp:111
void register_graphics_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer, Buffers::ProcessingToken token)
Registers a VKBuffer with the default engine's buffer manager.
Definition Graph.cpp:185
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:58
Nodes::RootNode & get_audio_channel_root(uint32_t channel)
Gets the root node for a specific channel.
Definition Graph.cpp:97
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.
Definition Yantra.cpp:1019
void read_from_audio_input(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t channel)
Reads audio data from the default input source into a buffer.
Definition Graph.cpp:195
void connect_node_to_channel(const std::shared_ptr< Nodes::Node > &node, uint32_t channel_index, float mix, bool clear_before)
Connects a node to a specific output channel.
Definition Graph.cpp:141
void remove_supplied_buffer_from_channel(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const uint32_t channel)
Removes a supplied buffer from multiple channels.
Definition Graph.cpp:251
Main namespace for the Maya Flux audio engine.
Definition LiveAid.hpp:6