14 : m_unit_manager(unit_manager)
31 uint32_t channel)
const
70 std::source_location::current(),
71 "Invalid token for audio buffer access: {}",
static_cast<int>(
token));
79 uint32_t channel)
const
108 const std::shared_ptr<Buffer>& buffer,
113 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
117 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
124 const std::shared_ptr<Buffer>& buffer,
129 if (
auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
133 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
144 const std::shared_ptr<AudioBuffer>& buffer,
151 auto processing_chain = unit.
get_chain(channel);
152 buffer->set_channel_id(channel);
154 if (
auto buf_chain = buffer->get_processing_chain()) {
155 if (buf_chain != processing_chain) {
156 processing_chain->merge_chain(buf_chain);
159 buffer->set_processing_chain(processing_chain);
163 if (buffer->get_num_samples() != unit.buffer_size) {
165 "Resizing buffer to match unit size: {} samples", unit.buffer_size);
168 buffer->resize(unit.buffer_size);
172 unit.get_buffer(channel)->add_child_buffer(buffer);
176 const std::shared_ptr<AudioBuffer>& buffer,
185 if (channel >= unit.channel_count) {
189 unit.
get_buffer(channel)->remove_child_buffer(buffer);
194 uint32_t channel)
const
197 if (channel >= unit.channel_count) {
198 throw std::out_of_range(
"Audio channel out of range");
200 return unit.get_buffer(channel)->get_child_buffers();
208 const std::shared_ptr<Buffer>& buffer,
211 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
214 auto processing_chain = unit.
get_chain();
216 if (
auto buf_chain = buffer->get_processing_chain()) {
217 if (buf_chain != processing_chain) {
218 processing_chain->merge_chain(buf_chain);
221 buffer->set_processing_chain(processing_chain,
false);
225 if (!vk_buffer->is_initialized()) {
230 vk_buffer->setup_processors(
token);
232 }
catch (
const std::exception& e) {
234 std::source_location::current(),
235 "Failed to initialize graphics buffer for token {}: {}",
236 static_cast<int>(
token), e.what());
239 unit.get_buffer()->add_child_buffer(vk_buffer);
242 "Added graphics buffer to token {} (total: {})",
243 static_cast<int>(
token),
244 unit.get_buffer()->get_buffer_count());
248 std::source_location::current(),
249 "Unsupported graphics buffer type for token {}",
250 static_cast<int>(
token));
255 const std::shared_ptr<Buffer>& buffer,
260 "Attempted to remove null graphics buffer from token {}",
261 static_cast<int>(
token));
265 if (
auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
268 "Token {} not found when removing graphics buffer",
269 static_cast<int>(
token));
274 unit.
get_buffer()->remove_child_buffer(vk_buffer);
279 if (vk_buffer->is_initialized()) {
282 }
catch (
const std::exception& e) {
284 std::source_location::current(),
285 "Failed to cleanup graphics buffer for token {}: {}",
286 static_cast<int>(
token), e.what());
290 "Removed graphics buffer from token {} (remaining: {})",
291 static_cast<int>(
token),
292 unit.get_buffer()->get_buffer_count());
295 std::source_location::current(),
296 "Unsupported graphics buffer type for token {}",
297 static_cast<int>(
token));
305 return unit.
get_buffer()->get_child_buffers();
317 return unit.
get_buffer()->get_buffers_by_usage(usage);
350 for (uint32_t channel = 0; channel < unit.channel_count; ++channel) {
352 root_buffer->clear();
353 for (
auto& child : root_buffer->get_child_buffers()) {
362 root_buffer->clear();
363 for (
auto& child : root_buffer->get_child_buffers()) {
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#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 terminate_active_buffers()
Terminates all active Audio and VK buffers.
uint32_t get_num_audio_out_channels(ProcessingToken token) const
Gets the number of channels for an audio token.
void ensure_audio_channels(ProcessingToken token, uint32_t channel_count)
Ensures minimum number of audio channels exist for a token.
std::vector< double > & get_audio_buffer_data(ProcessingToken token, uint32_t channel)
Gets mutable reference to audio buffer data for a channel.
std::shared_ptr< BufferProcessingChain > get_graphics_processing_chain(ProcessingToken token)
Gets the processing chain for a graphics token.
const std::vector< std::shared_ptr< VKBuffer > > & get_graphics_buffers(ProcessingToken token) const
Gets all graphics buffers for a token.
void add_audio_buffer(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel)
Adds an audio buffer to a token and channel.
void remove_audio_buffer(const std::shared_ptr< AudioBuffer > &buffer, ProcessingToken token, uint32_t channel)
Removes an audio buffer from a token and channel.
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.
const std::vector< std::shared_ptr< AudioBuffer > > & get_audio_buffers(ProcessingToken token, uint32_t channel) const
Gets all audio buffers for a token and channel.
TokenUnitManager & m_unit_manager
Reference to the token/unit manager for storage operations.
void resize_audio_buffers(ProcessingToken token, uint32_t buffer_size)
Resizes all audio buffers for a token to the specified size.
Registry::Service::BufferService * m_buffer_service
Vulkan buffer processing context.
void initialize_buffer_service()
Initializes the buffer service for Vulkan operations.
void remove_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Removes a buffer from a token (dispatches based on token type)
BufferAccessControl(TokenUnitManager &unit_manager)
Creates a new access control handler.
uint32_t get_audio_buffer_size(ProcessingToken token) const
Gets the buffer size for an audio token.
void add_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token, uint32_t channel=0)
Adds a buffer to a token (dispatches based on token type)
std::vector< std::shared_ptr< VKBuffer > > get_graphics_buffers_by_usage(VKBuffer::Usage usage, ProcessingToken token) const
Gets graphics buffers filtered by usage type.
void add_graphics_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token)
Adds a graphics buffer to a token.
void remove_graphics_buffer(const std::shared_ptr< Buffer > &buffer, ProcessingToken token)
Removes a graphics buffer from a token.
std::vector< ProcessingToken > get_active_audio_tokens() const
Gets all active audio processing tokens.
void resize_audio_buffers(ProcessingToken token, uint32_t buffer_size)
Resizes all buffers in an audio unit to the specified size.
uint32_t get_audio_channel_count(ProcessingToken token) const
Gets the number of channels in an audio unit.
void ensure_audio_channels(ProcessingToken token, uint32_t channel_count)
Ensures an audio unit exists and resizes it to the specified channel count.
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)
RootGraphicsUnit & get_or_create_graphics_unit(ProcessingToken token)
Gets or creates a root graphics unit for the specified token.
std::mutex & get_mutex() const
Acquires the manager's mutex for external synchronization.
std::vector< ProcessingToken > get_active_graphics_tokens() const
Gets all active graphics processing tokens.
const RootGraphicsUnit & get_graphics_unit(ProcessingToken token) const
Gets an existing graphics unit without creating if missing.
RootAudioUnit & get_or_create_audio_unit(ProcessingToken token)
Gets or creates a root audio unit for the specified token.
uint32_t get_audio_buffer_size(ProcessingToken token) const
Gets the buffer size for an audio unit.
bool has_graphics_unit(ProcessingToken token) const
Checks if a graphics unit exists for the given token.
Token-scoped unit storage and lifecycle management.
Interface * get_service()
Query for a backend service.
static BackendRegistry & instance()
Get the global registry instance.
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.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Core
Core engine, backend, subsystems.
std::shared_ptr< RootAudioBuffer > get_buffer(uint32_t channel) const
std::shared_ptr< BufferProcessingChain > get_chain(uint32_t channel) const
std::shared_ptr< RootGraphicsBuffer > get_buffer() const
std::shared_ptr< BufferProcessingChain > get_chain() const
std::function< void(const std::shared_ptr< void > &)> initialize_buffer
Initialize a buffer object.
std::function< void(const std::shared_ptr< void > &)> destroy_buffer
Destroy a buffer and free its associated memory.
Backend buffer management service interface.