13 : m_buffer_size(buffer_size)
15 Registry::BackendRegistry::instance()
16 .get_service<Registry::Service::AudioBackendService>())
20 "AudioOutputAccessProcessor: AudioBackendService not yet registered"
21 "process() calls will be no-ops until the service is available");
26 const std::shared_ptr<SignalSourceContainer>& container)
28 auto ac = std::dynamic_pointer_cast<AudioOutputContainer>(container);
30 error<std::invalid_argument>(
33 std::source_location::current(),
34 "AudioOutputAccessProcessor requires an AudioOutputContainer");
40 ac->mark_ready_for_processing(
true);
43 "AudioOutputAccessProcessor attached: {} channels, {} frames/cycle, {}",
49 const std::shared_ptr<SignalSourceContainer>& )
56 const std::shared_ptr<SignalSourceContainer>& container)
61 auto ac = std::dynamic_pointer_cast<AudioOutputContainer>(container);
64 "AudioOutputAccessProcessor requires an AudioOutputContainer");
71 "AudioBackendService unavailable");
79 "AudioOutputAccessProcessor: snapshot empty, no cycle completed yet");
86 thread_local std::vector<std::vector<double>> tl_channels;
89 for (
auto& ch : tl_channels)
99 tl_channels[0].assign(snap.begin(), snap.end());
104 std::unique_lock lock(ac->m_data_mutex);
105 auto& pd = ac->get_processed_data();
116 const uint64_t write_head = ac->get_num_frames();
119 std::unique_lock lock(ac->m_data_mutex);
124 auto& vec = std::get<std::vector<double>>(ac->m_data[ch]);
125 vec.insert(vec.end(), tl_channels[ch].begin(), tl_channels[ch].end());
128 if (ac->m_data.empty())
129 ac->m_data.resize(1,
DataVariant(std::vector<double> {}));
130 auto& vec = std::get<std::vector<double>>(ac->m_data[0]);
131 vec.insert(vec.end(), tl_channels[0].begin(), tl_channels[0].end());
134 ac->setup_dimensions();
135 ac->invalidate_span_cache();
136 ac->m_double_extraction_dirty.store(
true, std::memory_order_release);
#define MF_INFO(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
AudioOutputAccessProcessor(uint32_t buffer_size)
Construct with the fixed output block size.
std::atomic< bool > m_is_processing
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Validate container type, cache structure, mark ready for processing.
Registry::Service::AudioBackendService * m_backend_service
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Pull engine snapshot, write m_processed_data, append to m_data.
OrganizationStrategy m_organization
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Clear cached state.
@ Configuration
Configuration and parameter updates.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ PROCESSING
Container is actively being processed.
@ PROCESSED
Container has completed processing and results are available.
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.
@ PLANAR
Separate DataVariant per logical unit (LLL...RRR for stereo)
std::function< std::span< const double >()> get_output_snapshot
Returns a span over the last committed interleaved output buffer.