MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
TokenUnitManager.cpp
Go to the documentation of this file.
3
5
6namespace MayaFlux::Buffers {
7
8void RootAudioUnit::resize_channels(uint32_t new_count, uint32_t new_buffer_size, ProcessingToken token)
9{
10 if (new_count <= channel_count)
11 return;
12
13 uint32_t old_count = channel_count;
14 channel_count = new_count;
15 buffer_size = new_buffer_size;
16
17 root_buffers.resize(new_count);
18 processing_chains.resize(new_count);
19
20 for (uint32_t i = old_count; i < new_count; ++i) {
21 root_buffers[i] = std::make_shared<RootAudioBuffer>(i, buffer_size);
22 root_buffers[i]->initialize();
23 root_buffers[i]->set_token_active(true);
24
25 processing_chains[i] = std::make_shared<BufferProcessingChain>();
26 processing_chains[i]->set_preferred_token(token);
27 processing_chains[i]->set_enforcement_strategy(TokenEnforcementStrategy::FILTERED);
28
29 root_buffers[i]->set_processing_chain(processing_chains[i]);
30 }
31}
32
33void RootAudioUnit::resize_buffers(uint32_t new_buffer_size)
34{
35 buffer_size = new_buffer_size;
36 for (auto& buffer : root_buffers) {
37 buffer->resize(new_buffer_size);
38 }
39}
40
42 : root_buffer(std::make_shared<RootGraphicsBuffer>())
43 , processing_chain(std::make_shared<BufferProcessingChain>())
44{
46}
47
49{
50 root_buffer->initialize();
51 root_buffer->set_token_active(true);
52
53 processing_chain->set_preferred_token(token);
54 processing_chain->set_enforcement_strategy(TokenEnforcementStrategy::STRICT);
55
56 root_buffer->set_processing_chain(processing_chain);
57}
58
60 ProcessingToken default_audio_token,
61 ProcessingToken default_graphics_token,
62 uint32_t preferred_buffer_size)
63 : m_default_audio_token(default_audio_token)
64 , m_default_graphics_token(default_graphics_token)
65 , m_preferred_buffer_size(preferred_buffer_size)
66{
67}
68
69// ============================================================================
70// Audio Unit Management
71// ============================================================================
72
74{
75 auto it = m_audio_units.find(token);
76 if (it == m_audio_units.end()) {
77 std::lock_guard<std::mutex> lock(m_manager_mutex);
78 auto [inserted_it, success] = m_audio_units.emplace(token, RootAudioUnit { .buffer_size = m_preferred_buffer_size });
79 return inserted_it->second;
80 }
81 return it->second;
82}
83
85{
86 auto it = m_audio_units.find(token);
87 if (it == m_audio_units.end()) {
88 error<std::out_of_range>(
91 std::source_location::current(),
92 "Audio unit not found for token {}",
93 static_cast<int>(token));
94 }
95 return it->second;
96}
97
99{
100 auto it = m_audio_units.find(token);
101 if (it == m_audio_units.end()) {
102 error<std::out_of_range>(
105 std::source_location::current(),
106 "Audio unit not found for token {}",
107 static_cast<int>(token));
108 }
109 return it->second;
110}
111
113{
114 auto& unit = get_or_create_audio_unit(token);
115 if (channel >= unit.channel_count) {
116 ensure_audio_channels(token, channel + 1);
117 }
118 return unit;
119}
120
122{
123 return m_audio_units.find(token) != m_audio_units.end();
124}
125
126std::vector<ProcessingToken> TokenUnitManager::get_active_audio_tokens() const
127{
128 std::vector<ProcessingToken> tokens;
129 for (const auto& [token, unit] : m_audio_units) {
130 if (!unit.root_buffers.empty()) {
131 tokens.push_back(token);
132 }
133 }
134 return tokens;
135}
136
137// ============================================================================
138// Graphics Unit Management
139// ============================================================================
140
142{
143 auto it = m_graphics_units.find(token);
144 if (it == m_graphics_units.end()) {
145 std::lock_guard<std::mutex> lock(m_manager_mutex);
146
147 auto [inserted_it, success] = m_graphics_units.emplace(token, RootGraphicsUnit {});
148 inserted_it->second.initialize(token);
149
151 "Created new graphics unit for token {}", static_cast<int>(token));
152
153 return inserted_it->second;
154 }
155 return it->second;
156}
157
159{
160 auto it = m_graphics_units.find(token);
161 if (it == m_graphics_units.end()) {
162 error<std::out_of_range>(
165 std::source_location::current(),
166 "Graphics unit not found for token {}",
167 static_cast<int>(token));
168 }
169 return it->second;
170}
171
173{
174 auto it = m_graphics_units.find(token);
175 if (it == m_graphics_units.end()) {
176 error<std::out_of_range>(
179 std::source_location::current(),
180 "Graphics unit not found for token {}",
181 static_cast<int>(token));
182 }
183 return it->second;
184}
185
187{
188 return m_graphics_units.find(token) != m_graphics_units.end();
189}
190
191std::vector<ProcessingToken> TokenUnitManager::get_active_graphics_tokens() const
192{
193 std::vector<ProcessingToken> tokens;
194 for (const auto& [token, unit] : m_graphics_units) {
195 if (unit.get_buffer() && !unit.get_buffer()->get_child_buffers().empty()) {
196 tokens.push_back(token);
197 }
198 }
199 return tokens;
200}
201
202// ============================================================================
203// Audio Unit Operations
204// ============================================================================
205
207 ProcessingToken token,
208 uint32_t channel_count)
209{
210 auto& unit = get_or_create_audio_unit(token);
211 if (channel_count > unit.channel_count) {
212 std::lock_guard<std::mutex> lock(m_manager_mutex);
213 unit.resize_channels(channel_count, unit.buffer_size, token);
214 }
215}
216
218{
219 auto& unit = get_or_create_audio_unit(token);
220 std::lock_guard<std::mutex> lock(m_manager_mutex);
221 unit.resize_buffers(buffer_size);
222}
223
225{
226 auto it = m_audio_units.find(token);
227 return (it != m_audio_units.end()) ? it->second.channel_count : 0;
228}
229
231{
232 auto it = m_audio_units.find(token);
233 return (it != m_audio_units.end()) ? it->second.buffer_size : m_preferred_buffer_size;
234}
235}
#define MF_INFO(comp, ctx,...)
Advanced pipeline manager for multi-stage buffer transformations with backend optimization.
Root container for GPU buffer lifecycle management and batch processing.
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)
std::mutex m_manager_mutex
Mutex for thread-safe access to all unit maps.
RootGraphicsUnit & get_or_create_graphics_unit(ProcessingToken token)
Gets or creates a root graphics unit for the specified token.
std::unordered_map< ProcessingToken, RootGraphicsUnit > m_graphics_units
Token-based map of root graphics buffer units.
std::vector< ProcessingToken > get_active_graphics_tokens() const
Gets all active graphics processing tokens.
TokenUnitManager(ProcessingToken default_token, uint32_t default_out_channels, uint32_t default_buffer_size)
Creates a new unit manager with initial audio unit configuration.
std::unordered_map< ProcessingToken, RootAudioUnit > m_audio_units
Token-based map of root audio buffer units Maps: ProcessingToken -> channel -> {root_buffers,...
RootAudioUnit & ensure_and_get_audio_unit(ProcessingToken token, uint32_t channel)
Ensures a root audio unit exists for a specific token and channel.
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.
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ GRAPHICS_BACKEND
Standard graphics processing backend configuration.
@ STRICT
Strictly enforces token assignment with no cross-token sharing.
@ FILTERED
Filters processors through token enumeration, allowing compatible combinations.
@ BufferManagement
Buffer Management (Buffers::BufferManager, creating buffers)
@ Core
Core engine, backend, subsystems.
std::vector< std::shared_ptr< BufferProcessingChain > > processing_chains
std::vector< std::shared_ptr< RootAudioBuffer > > root_buffers
void resize_buffers(uint32_t new_buffer_size)
void resize_channels(uint32_t new_count, uint32_t new_buffer_size, ProcessingToken token)
Represents a root audio unit containing buffers and processing chains for multiple channels.
std::shared_ptr< RootGraphicsBuffer > root_buffer
void initialize(ProcessingToken token)
std::shared_ptr< BufferProcessingChain > processing_chain
Represents a root graphics unit containing a buffer and processing chain.