MayaFlux 0.4.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
23 ProcessingToken token,
24 uint32_t channel)
25{
26 return get_root_audio_buffer(token, channel)->get_data();
27}
28
30 ProcessingToken token,
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
51{
52 m_unit_manager.resize_audio_buffers(token, buffer_size);
53}
54
56{
57 m_unit_manager.ensure_audio_channels(token, channel_count);
58}
59
60// ============================================================================
61// Root Buffer Access (Audio)
62// ============================================================================
63
64std::shared_ptr<RootAudioBuffer> BufferAccessControl::get_root_audio_buffer(
65 ProcessingToken token,
66 uint32_t channel)
67{
70 std::source_location::current(),
71 "Invalid token for audio buffer access: {}", static_cast<int>(token));
72 }
73 auto& unit = m_unit_manager.get_or_create_audio_unit(token);
74 return unit.get_buffer(channel);
75}
76
77std::shared_ptr<const RootAudioBuffer> BufferAccessControl::get_root_audio_buffer(
78 ProcessingToken token,
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(
90 ProcessingToken token)
91{
93 return unit.get_buffer();
94}
95
96std::shared_ptr<const RootGraphicsBuffer> BufferAccessControl::get_root_graphics_buffer(
97 ProcessingToken token) const
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,
109 ProcessingToken token,
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 }
116 } else if (token == ProcessingToken::GRAPHICS_BACKEND) {
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,
125 ProcessingToken token,
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 }
132 } else if (token == ProcessingToken::GRAPHICS_BACKEND) {
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,
145 ProcessingToken token,
146 uint32_t channel)
147{
148 ensure_audio_channels(token, channel + 1);
149
150 auto& unit = m_unit_manager.get_or_create_audio_unit(token);
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,
178 ProcessingToken token,
179 uint32_t channel)
180{
181 if (!m_unit_manager.has_audio_unit(token)) {
182 return;
183 }
184
185 auto& unit = m_unit_manager.get_audio_unit_mutable(token);
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(
194 ProcessingToken token,
195 uint32_t channel) const
196{
197 const auto& unit = m_unit_manager.get_audio_unit(token);
198 if (channel >= unit.channel_count) {
200 std::source_location::current(),
201 "Audio channel {} out of range for token {}",
202 channel, static_cast<int>(token));
203 }
204 return unit.get_buffer(channel)->get_child_buffers();
205}
206
207// ============================================================================
208// Graphics Buffer Hierarchy Management
209// ============================================================================
210
212 const std::shared_ptr<Buffer>& buffer,
213 ProcessingToken token)
214{
215 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
216
218 auto processing_chain = unit.get_chain();
219
220 if (auto buf_chain = buffer->get_processing_chain()) {
221 if (buf_chain != processing_chain) {
222 processing_chain->merge_chain(buf_chain);
223 }
224 } else {
225 buffer->set_processing_chain(processing_chain, false);
226 }
227
228 try {
229 if (!vk_buffer->is_initialized()) {
230 if (!m_buffer_service) {
232 }
234 vk_buffer->setup_processors(token);
235 }
236 } catch (const std::exception& e) {
238 std::source_location::current(),
239 "Failed to initialize graphics buffer for token {}: {}",
240 static_cast<int>(token), e.what());
241 }
242
243 unit.get_buffer()->add_child_buffer(vk_buffer);
244
246 "Added graphics buffer to token {} (total: {})",
247 static_cast<int>(token),
248 unit.get_buffer()->get_buffer_count());
249
250 } else {
252 std::source_location::current(),
253 "Unsupported graphics buffer type for token {}",
254 static_cast<int>(token));
255 }
256}
257
259 const std::shared_ptr<Buffer>& buffer,
260 ProcessingToken token)
261{
262 if (!buffer) {
264 "Attempted to remove null graphics buffer from token {}",
265 static_cast<int>(token));
266 return;
267 }
268
269 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
270 if (!m_unit_manager.has_graphics_unit(token)) {
272 "Token {} not found when removing graphics buffer",
273 static_cast<int>(token));
274 return;
275 }
276
277 auto& unit = m_unit_manager.get_graphics_unit_mutable(token);
278 unit.get_buffer()->remove_child_buffer(vk_buffer);
279
280 try {
281 auto buffer_service = Registry::BackendRegistry::instance()
283 if (vk_buffer->is_initialized()) {
284 buffer_service->destroy_buffer(vk_buffer);
285 }
286 } catch (const std::exception& e) {
288 std::source_location::current(),
289 "Failed to cleanup graphics buffer for token {}: {}",
290 static_cast<int>(token), e.what());
291 }
292
294 "Removed graphics buffer from token {} (remaining: {})",
295 static_cast<int>(token),
296 unit.get_buffer()->get_buffer_count());
297 } else {
299 std::source_location::current(),
300 "Unsupported graphics buffer type for token {}",
301 static_cast<int>(token));
302 }
303}
304
305const std::vector<std::shared_ptr<VKBuffer>>& BufferAccessControl::get_graphics_buffers(
306 ProcessingToken token) const
307{
308 const auto& unit = m_unit_manager.get_graphics_unit(token);
309 return unit.get_buffer()->get_child_buffers();
310}
311
312std::vector<std::shared_ptr<VKBuffer>> BufferAccessControl::get_graphics_buffers_by_usage(
313 VKBuffer::Usage usage,
314 ProcessingToken token) const
315{
316 if (!m_unit_manager.has_graphics_unit(token)) {
317 return {};
318 }
319
320 const auto& unit = m_unit_manager.get_graphics_unit(token);
321 return unit.get_buffer()->get_buffers_by_usage(usage);
322}
323
324// ============================================================================
325// Processing Chain Access
326// ============================================================================
327
328std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_audio_processing_chain(
329 ProcessingToken token,
330 uint32_t channel)
331{
332 ensure_audio_channels(token, channel + 1);
333 auto& unit = m_unit_manager.get_or_create_audio_unit(token);
334 return unit.get_chain(channel);
335}
336
337std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_graphics_processing_chain(
338 ProcessingToken token)
339{
341 return unit.get_chain();
342}
343
349
351{
352 for (const auto& token : m_unit_manager.get_active_audio_tokens()) {
353 auto& unit = m_unit_manager.get_audio_unit_mutable(token);
354 for (uint32_t channel = 0; channel < unit.channel_count; ++channel) {
355 auto root_buffer = unit.get_buffer(channel);
356 root_buffer->clear();
357 for (auto& child : root_buffer->get_child_buffers()) {
358 if (child)
359 child->clear();
360 }
361 unit.root_buffers[channel].reset();
362 }
363 }
364
365 for (const auto& token : m_unit_manager.get_active_graphics_tokens()) {
366 auto& unit = m_unit_manager.get_graphics_unit_mutable(token);
367 auto root_buffer = unit.get_buffer();
368 root_buffer->clear();
369 for (auto& child : root_buffer->get_child_buffers()) {
370 if (child) {
371 remove_graphics_buffer(child, token);
372 child->clear();
373 }
374 }
375 unit.root_buffer.reset();
376 }
377}
378
379} // namespace MayaFlux::Buffers
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
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.