MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
BufferProcessingControl.cpp
Go to the documentation of this file.
2
5
6#include "QuickProcess.hpp"
7
13
15
16namespace MayaFlux::Buffers {
17
19 TokenUnitManager& unit_manager,
20 BufferAccessControl& access_control)
21 : m_unit_manager(unit_manager)
22 , m_access_control(access_control)
23{
24}
25
26// ============================================================================
27// Token-Dispatching Processor Management
28// ============================================================================
29
31 const std::shared_ptr<BufferProcessor>& processor,
32 const std::shared_ptr<Buffer>& buffer,
34{
36 if (auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
37 add_audio_processor(processor, audio_buffer);
38 }
40 add_graphics_processor(processor, buffer, token);
41 }
42}
43
45 const std::shared_ptr<BufferProcessor>& processor,
47 uint32_t channel)
48{
50 add_audio_processor_to_channel(processor, token, channel);
51 }
52}
53
55 const std::shared_ptr<BufferProcessor>& processor,
57{
61 add_graphics_processor(processor, token);
62 }
63}
64
66 const std::shared_ptr<BufferProcessor>& processor,
67 const std::shared_ptr<Buffer>& buffer,
69{
71 if (auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
72 remove_audio_processor(processor, audio_buffer);
73 }
76 }
77}
78
80 const std::shared_ptr<BufferProcessor>& processor,
82 uint32_t channel)
83{
85 if (channel == 0) {
87 } else {
88 remove_audio_processor_from_channel(processor, token, channel);
89 }
92 }
93}
94
96 const std::shared_ptr<BufferProcessor>& processor,
98{
103 }
104}
105
106// ============================================================================
107// Processor Management - Audio
108// ============================================================================
109
111 const std::shared_ptr<BufferProcessor>& processor,
112 const std::shared_ptr<AudioBuffer>& buffer)
113{
114 uint32_t channel_id = buffer->get_channel_id();
115
116 for (const auto& token : m_unit_manager.get_active_audio_tokens()) {
117 const auto& unit = m_unit_manager.get_audio_unit(token);
118 if (channel_id < unit.channel_count) {
119 auto processing_chain = unit.get_chain(channel_id);
120 processing_chain->add_processor(processor, buffer);
121 buffer->set_processing_chain(processing_chain);
122 return;
123 }
124 }
125
126 // Fallback: use global processing chain if no token matches
127 // This requires BufferManager to provide access to global chain
128 // For now, we log a warning
130 "Could not find matching token for audio buffer with channel ID {}", channel_id);
131}
132
134 const std::shared_ptr<BufferProcessor>& processor,
136 uint32_t channel)
137{
139 auto root_buffer = m_access_control.get_root_audio_buffer(token, channel);
140 chain->add_processor(processor, root_buffer);
141}
142
144 const std::shared_ptr<BufferProcessor>& processor,
146{
148 for (uint32_t i = 0; i < unit.channel_count; ++i) {
149 auto chain = unit.get_chain(i);
150 auto root_buffer = unit.get_buffer(i);
151 chain->add_processor(processor, root_buffer);
152 }
153}
154
156 const std::shared_ptr<BufferProcessor>& processor,
157 const std::shared_ptr<AudioBuffer>& buffer)
158{
159 uint32_t channel_id = buffer->get_channel_id();
160
161 for (const auto& token : m_unit_manager.get_active_audio_tokens()) {
162 const auto& unit = m_unit_manager.get_audio_unit(token);
163 if (channel_id < unit.channel_count) {
164 auto processing_chain = unit.get_chain(channel_id);
165 processing_chain->remove_processor(processor, buffer);
166 if (auto buf_chain = buffer->get_processing_chain()) {
167 buf_chain->remove_processor(processor, buffer);
168 }
169 return;
170 }
171 }
172}
173
175 const std::shared_ptr<BufferProcessor>& processor,
177 uint32_t channel)
178{
180 return;
181 }
182
184 if (channel >= unit.channel_count) {
185 return;
186 }
187
188 auto chain = unit.get_chain(channel);
189 auto root_buffer = unit.get_buffer(channel);
190 chain->remove_processor(processor, root_buffer);
191}
192
194 const std::shared_ptr<BufferProcessor>& processor,
196{
198 return;
199 }
200
202 for (uint32_t i = 0; i < unit.channel_count; ++i) {
203 auto chain = unit.get_chain(i);
204 auto root_buffer = unit.get_buffer(i);
205 chain->remove_processor(processor, root_buffer);
206 }
207}
208
210 const std::shared_ptr<BufferProcessor>& processor,
212{
214 return;
215 }
216
218 for (uint32_t i = 0; i < unit.channel_count; ++i) {
219 auto root_buffer = unit.get_buffer(i);
220 auto chain = root_buffer->get_processing_chain();
221 chain->add_final_processor(processor, root_buffer);
222 }
223}
224
225// ============================================================================
226// Quick Processing - Audio
227// ============================================================================
228
229std::shared_ptr<BufferProcessor> BufferProcessingControl::attach_quick_process(
230 AudioProcessingFunction processor,
231 const std::shared_ptr<Buffer>& buffer,
233{
234 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
235 add_processor(quick_process, buffer, token);
236 return quick_process;
237}
238
239std::shared_ptr<BufferProcessor> BufferProcessingControl::attach_quick_process(
241 const std::shared_ptr<Buffer>& buffer,
243{
244 auto quick_process = std::make_shared<QuickProcess<GraphicsProcessingFunction>>(std::move(processor));
245 add_processor(quick_process, buffer, token);
246 return quick_process;
247}
248
249std::shared_ptr<BufferProcessor> BufferProcessingControl::attach_quick_process(
250 AudioProcessingFunction processor,
252 uint32_t channel)
253{
254 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
255 add_audio_processor_to_channel(quick_process, token, channel);
256 return quick_process;
257}
258
259std::shared_ptr<BufferProcessor> BufferProcessingControl::attach_quick_process(
260 AudioProcessingFunction processor,
262{
263 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
264 add_processor(quick_process, token);
265 return quick_process;
266}
267
268std::shared_ptr<BufferProcessor> BufferProcessingControl::attach_quick_process(
271{
272 auto quick_process = std::make_shared<QuickProcess<GraphicsProcessingFunction>>(std::move(processor));
273 add_processor(quick_process, token);
274 return quick_process;
275}
276
277// ============================================================================
278// Node Connection - Audio
279// ============================================================================
280
282 const std::shared_ptr<Nodes::Node>& node,
284 uint32_t channel,
285 float mix,
286 bool clear_before)
287{
289
290 auto processor = std::make_shared<NodeSourceProcessor>(node, mix, clear_before);
291 processor->set_processing_token(token);
292
293 add_audio_processor_to_channel(processor, token, channel);
294}
295
297 const std::shared_ptr<Nodes::Node>& node,
298 const std::shared_ptr<AudioBuffer>& buffer,
299 float mix,
300 bool clear_before)
301{
302 auto processor = std::make_shared<NodeSourceProcessor>(node, mix, clear_before);
303 add_audio_processor(processor, buffer);
304}
305
306// ============================================================================
307// Processor Management - Graphics
308// ============================================================================
309
311 const std::shared_ptr<BufferProcessor>& processor,
313{
316 chain->add_processor(processor, root_buffer);
317}
318
320 const std::shared_ptr<BufferProcessor>& processor,
321 const std::shared_ptr<Buffer>& buffer,
323{
325 chain->add_processor(processor, buffer);
326 buffer->set_processing_chain(chain, false);
327}
328
330 const std::shared_ptr<BufferProcessor>& processor,
332{
334 auto chain = unit.get_chain();
335 auto root_buffer = unit.get_buffer();
336 chain->add_final_processor(processor, root_buffer);
337}
338
340 const std::shared_ptr<BufferProcessor>& processor,
342{
345 "Token {} not found when removing graphics processor",
346 static_cast<int>(token));
347 return;
348 }
349
351 auto chain = unit.get_chain();
352 auto root_buffer = unit.get_buffer();
353 chain->remove_processor(processor, root_buffer);
354}
355
356} // namespace MayaFlux::Buffers
#define MF_WARN(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
std::shared_ptr< RootGraphicsBuffer > get_root_graphics_buffer(ProcessingToken token)
Gets the root graphics buffer for a specific token.
void ensure_audio_channels(ProcessingToken token, uint32_t channel_count)
Ensures minimum number of audio channels exist for a token.
std::shared_ptr< BufferProcessingChain > get_graphics_processing_chain(ProcessingToken token)
Gets the processing chain for a graphics token.
std::shared_ptr< BufferProcessingChain > get_audio_processing_chain(ProcessingToken token, uint32_t channel)
Gets the processing chain for an audio token and channel.
std::shared_ptr< RootAudioBuffer > get_root_audio_buffer(ProcessingToken token, uint32_t channel)
Gets the root audio buffer for a specific token and channel.
Token-aware buffer and unit access patterns.
void remove_audio_processor_from_token(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Removes a processor from all channels in an audio token.
void connect_node_to_audio_channel(const std::shared_ptr< Nodes::Node > &node, ProcessingToken token, uint32_t channel, float mix=0.5F, bool clear_before=false)
Connects a node to a specific audio token and channel.
void set_audio_final_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Sets a final processor for an audio token (applied to all channels)
void add_audio_processor_to_token(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Adds a processor to all channels in an audio token.
void add_graphics_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Adds a processor to the graphics processing chain.
void add_processor(const std::shared_ptr< BufferProcessor > &processor, const std::shared_ptr< Buffer > &buffer, ProcessingToken token=ProcessingToken::AUDIO_BACKEND)
Adds a processor to a buffer (dispatches based on buffer/token)
void add_audio_processor_to_channel(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token, uint32_t channel)
Adds a processor to a specific audio token and channel.
void connect_node_to_audio_buffer(const std::shared_ptr< Nodes::Node > &node, const std::shared_ptr< AudioBuffer > &buffer, float mix=0.5F, bool clear_before=true)
Connects a node directly to a specific audio buffer.
void set_final_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Sets a final processor for a token (dispatches based on token)
void remove_audio_processor(const std::shared_ptr< BufferProcessor > &processor, const std::shared_ptr< AudioBuffer > &buffer)
Removes a processor from a specific audio buffer.
void add_audio_processor(const std::shared_ptr< BufferProcessor > &processor, const std::shared_ptr< AudioBuffer > &buffer)
Adds a processor to a specific audio buffer.
void set_graphics_final_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Sets a final processor for the graphics processing chain.
void remove_graphics_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Removes a processor from the graphics processing chain.
TokenUnitManager & m_unit_manager
Reference to the token/unit manager.
BufferProcessingControl(TokenUnitManager &unit_manager, BufferAccessControl &access_control)
Creates a new processing control handler.
void remove_audio_processor_from_channel(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token, uint32_t channel)
Removes a processor from a specific audio token and channel.
std::shared_ptr< BufferProcessor > attach_quick_process(AudioProcessingFunction processor, const std::shared_ptr< Buffer > &buffer, ProcessingToken token=ProcessingToken::AUDIO_BACKEND)
Creates and attaches a quick processing function to buffer.
void remove_processor(const std::shared_ptr< BufferProcessor > &processor, const std::shared_ptr< Buffer > &buffer, ProcessingToken token=ProcessingToken::AUDIO_BACKEND)
Removes a processor from a buffer (dispatches based on buffer/token)
BufferAccessControl & m_access_control
Reference to the buffer access control.
void remove_processor_from_token(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token, uint32_t channel=0)
Removes a processor from a token (dispatches based on token)
std::vector< ProcessingToken > get_active_audio_tokens() const
Gets all active audio processing tokens.
RootGraphicsUnit & get_graphics_unit_mutable(ProcessingToken token)
Gets an existing graphics unit without creating if missing (mutable)
const RootAudioUnit & get_audio_unit(ProcessingToken token) const
Gets an existing audio unit without creating if missing.
bool has_audio_unit(ProcessingToken token) const
Checks if an audio unit exists for the given token.
RootAudioUnit & get_audio_unit_mutable(ProcessingToken token)
Gets an existing audio unit without creating if missing (mutable)
RootAudioUnit & get_or_create_audio_unit(ProcessingToken token)
Gets or creates a root audio unit for the specified token.
bool has_graphics_unit(ProcessingToken token) const
Checks if a graphics unit exists for the given token.
Token-scoped unit storage and lifecycle management.
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.
@ AUDIO_PARALLEL
High-performance audio processing with GPU acceleration.
std::function< void(const std::shared_ptr< VKBuffer > &)> GraphicsProcessingFunction
Graphics processing function - receives correctly-typed VKBuffer.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Core
Core engine, backend, subsystems.
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.
Definition Yantra.cpp:1019
std::shared_ptr< RootAudioBuffer > get_buffer(uint32_t channel) const
std::shared_ptr< BufferProcessingChain > get_chain(uint32_t channel) const
std::shared_ptr< BufferProcessingChain > get_chain() const