MayaFlux 0.1.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
154 if (auto buf_chain = buffer->get_processing_chain()) {
155 if (buf_chain != processing_chain) {
156 processing_chain->merge_chain(buf_chain);
157 }
158 } else {
159 buffer->set_processing_chain(processing_chain);
160 }
161
162 {
163 if (buffer->get_num_samples() != unit.buffer_size) {
165 "Resizing buffer to match unit size: {} samples", unit.buffer_size);
166
167 std::lock_guard<std::mutex> lock(m_unit_manager.get_mutex());
168 buffer->resize(unit.buffer_size);
169 }
170 }
171
172 unit.get_buffer(channel)->add_child_buffer(buffer);
173}
174
176 const std::shared_ptr<AudioBuffer>& buffer,
178 uint32_t channel)
179{
181 return;
182 }
183
185 if (channel >= unit.channel_count) {
186 return;
187 }
188
189 unit.get_buffer(channel)->remove_child_buffer(buffer);
190}
191
192const std::vector<std::shared_ptr<AudioBuffer>>& BufferAccessControl::get_audio_buffers(
194 uint32_t channel) const
195{
196 const auto& unit = m_unit_manager.get_audio_unit(token);
197 if (channel >= unit.channel_count) {
198 throw std::out_of_range("Audio channel out of range");
199 }
200 return unit.get_buffer(channel)->get_child_buffers();
201}
202
203// ============================================================================
204// Graphics Buffer Hierarchy Management
205// ============================================================================
206
208 const std::shared_ptr<Buffer>& buffer,
210{
211 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
212
214 auto processing_chain = unit.get_chain();
215
216 if (auto buf_chain = buffer->get_processing_chain()) {
217 if (buf_chain != processing_chain) {
218 processing_chain->merge_chain(buf_chain);
219 }
220 } else {
221 buffer->set_processing_chain(processing_chain, false);
222 }
223
224 try {
225 if (!vk_buffer->is_initialized()) {
226 if (!m_buffer_service) {
228 }
230 vk_buffer->setup_processors(token);
231 }
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());
237 }
238
239 unit.get_buffer()->add_child_buffer(vk_buffer);
240
242 "Added graphics buffer to token {} (total: {})",
243 static_cast<int>(token),
244 unit.get_buffer()->get_buffer_count());
245
246 } else {
248 std::source_location::current(),
249 "Unsupported graphics buffer type for token {}",
250 static_cast<int>(token));
251 }
252}
253
255 const std::shared_ptr<Buffer>& buffer,
257{
258 if (!buffer) {
260 "Attempted to remove null graphics buffer from token {}",
261 static_cast<int>(token));
262 return;
263 }
264
265 if (auto vk_buffer = std::dynamic_pointer_cast<VKBuffer>(buffer)) {
268 "Token {} not found when removing graphics buffer",
269 static_cast<int>(token));
270 return;
271 }
272
274 unit.get_buffer()->remove_child_buffer(vk_buffer);
275
276 try {
277 auto buffer_service = Registry::BackendRegistry::instance()
279 if (vk_buffer->is_initialized()) {
280 buffer_service->destroy_buffer(vk_buffer);
281 }
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());
287 }
288
290 "Removed graphics buffer from token {} (remaining: {})",
291 static_cast<int>(token),
292 unit.get_buffer()->get_buffer_count());
293 } else {
295 std::source_location::current(),
296 "Unsupported graphics buffer type for token {}",
297 static_cast<int>(token));
298 }
299}
300
301const std::vector<std::shared_ptr<VKBuffer>>& BufferAccessControl::get_graphics_buffers(
303{
304 const auto& unit = m_unit_manager.get_graphics_unit(token);
305 return unit.get_buffer()->get_child_buffers();
306}
307
308std::vector<std::shared_ptr<VKBuffer>> BufferAccessControl::get_graphics_buffers_by_usage(
309 VKBuffer::Usage usage,
311{
313 return {};
314 }
315
316 const auto& unit = m_unit_manager.get_graphics_unit(token);
317 return unit.get_buffer()->get_buffers_by_usage(usage);
318}
319
320// ============================================================================
321// Processing Chain Access
322// ============================================================================
323
324std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_audio_processing_chain(
326 uint32_t channel)
327{
328 ensure_audio_channels(token, channel + 1);
330 return unit.get_chain(channel);
331}
332
333std::shared_ptr<BufferProcessingChain> BufferAccessControl::get_graphics_processing_chain(
335{
337 return unit.get_chain();
338}
339
345
347{
348 for (const auto& token : m_unit_manager.get_active_audio_tokens()) {
350 for (uint32_t channel = 0; channel < unit.channel_count; ++channel) {
351 auto root_buffer = unit.get_buffer(channel);
352 root_buffer->clear();
353 for (auto& child : root_buffer->get_child_buffers()) {
354 child->clear();
355 }
356 }
357 }
358
359 for (const auto& token : m_unit_manager.get_active_graphics_tokens()) {
361 auto root_buffer = unit.get_buffer();
362 root_buffer->clear();
363 for (auto& child : root_buffer->get_child_buffers()) {
365 child->clear();
366 }
367 }
368}
369
370} // 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.