MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
BufferAccessControl.cpp
Go to the documentation of this file.
2
4
8
10
11namespace MayaFlux::Buffers {
12
14 : m_unit_manager(unit_manager)
15{
16}
17
18// ============================================================================
19// Audio Buffer Data Access
20// ============================================================================
21
24 uint32_t channel)
25{
26 return get_root_audio_buffer(token, channel)->get_data();
27}
28
31 uint32_t channel) const
32{
33 return get_root_audio_buffer(token, channel)->get_data();
34}
35
36// ============================================================================
37// Audio Channel and Sizing Operations
38// ============================================================================
39
44
49
54
59
60// ============================================================================
61// Root Buffer Access (Audio)
62// ============================================================================
63
64std::shared_ptr<RootAudioBuffer> BufferAccessControl::get_root_audio_buffer(
66 uint32_t channel)
67{
70 std::source_location::current(),
71 "Invalid token for audio buffer access: {}", static_cast<int>(token));
72 }
74 return unit.get_buffer(channel);
75}
76
77std::shared_ptr<const RootAudioBuffer> BufferAccessControl::get_root_audio_buffer(
79 uint32_t channel) const
80{
81 const auto& unit = m_unit_manager.get_audio_unit(token);
82 return unit.get_buffer(channel);
83}
84
85// ============================================================================
86// Root Buffer Access (Graphics)
87// ============================================================================
88
89std::shared_ptr<RootGraphicsBuffer> BufferAccessControl::get_root_graphics_buffer(
91{
93 return unit.get_buffer();
94}
95
96std::shared_ptr<const RootGraphicsBuffer> BufferAccessControl::get_root_graphics_buffer(
98{
99 const auto& unit = m_unit_manager.get_graphics_unit(token);
100 return unit.get_buffer();
101}
102
103// ============================================================================
104// Token-Dispatching Buffer Management
105// ============================================================================
106
108 const std::shared_ptr<Buffer>& buffer,
110 uint32_t channel)
111{
113 if (auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
114 add_audio_buffer(audio_buffer, token, channel);
115 }
117 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
118 add_graphics_buffer(vk_buffer, token);
119 }
120 }
121}
122
124 const std::shared_ptr<Buffer>& buffer,
126 uint32_t channel)
127{
129 if (auto audio_buffer = std::dynamic_pointer_cast<AudioBuffer>(buffer)) {
130 remove_audio_buffer(audio_buffer, token, channel);
131 }
133 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
134 remove_graphics_buffer(vk_buffer, token);
135 }
136 }
137}
138
139// ============================================================================
140// Audio Buffer Hierarchy Management
141// ============================================================================
142
144 const std::shared_ptr<AudioBuffer>& buffer,
146 uint32_t channel)
147{
148 ensure_audio_channels(token, channel + 1);
149
151 auto processing_chain = unit.get_chain(channel);
152 buffer->set_channel_id(channel);
153 buffer->setup_processors(token);
154
155 if (auto buf_chain = buffer->get_processing_chain()) {
156 if (buf_chain != processing_chain) {
157 processing_chain->merge_chain(buf_chain);
158 }
159 } else {
160 buffer->set_processing_chain(processing_chain);
161 }
162
163 {
164 if (buffer->get_num_samples() != unit.buffer_size) {
166 "Resizing buffer to match unit size: {} samples", unit.buffer_size);
167
168 std::lock_guard<std::mutex> lock(m_unit_manager.get_mutex());
169 buffer->resize(unit.buffer_size);
170 }
171 }
172
173 unit.get_buffer(channel)->add_child_buffer(buffer);
174}
175
177 const std::shared_ptr<AudioBuffer>& buffer,
179 uint32_t channel)
180{
182 return;
183 }
184
186 if (channel >= unit.channel_count) {
187 return;
188 }
189
190 unit.get_buffer(channel)->remove_child_buffer(buffer);
191}
192
193const std::vector<std::shared_ptr<AudioBuffer>>& BufferAccessControl::get_audio_buffers(
195 uint32_t channel) const
196{
197 const auto& unit = m_unit_manager.get_audio_unit(token);
198 if (channel >= unit.channel_count) {
199 throw std::out_of_range("Audio channel out of range");
200 }
201 return unit.get_buffer(channel)->get_child_buffers();
202}
203
204// ============================================================================
205// Graphics Buffer Hierarchy Management
206// ============================================================================
207
209 const std::shared_ptr<Buffer>& buffer,
211{
212 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
213
215 auto processing_chain = unit.get_chain();
216
217 if (auto buf_chain = buffer->get_processing_chain()) {
218 if (buf_chain != processing_chain) {
219 processing_chain->merge_chain(buf_chain);
220 }
221 } else {
222 buffer->set_processing_chain(processing_chain, false);
223 }
224
225 try {
226 if (!vk_buffer->is_initialized()) {
227 if (!m_buffer_service) {
229 }
231 vk_buffer->setup_processors(token);
232 }
233 } catch (const std::exception& e) {
235 std::source_location::current(),
236 "Failed to initialize graphics buffer for token {}: {}",
237 static_cast<int>(token), e.what());
238 }
239
240 unit.get_buffer()->add_child_buffer(vk_buffer);
241
243 "Added graphics buffer to token {} (total: {})",
244 static_cast<int>(token),
245 unit.get_buffer()->get_buffer_count());
246
247 } else {
249 std::source_location::current(),
250 "Unsupported graphics buffer type for token {}",
251 static_cast<int>(token));
252 }
253}
254
256 const std::shared_ptr<Buffer>& buffer,
258{
259 if (!buffer) {
261 "Attempted to remove null graphics buffer from token {}",
262 static_cast<int>(token));
263 return;
264 }
265
266 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
269 "Token {} not found when removing graphics buffer",
270 static_cast<int>(token));
271 return;
272 }
273
275 unit.get_buffer()->remove_child_buffer(vk_buffer);
276
277 try {
278 auto buffer_service = Registry::BackendRegistry::instance()
280 if (vk_buffer->is_initialized()) {
281 buffer_service->destroy_buffer(vk_buffer);
282 }
283 } catch (const std::exception& e) {
285 std::source_location::current(),
286 "Failed to cleanup graphics buffer for token {}: {}",
287 static_cast<int>(token), e.what());
288 }
289
291 "Removed graphics buffer from token {} (remaining: {})",
292 static_cast<int>(token),
293 unit.get_buffer()->get_buffer_count());
294 } else {
296 std::source_location::current(),
297 "Unsupported graphics buffer type for token {}",
298 static_cast<int>(token));
299 }
300}
301
302const std::vector<std::shared_ptr<VKBuffer>>& BufferAccessControl::get_graphics_buffers(
304{
305 const auto& unit = m_unit_manager.get_graphics_unit(token);
306 return unit.get_buffer()->get_child_buffers();
307}
308
309std::vector<std::shared_ptr<VKBuffer>> BufferAccessControl::get_graphics_buffers_by_usage(
310 VKBuffer::Usage usage,
312{
314 return {};
315 }
316
317 const auto& unit = m_unit_manager.get_graphics_unit(token);
318 return unit.get_buffer()->get_buffers_by_usage(usage);
319}
320
321// ============================================================================
322// Processing Chain Access
323// ============================================================================
324
325std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_audio_processing_chain(
327 uint32_t channel)
328{
329 ensure_audio_channels(token, channel + 1);
331 return unit.get_chain(channel);
332}
333
334std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_graphics_processing_chain(
336{
338 return unit.get_chain();
339}
340
346
348{
349 for (const auto& token : m_unit_manager.get_active_audio_tokens()) {
351 for (uint32_t channel = 0; channel < unit.channel_count; ++channel) {
352 auto root_buffer = unit.get_buffer(channel);
353 root_buffer->clear();
354 for (auto& child : root_buffer->get_child_buffers()) {
355 if (child)
356 child->clear();
357 }
358 unit.root_buffers[channel].reset();
359 }
360 }
361
362 for (const auto& token : m_unit_manager.get_active_graphics_tokens()) {
364 auto root_buffer = unit.get_buffer();
365 root_buffer->clear();
366 for (auto& child : root_buffer->get_child_buffers()) {
367 if (child) {
369 child->clear();
370 }
371 }
372 unit.root_buffer.reset();
373 }
374}
375
376} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#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 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.