123 if (route_image(op)) {
134 if (!graphics_data) {
137 buffer_data = std::move(*graphics_data);
146 switch (capture_mode) {
147 case BufferCapture::CaptureMode::TRANSIENT:
148 m_operation_data[&op] = buffer_data;
151 case BufferCapture::CaptureMode::ACCUMULATE: {
152 auto it = m_operation_data.find(&op);
153 if (it == m_operation_data.end()) {
154 m_operation_data[&op] = buffer_data;
157 append_capture_data(it->second, buffer_data);
159 }
catch (
const std::bad_variant_access& e) {
161 Journal::Context::CoroutineScheduling,
162 "Data type mismatch during ACCUMULATE capture: {}",
164 m_operation_data[&op] = buffer_data;
169 case BufferCapture::CaptureMode::CIRCULAR: {
171 if (circular_size == 0) {
172 circular_size = 4096;
175 auto it = m_operation_data.find(&op);
176 if (it == m_operation_data.end()) {
177 m_operation_data[&op] = buffer_data;
180 update_circular_capture(it->second, buffer_data, circular_size);
182 }
catch (
const std::bad_variant_access& e) {
184 Journal::Context::CoroutineScheduling,
185 "Data type mismatch during CIRCULAR capture: {}",
187 m_operation_data[&op] = buffer_data;
188 }
catch (std::exception& e) {
189 error_rethrow(Journal::Component::Kriya,
190 Journal::Context::CoroutineScheduling,
191 std::source_location::current(),
192 "Error during CIRCULAR capture: {}",
194 m_operation_data[&op] = buffer_data;
199 case BufferCapture::CaptureMode::WINDOWED: {
203 if (window_size == 0) {
207 auto hop_size =
static_cast<uint32_t
>((float)window_size * (1.0F - overlap_ratio));
211 auto it = m_operation_data.find(&op);
212 if (it == m_operation_data.end()) {
213 m_operation_data[&op] = buffer_data;
216 update_windowed_capture(it->second, buffer_data, window_size, hop_size);
218 }
catch (
const std::bad_variant_access& e) {
219 MF_ERROR(Journal::Component::Kriya, Journal::Context::CoroutineScheduling,
220 "Data type mismatch during WINDOWED capture: {}", e.what());
221 m_operation_data[&op] = buffer_data;
227 case BufferCapture::CaptureMode::TRIGGERED: {
229 m_operation_data[&op] = buffer_data;
235 m_operation_data[&op] = buffer_data;
239 if (has_immediate_routing(op)) {
240 auto current_it = std::ranges::find_if(m_operations,
243 if (current_it != m_operations.end()) {
244 auto next_it = std::next(current_it);
245 if (next_it != m_operations.end() && next_it->get_type() == BufferOperation::OpType::ROUTE) {
247 if (next_it->m_target_audio_buffer) {
248 if (!m_buffer_manager) {
249 error<std::invalid_argument>(Journal::Component::Kriya,
250 Journal::Context::CoroutineScheduling,
251 std::source_location::current(),
252 "BufferPipeline has no BufferManager for immediate ROUTE-to-buffer");
255 if (!next_it->m_attached_processor) {
256 auto writer = std::make_shared<Buffers::AudioWriteProcessor>();
257 m_buffer_manager->add_processor(writer, next_it->m_target_audio_buffer,
258 Buffers::ProcessingToken::AUDIO_BACKEND);
259 next_it->m_attached_processor = writer;
262 std::static_pointer_cast<Buffers::AudioWriteProcessor>(next_it->m_attached_processor)
263 ->set_data(buffer_data);
264 }
else if (next_it->m_target_graphics_buffer) {
265 queue_graphics_write(*next_it, next_it->m_target_graphics_buffer, buffer_data);
266 }
else if (next_it->m_target_audio_stream) {
267 detail::write_to_container(next_it->m_target_audio_stream, buffer_data, next_it->m_target_audio_channel);
268 }
else if (next_it->m_target_graphics_stream) {
269 detail::write_to_container(next_it->m_target_graphics_stream, buffer_data);
272 size_t route_index = std::distance(m_operations.begin(), next_it);
273 if (route_index < m_data_states.size()) {
274 m_data_states[route_index] = DataState::CONSUMED;
306void BufferPipeline::cleanup_expired_data()
308 for (
size_t i = 0; i < m_data_states.size(); ++i) {
309 if (m_data_states[i] == DataState::READY) {
310 if (i < m_operations.size() && m_operations[i].get_type() == BufferOperation::OpType::CAPTURE && m_operations[i].m_capture.get_mode() == BufferCapture::CaptureMode::TRANSIENT) {
312 if (m_operations[i].m_capture.m_data_expired_callback) {
313 auto it = m_operation_data.find(&m_operations[i]);
314 if (it != m_operation_data.end()) {
315 m_operations[i].m_capture.m_data_expired_callback(it->second, m_current_cycle);
319 m_data_states[i] = DataState::EXPIRED;
321 m_data_states[i] = DataState::CONSUMED;
326 auto it = m_operation_data.begin();
327 while (it != m_operation_data.end()) {
328 if (m_current_cycle > 2) {
329 it = m_operation_data.erase(it);
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.