MayaFlux 0.1.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
9
11
12namespace MayaFlux {
13
14//-------------------------------------------------------------------------
15// Node Graph Management
16//-------------------------------------------------------------------------
17
18std::shared_ptr<Nodes::NodeGraphManager> get_node_graph_manager()
19{
21}
22
23void register_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
24{
25 auto manager = get_node_graph_manager();
26 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
27 std::out_of_range err("Channel index out of range for audio node registration");
28 std::cerr << err.what() << '\n';
29 }
30 manager->add_to_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
31}
32
33void register_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
34{
35 for (const auto& channel : channels) {
36 register_audio_node(node, channel);
37 }
38}
39
40void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, uint32_t channel)
41{
42 auto manager = get_node_graph_manager();
43 if (channel >= manager->get_channel_count(Nodes::ProcessingToken::AUDIO_RATE)) {
45 "Channel index out of range for audio node registration");
46 }
47 manager->remove_from_root(node, Nodes::ProcessingToken::AUDIO_RATE, channel);
48}
49
50void unregister_audio_node(const std::shared_ptr<Nodes::Node>& node, const std::vector<uint32_t>& channels)
51{
52 for (const auto& channel : channels) {
53 unregister_audio_node(node, channel);
54 }
55}
56
57void unregister_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
58{
59 auto manager = get_node_graph_manager();
60 if (channel >= manager->get_channel_count(token)) {
62 "Channel index out of range for audio node registration");
63 }
64 manager->remove_from_root(node, token, channel);
65}
66
68{
69 return *get_context().get_node_graph_manager()->get_all_root_nodes(Nodes::ProcessingToken::AUDIO_RATE)[channel];
70}
71
72void register_node(const std::shared_ptr<Nodes::Node>& node, const Nodes::ProcessingToken& token, uint32_t channel)
73{
74 get_context().get_node_graph_manager()->add_to_root(node, token, channel);
75}
76
77//-------------------------------------------------------------------------
78// Buffer Management
79//-------------------------------------------------------------------------
80
81std::shared_ptr<Buffers::BufferManager> get_buffer_manager()
82{
84}
85
86void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, const std::shared_ptr<Buffers::Buffer>& buffer, Buffers::ProcessingToken token)
87{
88 get_buffer_manager()->add_processor(processor, buffer, token);
89}
90
91void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token, uint32_t channel)
92{
93 get_buffer_manager()->add_processor(processor, token, channel);
94}
95
96void add_processor(const std::shared_ptr<Buffers::BufferProcessor>& processor, Buffers::ProcessingToken token)
97{
98 get_buffer_manager()->add_processor(processor, token);
99}
100
101std::shared_ptr<Buffers::BufferProcessingChain> create_processing_chain()
102{
103 return std::make_shared<Buffers::BufferProcessingChain>();
104}
105
107{
108 return *get_buffer_manager()->get_root_audio_buffer(Buffers::ProcessingToken::AUDIO_BACKEND, channel);
109}
110
111void connect_node_to_channel(const std::shared_ptr<Nodes::Node>& node, uint32_t channel_index, float mix, bool clear_before)
112{
113 auto token = get_buffer_manager()->get_default_audio_token();
114 get_buffer_manager()->connect_node_to_channel(node, token, channel_index, mix, clear_before);
115}
116
117void connect_node_to_buffer(const std::shared_ptr<Nodes::Node>& node, const std::shared_ptr<Buffers::AudioBuffer>& buffer, float mix, bool clear_before)
118{
119 get_buffer_manager()->connect_node_to_buffer(node, buffer, mix, clear_before);
120}
121
122//-------------------------------------------------------------------------
123// Node Network Management
124//-------------------------------------------------------------------------
125
126void register_node_network(const std::shared_ptr<Nodes::NodeNetwork>& network, const Nodes::ProcessingToken& token)
127{
128 get_context().get_node_graph_manager()->add_network(network, token);
129}
130
131void unregister_node_network(const std::shared_ptr<Nodes::NodeNetwork>& network, const Nodes::ProcessingToken& token)
132{
133 get_context().get_node_graph_manager()->remove_network(network, token);
134}
135
136//-------------------------------------------------------------------------
137// Audio Processing
138//-------------------------------------------------------------------------
139
140std::shared_ptr<Buffers::BufferProcessor> attach_quick_process(Buffers::BufferProcessingFunction processor, const std::shared_ptr<Buffers::AudioBuffer>& buffer)
141{
142 return get_buffer_manager()->attach_quick_process(std::move(processor), buffer, Buffers::ProcessingToken::AUDIO_BACKEND);
143}
144
145std::shared_ptr<Buffers::BufferProcessor> attach_quick_process(Buffers::BufferProcessingFunction processor, unsigned int channel_id)
146{
147 return get_buffer_manager()->attach_quick_process(std::move(processor), Buffers::ProcessingToken::AUDIO_BACKEND, channel_id);
148}
149
150void register_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
151{
152 get_buffer_manager()->add_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
153}
154
155void unregister_audio_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
156{
157 get_buffer_manager()->remove_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
158}
159
160void register_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer, Buffers::ProcessingToken token)
161{
162 get_buffer_manager()->add_buffer(buffer, token);
163}
164
165void unregister_graphics_buffer(const std::shared_ptr<Buffers::VKBuffer>& buffer)
166{
168}
169
170void read_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
171{
172 get_buffer_manager()->register_input_listener(buffer, channel);
173}
174
175void detach_from_audio_input(const std::shared_ptr<Buffers::AudioBuffer>& buffer, uint32_t channel)
176{
177 get_buffer_manager()->unregister_input_listener(buffer, channel);
178}
179
180std::shared_ptr<Buffers::AudioBuffer> create_input_listener_buffer(uint32_t channel, bool add_to_output)
181{
182 std::shared_ptr<Buffers::AudioBuffer> buffer = std::make_shared<Buffers::AudioBuffer>(channel);
183
184 if (add_to_output) {
185 register_audio_buffer(buffer, channel);
186 }
187 read_from_audio_input(buffer, channel);
188
189 return buffer;
190}
191
192std::vector<std::shared_ptr<Buffers::AudioBuffer>> clone_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
193 const std::vector<uint32_t>& channels)
194{
195 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, Buffers::ProcessingToken::AUDIO_BACKEND);
196}
197
198std::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)
199{
200 return get_buffer_manager()->clone_buffer_for_channels(buffer, channels, token);
201}
202
203void supply_buffer_to_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
204 uint32_t channel, double mix)
205{
206 auto manager = get_buffer_manager();
207 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
208 manager->supply_buffer_to(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel, mix);
209 }
210}
211
212void supply_buffer_to_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
213 const std::vector<uint32_t>& channels,
214 double mix)
215{
216 for (const auto& channel : channels) {
217 supply_buffer_to_channel(buffer, channel, mix);
218 }
219}
220
221void remove_supplied_buffer_from_channel(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
222 const uint32_t channel)
223{
224 auto manager = get_buffer_manager();
225
226 if (channel < manager->get_num_channels(Buffers::ProcessingToken::AUDIO_BACKEND)) {
227 manager->remove_supplied_buffer(buffer, Buffers::ProcessingToken::AUDIO_BACKEND, channel);
228 }
229}
230
231void remove_supplied_buffer_from_channels(const std::shared_ptr<Buffers::AudioBuffer>& buffer,
232 const std::vector<uint32_t>& channels)
233{
234 for (const auto& channel : channels) {
236 }
237}
238
239}
#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
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::variant< AudioProcessingFunction, GraphicsProcessingFunction > BufferProcessingFunction
@ 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.
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:117
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:180
void register_node(const std::shared_ptr< Nodes::Node > &node, const Nodes::ProcessingToken &token, uint32_t channel)
Definition Graph.cpp:72
std::shared_ptr< Buffers::BufferProcessingChain > create_processing_chain()
Creates a new processing chain for the default engine.
Definition Graph.cpp:101
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:57
void unregister_graphics_buffer(const std::shared_ptr< Buffers::VKBuffer > &buffer)
Unregisters a VKBuffer from the default engine's buffer manager.
Definition Graph.cpp:165
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:86
std::shared_ptr< Nodes::NodeGraphManager > get_node_graph_manager()
Gets the node graph manager from the default engine.
Definition Graph.cpp:18
Buffers::RootAudioBuffer & get_root_audio_buffer(uint32_t channel)
Gets the audio buffer for a specific channel.
Definition Graph.cpp:106
void register_node_network(const std::shared_ptr< Nodes::NodeNetwork > &network, const Nodes::ProcessingToken &token)
Registers a node network with the default engine's node graph manager.
Definition Graph.cpp:126
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:231
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:192
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:155
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:212
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:203
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:150
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:175
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:23
void unregister_node_network(const std::shared_ptr< Nodes::NodeNetwork > &network, const Nodes::ProcessingToken &token)
Unregisters a node network from the default engine's node graph manager.
Definition Graph.cpp:131
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:40
std::shared_ptr< Buffers::BufferManager > get_buffer_manager()
Gets the buffer manager from the default engine.
Definition Graph.cpp:81
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:160
Core::Engine & get_context()
Gets the default engine instance.
Definition Core.cpp:56
std::shared_ptr< Buffers::BufferProcessor > attach_quick_process(Buffers::BufferProcessingFunction processor, const std::shared_ptr< Buffers::AudioBuffer > &buffer)
Attaches a processing function to a specific buffer.
Definition Graph.cpp:140
Nodes::RootNode & get_audio_channel_root(uint32_t channel)
Gets the root node for a specific channel.
Definition Graph.cpp:67
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:170
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:111
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:221
Main namespace for the Maya Flux audio engine.
Definition LiveAid.hpp:6