21 : m_unit_manager(unit_manager)
22 , m_access_control(access_control)
31 const std::shared_ptr<BufferProcessor>& processor,
32 const std::shared_ptr<Buffer>& buffer,
36 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
45 const std::shared_ptr<BufferProcessor>& processor,
55 const std::shared_ptr<BufferProcessor>& processor,
66 const std::shared_ptr<BufferProcessor>& processor,
67 const std::shared_ptr<Buffer>& buffer,
71 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
80 const std::shared_ptr<BufferProcessor>& processor,
96 const std::shared_ptr<BufferProcessor>& processor,
111 const std::shared_ptr<BufferProcessor>& processor,
112 const std::shared_ptr<AudioBuffer>& buffer)
114 uint32_t channel_id = buffer->get_channel_id();
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);
130 "Could not find matching token for audio buffer with channel ID {}", channel_id);
134 const std::shared_ptr<BufferProcessor>& processor,
140 chain->add_processor(processor, root_buffer);
144 const std::shared_ptr<BufferProcessor>& processor,
148 for (uint32_t i = 0; i < unit.channel_count; ++i) {
150 auto root_buffer = unit.get_buffer(i);
151 chain->add_processor(processor, root_buffer);
156 const std::shared_ptr<BufferProcessor>& processor,
157 const std::shared_ptr<AudioBuffer>& buffer)
159 uint32_t channel_id = buffer->get_channel_id();
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);
175 const std::shared_ptr<BufferProcessor>& processor,
184 if (channel >= unit.channel_count) {
189 auto root_buffer = unit.get_buffer(channel);
190 chain->remove_processor(processor, root_buffer);
194 const std::shared_ptr<BufferProcessor>& processor,
202 for (uint32_t i = 0; i < unit.channel_count; ++i) {
204 auto root_buffer = unit.get_buffer(i);
205 chain->remove_processor(processor, root_buffer);
210 const std::shared_ptr<BufferProcessor>& processor,
218 for (uint32_t i = 0; i < unit.channel_count; ++i) {
220 auto chain = root_buffer->get_processing_chain();
221 chain->add_final_processor(processor, root_buffer);
231 const std::shared_ptr<Buffer>& buffer,
234 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
236 return quick_process;
241 const std::shared_ptr<Buffer>& buffer,
244 auto quick_process = std::make_shared<QuickProcess<GraphicsProcessingFunction>>(std::move(processor));
246 return quick_process;
254 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
256 return quick_process;
263 auto quick_process = std::make_shared<QuickProcess<AudioProcessingFunction>>(std::move(processor));
265 return quick_process;
272 auto quick_process = std::make_shared<QuickProcess<GraphicsProcessingFunction>>(std::move(processor));
274 return quick_process;
282 const std::shared_ptr<Nodes::Node>& node,
290 auto processor = std::make_shared<NodeSourceProcessor>(node,
mix, clear_before);
291 processor->set_processing_token(
token);
297 const std::shared_ptr<Nodes::Node>& node,
298 const std::shared_ptr<AudioBuffer>& buffer,
302 auto processor = std::make_shared<NodeSourceProcessor>(node,
mix, clear_before);
311 const std::shared_ptr<BufferProcessor>& processor,
316 chain->add_processor(processor, root_buffer);
320 const std::shared_ptr<BufferProcessor>& processor,
321 const std::shared_ptr<Buffer>& buffer,
325 chain->add_processor(processor, buffer);
326 buffer->set_processing_chain(chain,
false);
330 const std::shared_ptr<BufferProcessor>& processor,
335 auto root_buffer = unit.get_buffer();
336 chain->add_final_processor(processor, root_buffer);
340 const std::shared_ptr<BufferProcessor>& processor,
345 "Token {} not found when removing graphics processor",
346 static_cast<int>(
token));
352 auto root_buffer = unit.get_buffer();
353 chain->remove_processor(processor, root_buffer);
#define MF_WARN(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
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.
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