26 std::visit([buffer](
auto& fn) {
28 if (
auto audio_buf = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
32 if (
auto vk_buf = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
40 void on_attach(std::shared_ptr<Buffer> buffer)
override
42 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
46 }
else if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
52 std::source_location::current(),
53 "QuickProcess can only be attached to AudioBuffer or VKBuffer");
59 return std::dynamic_pointer_cast<AudioBuffer>(buffer) !=
nullptr || std::dynamic_pointer_cast<VKBuffer>(buffer) !=
nullptr;
69 : m_unit_manager(unit_manager)
70 , m_access_control(access_control)
79 const std::shared_ptr<BufferProcessor>& processor,
80 const std::shared_ptr<Buffer>& buffer,
84 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
93 const std::shared_ptr<BufferProcessor>& processor,
103 const std::shared_ptr<BufferProcessor>& processor,
114 const std::shared_ptr<BufferProcessor>& processor,
115 const std::shared_ptr<Buffer>& buffer,
119 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
128 const std::shared_ptr<BufferProcessor>& processor,
144 const std::shared_ptr<BufferProcessor>& processor,
159 const std::shared_ptr<BufferProcessor>& processor,
160 const std::shared_ptr<AudioBuffer>& buffer)
162 uint32_t channel_id = buffer->get_channel_id();
166 if (channel_id < unit.channel_count) {
167 auto processing_chain = unit.
get_chain(channel_id);
168 processing_chain->add_processor(processor, buffer);
169 buffer->set_processing_chain(processing_chain);
178 "Could not find matching token for audio buffer with channel ID {}", channel_id);
182 const std::shared_ptr<BufferProcessor>& processor,
188 chain->add_processor(processor, root_buffer);
192 const std::shared_ptr<BufferProcessor>& processor,
196 for (uint32_t i = 0; i < unit.channel_count; ++i) {
198 auto root_buffer = unit.get_buffer(i);
199 chain->add_processor(processor, root_buffer);
204 const std::shared_ptr<BufferProcessor>& processor,
205 const std::shared_ptr<AudioBuffer>& buffer)
207 uint32_t channel_id = buffer->get_channel_id();
211 if (channel_id < unit.channel_count) {
212 auto processing_chain = unit.
get_chain(channel_id);
213 processing_chain->remove_processor(processor, buffer);
214 if (
auto buf_chain = buffer->get_processing_chain()) {
215 buf_chain->remove_processor(processor, buffer);
223 const std::shared_ptr<BufferProcessor>& processor,
232 if (channel >= unit.channel_count) {
237 auto root_buffer = unit.get_buffer(channel);
238 chain->remove_processor(processor, root_buffer);
242 const std::shared_ptr<BufferProcessor>& processor,
250 for (uint32_t i = 0; i < unit.channel_count; ++i) {
252 auto root_buffer = unit.get_buffer(i);
253 chain->remove_processor(processor, root_buffer);
258 const std::shared_ptr<BufferProcessor>& processor,
266 for (uint32_t i = 0; i < unit.channel_count; ++i) {
268 auto root_buffer = unit.get_buffer(i);
269 chain->add_final_processor(processor, root_buffer);
281 auto quick_process = std::make_shared<QuickProcess>(std::move(processor));
283 return quick_process;
291 auto quick_process = std::make_shared<QuickProcess>(std::move(processor));
293 return quick_process;
300 auto quick_process = std::make_shared<QuickProcess>(std::move(processor));
302 return quick_process;
310 const std::shared_ptr<Nodes::Node>& node,
318 auto processor = std::make_shared<NodeSourceProcessor>(node,
mix, clear_before);
319 processor->set_processing_token(
token);
325 const std::shared_ptr<Nodes::Node>& node,
326 const std::shared_ptr<AudioBuffer>& buffer,
330 auto processor = std::make_shared<NodeSourceProcessor>(node,
mix, clear_before);
339 const std::shared_ptr<BufferProcessor>& processor,
344 chain->add_processor(processor, root_buffer);
348 const std::shared_ptr<BufferProcessor>& processor,
349 const std::shared_ptr<Buffer>& buffer,
353 chain->add_processor(processor, buffer);
354 buffer->set_processing_chain(chain,
false);
358 const std::shared_ptr<BufferProcessor>& processor,
363 auto root_buffer = unit.get_buffer();
364 chain->add_final_processor(processor, root_buffer);
368 const std::shared_ptr<BufferProcessor>& processor,
373 "Token {} not found when removing graphics processor",
374 static_cast<int>(
token));
380 auto root_buffer = unit.get_buffer();
381 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(BufferProcessingFunction 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)
ProcessingToken m_processing_token
Central computational transformation interface for continuous buffer processing.
QuickProcess(BufferProcessingFunction function)
BufferProcessingFunction m_function
bool is_compatible_with(std::shared_ptr< Buffer > buffer) const override
Checks if this processor can handle the specified buffer type.
void on_attach(std::shared_ptr< Buffer > buffer) override
Called when this processor is attached to a buffer.
void processing_function(std::shared_ptr< Buffer > buffer) override
The core processing function that must be implemented by derived classes.
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::variant< AudioProcessingFunction, GraphicsProcessingFunction > BufferProcessingFunction
@ 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< BufferProcessingChain > get_chain(uint32_t channel) const
std::shared_ptr< BufferProcessingChain > get_chain() const