MayaFlux 0.1.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 : m_default_audio_token(default_audio_token)
63 , m_default_graphics_token(default_graphics_token)
64{
65}
66
67// ============================================================================
68// Audio Unit Management
69// ============================================================================
70
72{
73 auto it = m_audio_units.find(token);
74 if (it == m_audio_units.end()) {
75 std::lock_guard<std::mutex> lock(m_manager_mutex);
76 auto [inserted_it, success] = m_audio_units.emplace(token, RootAudioUnit {});
77 return inserted_it->second;
78 }
79 return it->second;
80}
81
83{
84 auto it = m_audio_units.find(token);
85 if (it == m_audio_units.end()) {
86 error<std::out_of_range>(
89 std::source_location::current(),
90 "Audio unit not found for token {}",
91 static_cast<int>(token));
92 }
93 return it->second;
94}
95
97{
98 auto it = m_audio_units.find(token);
99 if (it == m_audio_units.end()) {
100 throw std::out_of_range("Audio unit not found for token");
101 }
102 return it->second;
103}
104
106{
107 auto& unit = get_or_create_audio_unit(token);
108 if (channel >= unit.channel_count) {
109 ensure_audio_channels(token, channel + 1);
110 }
111 return unit;
112}
113
118
119std::vector<ProcessingToken> TokenUnitManager::get_active_audio_tokens() const
120{
121 std::vector<ProcessingToken> tokens;
122 for (const auto& [token, unit] : m_audio_units) {
123 if (!unit.root_buffers.empty()) {
124 tokens.push_back(token);
125 }
126 }
127 return tokens;
128}
129
130// ============================================================================
131// Graphics Unit Management
132// ============================================================================
133
135{
136 auto it = m_graphics_units.find(token);
137 if (it == m_graphics_units.end()) {
138 std::lock_guard<std::mutex> lock(m_manager_mutex);
139
140 auto [inserted_it, success] = m_graphics_units.emplace(token, RootGraphicsUnit {});
141 inserted_it->second.initialize(token);
142
144 "Created new graphics unit for token {}", static_cast<int>(token));
145
146 return inserted_it->second;
147 }
148 return it->second;
149}
150
152{
153 auto it = m_graphics_units.find(token);
154 if (it == m_graphics_units.end()) {
155 throw std::out_of_range("Graphics unit not found for token");
156 }
157 return it->second;
158}
159
161{
162 auto it = m_graphics_units.find(token);
163 if (it == m_graphics_units.end()) {
164 throw std::out_of_range("Graphics unit not found for token");
165 }
166 return it->second;
167}
168
173
174std::vector<ProcessingToken> TokenUnitManager::get_active_graphics_tokens() const
175{
176 std::vector<ProcessingToken> tokens;
177 for (const auto& [token, unit] : m_graphics_units) {
178 if (unit.get_buffer() && !unit.get_buffer()->get_child_buffers().empty()) {
179 tokens.push_back(token);
180 }
181 }
182 return tokens;
183}
184
185// ============================================================================
186// Audio Unit Operations
187// ============================================================================
188
191 uint32_t channel_count)
192{
193 auto& unit = get_or_create_audio_unit(token);
194 if (channel_count > unit.channel_count) {
195 std::lock_guard<std::mutex> lock(m_manager_mutex);
196 unit.resize_channels(channel_count, unit.buffer_size, token);
197 }
198}
199
201{
202 auto& unit = get_or_create_audio_unit(token);
203 std::lock_guard<std::mutex> lock(m_manager_mutex);
204 unit.resize_buffers(buffer_size);
205}
206
208{
209 auto it = m_audio_units.find(token);
210 return (it != m_audio_units.end()) ? it->second.channel_count : 0;
211}
212
214{
215 auto it = m_audio_units.find(token);
216 return (it != m_audio_units.end()) ? it->second.buffer_size : 512;
217}
218}
#define MF_INFO(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
Definition Timers.cpp:8
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.