18 uint32_t default_out_channels,
19 uint32_t default_in_channels,
20 uint64_t default_sample_rate,
21 uint32_t default_buffer_size,
24 : m_unit_manager(
std::make_unique<
TokenUnitManager>(default_audio_token, default_graphics_token))
35 if (default_in_channels) {
36 m_input_control->setup_audio_input_buffers(default_in_channels, default_buffer_size);
39 auto& a_unit =
m_unit_manager->get_or_create_audio_unit(default_audio_token);
40 if (a_unit.channel_count > 0) {
41 auto limiter = std::make_shared<FinalLimiterProcessor>();
45 auto& g_unit =
m_unit_manager->get_or_create_graphics_unit(default_graphics_token);
46 auto present_processor = std::make_shared<PresentProcessor>();
47 m_processor_control->set_graphics_final_processor(present_processor, default_graphics_token);
69 for (
const auto& token :
m_unit_manager->get_active_audio_tokens()) {
78 const std::vector<double>& node_output_data)
85 if (channel >= unit.channel_count) {
89 auto root_buffer = unit.get_buffer(channel);
91 if (!node_output_data.empty()) {
92 root_buffer->set_node_output(node_output_data);
95 for (
auto& child : root_buffer->get_child_buffers()) {
96 if (child->needs_default_processing()) {
97 child->process_default();
100 if (
auto processing_chain = child->get_processing_chain()) {
101 if (child->has_data_for_cycle()) {
102 processing_chain->process_complete(child);
105 unit.get_chain(channel)->process_complete(child);
108 root_buffer->process_default();
110 unit.get_chain(channel)->process(root_buffer);
114 if (
auto chain = root_buffer->get_processing_chain()) {
115 chain->process_final(root_buffer);
121 std::vector<ProcessingToken> active_tokens;
122 for (
const auto& token :
m_unit_manager->get_active_audio_tokens()) {
123 active_tokens.push_back(token);
125 for (
const auto& token :
m_unit_manager->get_active_graphics_tokens()) {
126 active_tokens.push_back(token);
128 return active_tokens;
134 unit.custom_processor = std::move(processor);
204 const std::shared_ptr<Buffer>& buffer,
212 const std::shared_ptr<Buffer>& buffer,
241 const std::shared_ptr<BufferProcessor>& processor,
248 const std::shared_ptr<BufferProcessor>& processor,
256 const std::shared_ptr<BufferProcessor>& processor,
263 const std::shared_ptr<BufferProcessor>& processor,
264 const std::shared_ptr<Buffer>& buffer)
270 const std::shared_ptr<BufferProcessor>& processor,
278 const std::shared_ptr<BufferProcessor>& processor,
285 const std::shared_ptr<BufferProcessor>& processor,
336 const std::shared_ptr<Nodes::Node>& node,
346 const std::shared_ptr<Nodes::Node>& node,
347 const std::shared_ptr<AudioBuffer>& buffer,
355 const std::shared_ptr<AudioBuffer>& buffer,
356 uint32_t target_channel,
357 uint32_t fade_cycles,
360 m_supply_mixing->route_buffer_to_channel(buffer, target_channel, fade_cycles, token);
378 const double* interleaved_data,
381 uint32_t num_channels)
383 m_supply_mixing->fill_audio_from_interleaved(interleaved_data, num_frames, token, num_channels);
387 double* interleaved_data,
390 uint32_t num_channels)
const
392 m_supply_mixing->fill_audio_interleaved(interleaved_data, num_frames, token, num_channels);
396 const std::shared_ptr<AudioBuffer>& buffer,
397 const std::vector<uint32_t>& channels,
400 return m_supply_mixing->clone_audio_buffer_for_channels(buffer, channels, token);
409 m_input_control->process_audio_input(input_data, num_channels, num_frames);
427 const std::shared_ptr<AudioBuffer>& buffer,
436 const std::shared_ptr<AudioBuffer>& buffer,
440 return m_supply_mixing->remove_supplied_audio_buffer(buffer, token, channel);
469 if (unit.custom_processor) {
470 unit.custom_processor(unit.root_buffers, processing_units);
474 for (uint32_t channel = 0; channel < unit.channel_count; ++channel) {
487 if (unit.custom_processor) {
488 unit.custom_processor(unit.root_buffer, processing_units);
498 root_buffer->process_default();
500 unit.get_chain()->process(root_buffer);
504 if (
auto chain = root_buffer->get_processing_chain()) {
505 chain->process_final(root_buffer);
Token-aware buffer and unit access patterns.
void ensure_channels(ProcessingToken token, uint32_t channel_count)
Ensures minimum number of channels exist for an audio token.
std::vector< double > & get_buffer_data(ProcessingToken token, uint32_t channel)
Gets data from a specific token and channel (audio-specific)
void remove_processor(const std::shared_ptr< BufferProcessor > &processor, const std::shared_ptr< Buffer > &buffer)
Removes a processor from a buffer.
std::shared_ptr< RootAudioBuffer > get_root_audio_buffer(ProcessingToken token, uint32_t channel=0)
Gets a root buffer for a specific token and channel (audio-specific due to channels)
std::vector< std::shared_ptr< VKBuffer > > get_buffers_by_usage(VKBuffer::Usage usage, ProcessingToken token) const
Gets graphics buffers filtered by usage.
std::shared_ptr< BufferProcessingChain > m_global_processing_chain
Global processing chain applied to all tokens.
const std::vector< std::shared_ptr< AudioBuffer > > & get_buffers(ProcessingToken token, uint32_t channel) const
Gets buffers for a token (audio-specific due to channels)
void set_final_processor(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Sets a final processor for a token (audio-specific)
void process_audio_token_default(ProcessingToken token, uint32_t processing_units)
void route_buffer_to_channel(const std::shared_ptr< AudioBuffer > &buffer, uint32_t target_channel, uint32_t fade_cycles, ProcessingToken token)
void terminate_active_buffers()
Terminates all active buffers, clearing their data.
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.
uint32_t get_buffer_size(ProcessingToken token) const
Gets the buffer size for a token.
void remove_processor_from_token(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token)
Removes a processor from all channels in a token (audio-specific)
void register_input_listener(const std::shared_ptr< AudioBuffer > &buffer, uint32_t channel)
void process_graphics_token_default(ProcessingToken token, uint32_t processing_units)
BufferManager(uint32_t default_out_channels=2, uint32_t default_in_channels=0, uint64_t default_sample_rate=48000, uint32_t default_buffer_size=512, ProcessingToken default_audio_token=ProcessingToken::AUDIO_BACKEND, ProcessingToken default_graphics_token=ProcessingToken::GRAPHICS_BACKEND)
Creates a new multimodal buffer manager.
std::unique_ptr< TokenUnitManager > m_unit_manager
Token/unit storage and lifecycle.
void fill_interleaved(double *interleaved_data, uint32_t num_frames, ProcessingToken token, uint32_t num_channels) const
uint32_t get_num_channels(ProcessingToken token) const
Gets the number of channels for a token (audio-specific)
bool supply_buffer_to(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel, double mix=1.0)
std::vector< std::shared_ptr< AudioBuffer > > clone_buffer_for_channels(const std::shared_ptr< AudioBuffer > &buffer, const std::vector< uint32_t > &channels, ProcessingToken token)
std::shared_ptr< RootGraphicsBuffer > get_root_graphics_buffer(ProcessingToken token)
Gets a root graphics buffer for a specific token.
std::unique_ptr< BufferInputControl > m_input_control
Audio input management.
void connect_node_to_buffer(const std::shared_ptr< Nodes::Node > &node, const std::shared_ptr< AudioBuffer > &buffer, float mix=0.5F, bool clear_before=true)
void process_input(double *input_data, uint32_t num_channels, uint32_t num_frames)
std::shared_ptr< BufferProcessor > attach_quick_process(AudioProcessingFunction processor, const std::shared_ptr< Buffer > &buffer, ProcessingToken token=ProcessingToken::AUDIO_BACKEND)
const std::vector< std::shared_ptr< VKBuffer > > & get_graphics_buffers(ProcessingToken token) const
Gets graphics buffers for a token.
std::shared_ptr< BufferProcessingChain > get_global_processing_chain()
Gets the global processing chain (applied to all tokens)
void process_channel(ProcessingToken token, uint32_t channel, uint32_t processing_units, const std::vector< double > &node_output_data={})
Processes a specific channel within a token domain.
void resize_buffers(ProcessingToken token, uint32_t buffer_size)
Resizes buffers for a token.
std::shared_ptr< BufferProcessingChain > get_processing_chain(ProcessingToken token, uint32_t channel)
Gets the processing chain for a token and channel (audio-specific)
std::unique_ptr< BufferProcessingControl > m_processor_control
Processor attachment/removal operations.
void fill_from_interleaved(const double *interleaved_data, uint32_t num_frames, ProcessingToken token, uint32_t num_channels)
void cleanup_completed_routing(ProcessingToken token)
void remove_processor_from_channel(const std::shared_ptr< BufferProcessor > &processor, ProcessingToken token, uint32_t channel)
Removes a processor from a token and channel (audio-specific)
void remove_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Removes a buffer from a token.
void validate_num_channels(ProcessingToken token, uint32_t num_channels, uint32_t buffer_size)
Validates the number of channels and resizes buffers if necessary (audio-specific)
void initialize_buffer_service()
ProcessingToken get_default_audio_token() const
Gets the default processing token used by the manager.
void connect_node_to_channel(const std::shared_ptr< Nodes::Node > &node, ProcessingToken token, uint32_t channel, float mix=0.5F, bool clear_before=false)
void process_token(ProcessingToken token, uint32_t processing_units)
Processes all buffers for a specific token.
void unregister_input_listener(const std::shared_ptr< AudioBuffer > &buffer, uint32_t channel)
bool remove_supplied_buffer(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel)
void register_audio_token_processor(ProcessingToken token, RootAudioProcessingFunction processor)
Registers a custom processor for an audio token domain.
void update_routing_states(ProcessingToken token)
std::unique_ptr< BufferSupplyMixing > m_supply_mixing
Buffer supply and mixing operations.
std::unique_ptr< BufferAccessControl > m_access_control
Buffer and unit access operations.
void add_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Adds a buffer to a token and channel.
std::vector< ProcessingToken > get_active_tokens() const
Gets all currently active processing tokens.
void process_all_tokens()
Processes all active tokens with their configured processing units.
Advanced pipeline manager for multi-stage buffer transformations with backend optimization.
Processor attachment, removal, and processing chain management.
External buffer supply, mixing, and interleaved data I/O.
Token-scoped unit storage and lifecycle management.
std::function< void(const std::shared_ptr< AudioBuffer > &)> AudioProcessingFunction
Audio processing function - receives correctly-typed AudioBuffer.
static uint32_t s_preferred_buffer_size
Global default buffer size.
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(std::vector< std::shared_ptr< RootAudioBuffer > > &, uint32_t)> RootAudioProcessingFunction
std::function< void(const std::shared_ptr< VKBuffer > &)> GraphicsProcessingFunction
Graphics processing function - receives correctly-typed VKBuffer.
static uint64_t s_registered_sample_rate
Global default sample rate.
std::vector< double > mix(const std::vector< std::vector< double > > &streams)
Mix multiple data streams with equal weighting.