MayaFlux 1.0.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
5#include "Chronie.hpp"
6
14
16
17namespace MayaFlux {
18
19namespace internal {
20 std::shared_ptr<Buffers::BufferProcessor> attach_quick_process_audio(Buffers::AudioProcessingFunction processor, const std::shared_ptr<Buffers::AudioBuffer>& buffer)
21 {
22 return get_buffer_manager()->attach_quick_process(std::move(processor), buffer, Buffers::ProcessingToken::AUDIO_BACKEND);
23 }
24
25 std::shared_ptr<Buffers::BufferProcessor> attach_quick_process_graphics(Buffers::GraphicsProcessingFunction processor, const std::shared_ptr<Buffers::VKBuffer>& buffer)
26 {
27 return get_buffer_manager()->attach_quick_process(std::move(processor), buffer, Buffers::ProcessingToken::GRAPHICS_BACKEND);
28 }
29
30 std::shared_ptr<Buffers::BufferProcessor> attach_quick_process_channels(Buffers::AudioProcessingFunction processor, std::initializer_list<unsigned int> channels)
31 {
32 auto manager = get_buffer_manager();
33 std::shared_ptr<Buffers::BufferProcessor> attached;
34
35 for (const unsigned int channel : channels) {
36 if (attached) {
37 manager->add_processor(attached, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
38 } else {
39 attached = manager->attach_quick_process(std::move(processor), Buffers::ProcessingToken::AUDIO_BACKEND, channel);
40 }
41 }
42
43 return attached;
44 }
45}
46
47//-------------------------------------------------------------------------
48// Node Graph Management
49//-------------------------------------------------------------------------
50
51std::shared_ptr<Nodes::NodeGraphManager> get_node_graph_manager()
52{
54}
55
56void register_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
57{
58 auto manager = get_node_graph_manager();
59 if (!manager) {
61 "Node graph manager not initialized - cannot register audio node");
62 return;
63 }
64 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
65 MF_ERROR(Journal::Component::API, Journal::Context::NodeProcessing, "Channel index {} out of range for audio node registration", channel);
66 }
67 manager->add_to_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
68}
69
70void register_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
71{
72 for (const auto& channel : channels) {
73 register_audio_node(node, channel);
74 }
75}
76
77void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
78{
79 auto manager = get_node_graph_manager();
80 if (!manager) {
82 "Node graph manager not initialized - cannot unregister audio node");
83 return;
84 }
85
86 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
88 "Channel index out of range for audio node registration");
89 }
90 manager->remove_from_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
91}
92
93void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
94{
95 for (const auto& channel : channels) {
96 unregister_audio_node(node, channel);
97 }
98}
99
100void unregister_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
101{
102 auto manager = get_node_graph_manager();
103 if (!manager) {
105 "Node graph manager not initialized - cannot register node");
106 return;
107 }
108
109 if (channel >= manager->get_channel_count(token)) {
111 "Channel index out of range for audio node registration");
112 }
113 manager->remove_from_root(node, token, channel);
114}
115
117 const std::shared_ptr<Nodes::Node>& node,
118 const std::vector<uint32_t>& channels,
119 uint32_t num_samples,
120 const Nodes::ProcessingToken& token)
121{
122 get_node_graph_manager()->route_node_to_channels(node, channels, num_samples, token);
123}
124
126 const std::shared_ptr<Nodes::Node>& node,
127 const std::vector<uint32_t>& channels,
128 double seconds_to_fade,
129 const Nodes::ProcessingToken& token)
130{
131 get_node_graph_manager()->route_node_to_channels(node, channels, seconds_to_samples(seconds_to_fade), token);
132}
133
135{
136 return *get_context().get_node_graph_manager()->get_all_root_nodes(Nodes::ProcessingToken::AUDIO_RATE)[channel];
137}
138
139void register_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
140{
141 get_context().get_node_graph_manager()->add_to_root(node, token, channel);
142}
143
144//-------------------------------------------------------------------------
145// Buffer Management
146//-------------------------------------------------------------------------
147
148std::shared_ptr<Buffers::BufferManager> get_buffer_manager()
149{
151}
152
153void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, const std::shared_ptr<Buffers::Buffer>& buffer, Buffers::ProcessingToken token)
154{
155 get_buffer_manager()->add_processor(processor, buffer, token);
156}
157
158void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token, uint32_t channel)
159{
160 get_buffer_manager()->add_processor(processor, token, channel);
161}
162
163void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token)
164{
165 get_buffer_manager()->add_processor(processor, token);
166}
167
168void remove_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, const std::shared_ptr<Buffers::Buffer>& buffer)
169{
170 get_buffer_manager()->remove_processor(processor, buffer);
171}
172
173void remove_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, uint32_t channel, Buffers::ProcessingToken token)
174{
175 get_buffer_manager()->remove_processor_from_channel(processor, token, channel);
176}
177
178void remove_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token)
179{
180 get_buffer_manager()->remove_processor_from_token(processor, token);
181}
182
183std::shared_ptr<Buffers::BufferProcessingChain> create_processing_chain()
184{
185 return std::make_shared<Buffers::BufferProcessingChain>();
186}
187
189{
190 return *get_buffer_manager()->get_root_audio_buffer(Buffers::ProcessingToken::AUDIO_BACKEND, channel);
191}
192
193void connect_node_to_channel(const std::shared_ptr<Nodes::Node>& node, uint32_t channel_index, float mix, bool clear_before)
194{
195 auto token = get_buffer_manager()->get_default_audio_token();
196 get_buffer_manager()->connect_node_to_channel(node, token, channel_index, mix, clear_before);
197}
198
199void connect_node_to_buffer(const std::shared_ptr<Nodes::Node>& node, const std::shared_ptr<Buffers::AudioBuffer>& buffer, float mix, bool clear_before)
200{
201 get_buffer_manager()->connect_node_to_buffer(node, buffer, mix, clear_before);
202}
203
204//-------------------------------------------------------------------------
205// Node Network Management
206//-------------------------------------------------------------------------
207
208void register_node_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const Nodes::ProcessingToken& token)
209{
210 get_context().get_node_graph_manager()->add_network(network, token);
211}
212
213void unregister_node_network(const std::shared_ptr<Nodes::Network::NodeNetwork>& network, const Nodes::ProcessingToken& token)
214{
215 get_context().get_node_graph_manager()->remove_network(network, token);
216}
217
219 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
220 const std::vector<uint32_t>& channels,
221 uint32_t num_samples,
222 const Nodes::ProcessingToken& token)
223{
224 get_node_graph_manager()->route_network_to_channels(network, channels, num_samples, token);
225}
226
228 const std::shared_ptr<Nodes::Network::NodeNetwork>& network,
229 const std::vector<uint32_t>& channels,
230 double seconds_to_fade,
231 const Nodes::ProcessingToken& token)
232{
233 get_node_graph_manager()->route_network_to_channels(network, channels, seconds_to_samples(seconds_to_fade), token);
234}
235
236//-------------------------------------------------------------------------
237// Audio Processing
238//-------------------------------------------------------------------------
239
240void register_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
241{
243}
244
245void unregister_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
246{
248}
249
250void register_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer, Buffers::ProcessingToken token)
251{
252 get_buffer_manager()->add_buffer(buffer, token);
253}
254
255void unregister_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer)
256{
258}
259
260void read_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
261{
262 get_buffer_manager()->register_input_listener(buffer, channel);
263}
264
265void detach_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
266{
267 get_buffer_manager()->unregister_input_listener(buffer, channel);
268}
269
270std::shared_ptr<Buffers::AudioBuffer> create_input_listener_buffer(uint32_t channel, bool add_to_output)
271{
272 std::shared_ptr<Buffers::AudioBuffer> buffer = std::make_shared<Buffers::AudioBuffer>(channel);
273
274 if (add_to_output) {
276 }
278
279 return buffer;
280}
281
282std::vector<std::shared_ptr<Buffers::AudioBuffer>> clone_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
283 const std::vector<uint32_t>& channels)
284{
285 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, Buffers::ProcessingToken::AUDIO_BACKEND);
286}
287
288std::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)
289{
290 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, token);
291}
292
293void supply_buffer_to_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
294 uint32_t channel, double mix)
295{
296 auto manager = get_buffer_manager();
297 if (!manager) {
299 "Buffer manager not initialized - cannot perform supply_buffer_to_channel");
300 return;
301 }
302 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
303 manager->supply_buffer_to(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel, mix);
304 }
305}
306
307void supply_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
308 const std::vector<uint32_t>& channels,
309 double mix)
310{
311 for (const auto& channel : channels) {
312 supply_buffer_to_channel(buffer, channel, mix);
313 }
314}
315
316void remove_supplied_buffer_from_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
317 const uint32_t channel)
318{
319 auto manager = get_buffer_manager();
320
321 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
322 manager->remove_supplied_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
323 }
324}
325
326void remove_supplied_buffer_from_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
327 const std::vector<uint32_t>& channels)
328{
329 for (const auto& channel : channels) {
331 }
332}
333
334void set_mix_normalization_for_channel(uint32_t channel, bool enabled)
335{
336 auto manager = get_buffer_manager();
337
338 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
339 manager->get_root_audio_buffer(Buffers::ProcessingToken::AUDIO_BACKEND, channel)
340 ->set_mix_normalization(enabled);
341 }
342}
343
344void set_mix_normalization_for_channels(const std::vector<uint32_t>& channels, bool enabled)
345{
346 for (const auto& channel : channels) {
347 set_mix_normalization_for_channel(channel, enabled);
348 }
349}
350
352 const std::shared_ptr<Buffers::AudioBuffer>& buffer,
353 uint32_t target_channel,
354 double seconds_to_fade,
355 const Buffers::ProcessingToken& token)
356{
357 get_buffer_manager()->route_buffer_to_channel(
358 buffer, target_channel, seconds_to_blocks(seconds_to_fade), token);
359}
360
362 const std::shared_ptr<Buffers::AudioBuffer>& buffer,
363 uint32_t target_channel,
364 uint32_t num_blocks,
365 const Buffers::ProcessingToken& token)
366{
367 get_buffer_manager()->route_buffer_to_channel(buffer, target_channel, num_blocks, token);
368}
369
370std::shared_ptr<Nodes::Node> operator>>(const std::shared_ptr<Nodes::Node>& lhs, const std::shared_ptr<Nodes::Node>& rhs)
371{
372 auto manager = get_node_graph_manager();
373
374 auto lhs_chain = std::dynamic_pointer_cast<Nodes::ChainNode>(lhs);
375 auto rhs_chain = std::dynamic_pointer_cast<Nodes::ChainNode>(rhs);
376
377 if (lhs_chain) {
378 if (rhs_chain) {
379 lhs_chain->append_chain(rhs_chain);
380 } else {
381 lhs_chain->append(rhs);
382 }
383 lhs_chain->initialize();
384 return lhs_chain;
385 }
386
387 std::shared_ptr<Nodes::ChainNode> chain;
388 if (rhs_chain) {
389 std::vector<std::shared_ptr<Nodes::Node>> nodes;
390 nodes.reserve(1 + rhs_chain->size());
391 nodes.push_back(lhs);
392 for (auto& node : rhs_chain->nodes()) {
393 nodes.push_back(node);
394 }
395 chain = std::make_shared<Nodes::ChainNode>(std::move(nodes), *manager);
396 } else {
397 chain = std::make_shared<Nodes::ChainNode>(lhs, rhs, *manager);
398 }
399
400 chain->initialize();
401 return chain;
402}
403
404std::shared_ptr<Nodes::Node> operator+(const std::shared_ptr<Nodes::Node>& lhs, const std::shared_ptr<Nodes::Node>& rhs)
405{
406 auto manager = get_node_graph_manager();
407 auto result = std::make_shared<Nodes::BinaryOpNode>(
408 lhs, rhs, [](double a, double b) { return a + b; }, *manager);
409 result->initialize();
410 return result;
411}
412
413std::shared_ptr<Nodes::Node> operator*(const std::shared_ptr<Nodes::Node>& lhs, const std::shared_ptr<Nodes::Node>& rhs)
414{
415 auto manager = get_node_graph_manager();
416 auto result = std::make_shared<Nodes::BinaryOpNode>(
417 lhs, rhs, [](double a, double b) { return a * b; }, *manager);
418 result->initialize();
419 return result;
420}
421
422}
#define MF_ERROR(comp, ctx,...)
Core::GlobalNetworkConfig network
Definition Config.cpp:43
Core engine lifecycle and configuration API.
std::shared_ptr< NetworkGeometryBuffer > buffer
BufferProcessingChain * chain
size_t a
size_t b
uint32_t channels
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:267
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager.
Definition Engine.hpp:285
Container for top-level nodes in a processing channel with multi-modal support.
Definition RootNode.hpp:30
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_graphics(Buffers::GraphicsProcessingFunction processor, const std::shared_ptr< Buffers::VKBuffer > &buffer)
Definition Graph.cpp:25
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process_audio(Buffers::AudioProcessingFunction processor, const std::shared_ptr< Buffers::AudioBuffer > &buffer)
Definition Graph.cpp:20
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process_channels(Buffers::AudioProcessingFunction processor, std::initializer_list< unsigned int > channels)
Definition Graph.cpp:30
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:199
void set_mix_normalization_for_channel(uint32_t channel, bool enabled)
Sets whether a channel's mix is averaged over its sources.
Definition Graph.cpp:334
std::shared_ptr< Nodes::Node > operator*(const std::shared_ptr< Nodes::Node > &lhs, const std::shared_ptr< Nodes::Node > &rhs)
Combines two nodes in parallel (multiplication)
Definition Graph.cpp:413
void set_mix_normalization_for_channels(const std::vector< uint32_t > &channels, bool enabled)
Sets whether the mix of several channels is averaged over their sources.
Definition Graph.cpp:344
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:270
void register_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Definition Graph.cpp:139
std::shared_ptr< Buffers::BufferProcessingChain > create_processing_chain()
Creates a new processing chain for the default engine.
Definition Graph.cpp:183
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:100
void unregister_graphics_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Unregisters a VKBuffer from the default engine's buffer manager.
Definition Graph.cpp:255
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:153
void route_network(const std::shared_ptr< Nodes::Network::NodeNetwork > &network, const std::vector< uint32_t > &channels, uint32_t num_samples, const Nodes::ProcessingToken &token)
@breif Moves the node from its current channel(s) to the specified channel(s) with an optional fade t...
Definition Graph.cpp:218
std::shared_ptr< Nodes::NodeGraphManager > get_node_graph_manager()
Gets the node graph manager from the default engine.
Definition Graph.cpp:51
uint64_t seconds_to_samples(double seconds)
Converts a time duration in seconds to the equivalent number of audio samples.
Definition Chronie.cpp:285
std::shared_ptr< Nodes::Node > operator>>(const std::shared_ptr< Nodes::Node > &lhs, const std::shared_ptr< Nodes::Node > &rhs)
Connects two nodes in series (pipeline operator)
Definition Graph.cpp:370
Buffers::RootAudioBuffer & get_root_audio_buffer(uint32_t channel)
Gets the audio buffer for a specific channel.
Definition Graph.cpp:188
void route_node(const std::shared_ptr< Nodes::Node > &node, const std::vector< uint32_t > &channels, uint32_t num_samples, const Nodes::ProcessingToken &token)
@breif Moves the node from its current channel(s) to the specified channel(s) with an optional fade t...
Definition Graph.cpp:116
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:208
std::shared_ptr< Nodes::Node > operator+(const std::shared_ptr< Nodes::Node > &lhs, const std::shared_ptr< Nodes::Node > &rhs)
Combines two nodes in parallel (addition)
Definition Graph.cpp:404
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:326
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:282
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:245
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:307
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:293
void route_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, uint32_t target_channel, double seconds_to_fade, const Buffers::ProcessingToken &token)
Routes a buffer from its current channel to a target channel with fade.
Definition Graph.cpp:351
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:240
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 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:265
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:56
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:213
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:77
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager from the default engine.
Definition Graph.cpp:148
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:250
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:101
Nodes::RootNode & get_audio_channel_root(uint32_t channel)
Gets the root node for a specific channel.
Definition Graph.cpp:134
void remove_processor(const std::shared_ptr< Buffers::BufferProcessor > &processor, const std::shared_ptr< Buffers::Buffer > &buffer)
Removes a processor from a specific buffer.
Definition Graph.cpp:168
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:260
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:193
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:316
Main namespace for the Maya Flux audio engine.
Definition Runtime.cpp:12