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 throw std::out_of_range("Audio unit not found for token");
103 }
104 return it->second;
105}
106
108{
109 auto& unit = get_or_create_audio_unit(token);
110 if (channel >= unit.channel_count) {
111 ensure_audio_channels(token, channel + 1);
112 }
113 return unit;
114}
115
117{
118 return m_audio_units.find(token) != m_audio_units.end();
119}
120
121std::vector<ProcessingToken> TokenUnitManager::get_active_audio_tokens() const
122{
123 std::vector<ProcessingToken> tokens;
124 for (const auto& [token, unit] : m_audio_units) {
125 if (!unit.root_buffers.empty()) {
126 tokens.push_back(token);
127 }
128 }
129 return tokens;
130}
131
132// ============================================================================
133// Graphics Unit Management
134// ============================================================================
135
137{
138 auto it = m_graphics_units.find(token);
139 if (it == m_graphics_units.end()) {
140 std::lock_guard<std::mutex> lock(m_manager_mutex);
141
142 auto [inserted_it, success] = m_graphics_units.emplace(token, RootGraphicsUnit {});
143 inserted_it->second.initialize(token);
144
146 "Created new graphics unit for token {}", static_cast<int>(token));
147
148 return inserted_it->second;
149 }
150 return it->second;
151}
152
154{
155 auto it = m_graphics_units.find(token);
156 if (it == m_graphics_units.end()) {
157 throw std::out_of_range("Graphics unit not found for token");
158 }
159 return it->second;
160}
161
163{
164 auto it = m_graphics_units.find(token);
165 if (it == m_graphics_units.end()) {
166 throw std::out_of_range("Graphics unit not found for token");
167 }
168 return it->second;
169}
170
172{
173 return m_graphics_units.find(token) != m_graphics_units.end();
174}
175
176std::vector<ProcessingToken> TokenUnitManager::get_active_graphics_tokens() const
177{
178 std::vector<ProcessingToken> tokens;
179 for (const auto& [token, unit] : m_graphics_units) {
180 if (unit.get_buffer() && !unit.get_buffer()->get_child_buffers().empty()) {
181 tokens.push_back(token);
182 }
183 }
184 return tokens;
185}
186
187// ============================================================================
188// Audio Unit Operations
189// ============================================================================
190
192 ProcessingToken token,
193 uint32_t channel_count)
194{
195 auto& unit = get_or_create_audio_unit(token);
196 if (channel_count > unit.channel_count) {
197 std::lock_guard<std::mutex> lock(m_manager_mutex);
198 unit.resize_channels(channel_count, unit.buffer_size, token);
199 }
200}
201
203{
204 auto& unit = get_or_create_audio_unit(token);
205 std::lock_guard<std::mutex> lock(m_manager_mutex);
206 unit.resize_buffers(buffer_size);
207}
208
210{
211 auto it = m_audio_units.find(token);
212 return (it != m_audio_units.end()) ? it->second.channel_count : 0;
213}
214
216{
217 auto it = m_audio_units.find(token);
218 return (it != m_audio_units.end()) ? it->second.buffer_size : m_preferred_buffer_size;
219}
220}
#define MF_INFO(comp, ctx,...)
uint32_t channel
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.