24 std::shared_ptr<Nodes::Node> node)
27 MF_ERROR(C, X,
"PlotProcessor::bind_node: null node for series {}", series_index);
32 b.node = std::move(node);
33 b.node->add_buffer_reference();
34 b.audio_buffer.reset();
40 std::shared_ptr<Buffers::AudioBuffer> buffer)
43 MF_ERROR(C, X,
"PlotProcessor::bind_audio_buffer: null buffer for series {}", series_index);
48 b.audio_buffer = std::move(buffer);
55 std::shared_ptr<Nodes::Network::NodeNetwork>
network)
58 MF_ERROR(C, X,
"PlotProcessor::bind_network: null network for series {}", series_index);
62 const auto mode =
network->get_output_mode();
66 "PlotProcessor::bind_network: network for series {} has no audio output mode", series_index);
74 b.audio_buffer.reset();
79 std::function<
void(std::vector<double>&)> fn)
82 MF_ERROR(C, X,
"PlotProcessor::bind_callable: null callable for series {}", series_index);
87 b.callable = std::move(fn);
89 b.audio_buffer.reset();
97 b.pending_raw = std::move(data);
98 b.raw_dirty.test_and_set(std::memory_order_release);
108 it->second.role = role;
109 it->second.modality = modality;
118 it->second.node->remove_buffer_reference();
133 if (!std::dynamic_pointer_cast<PlotContainer>(container))
134 MF_ERROR(C, X,
"PlotProcessor requires a PlotContainer");
141 b.node->remove_buffer_reference();
148 auto plot = std::dynamic_pointer_cast<PlotContainer>(container);
150 MF_ERROR(C, X,
"PlotProcessor::process: container is not a PlotContainer");
157 if (idx >= plot->series_count())
160 thread_local std::vector<double> staging;
161 staging.resize(plot->series_size(idx));
164 auto frame = plot->get_frame(idx);
165 if (frame.size() == staging.size()) {
166 std::ranges::copy(frame, staging.begin());
168 std::ranges::fill(staging, 0.0);
172 switch (
b.source_type) {
190 plot->write_series(idx, staging);
193 auto& src = plot->get_data();
194 auto& dst = plot->get_processed_data();
195 dst.resize(src.size());
196 for (
size_t i = 0; i < src.size(); ++i)
212 const size_t n = std::min(series.size(), samples.size());
213 std::copy_n(samples.begin(), n, series.begin());
214 if (n < series.size())
215 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
223 const auto& data =
b.audio_buffer->get_data();
224 const size_t n = std::min(series.size(), data.size());
225 std::copy_n(data.begin(), n, series.begin());
226 if (n < series.size())
227 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
235 auto buf =
b.network->get_audio_buffer();
239 const size_t n = std::min(series.size(), buf->size());
240 std::copy_n(buf->begin(), n, series.begin());
241 if (n < series.size())
242 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
253 if (!
b.raw_dirty.test(std::memory_order_acquire))
255 b.raw_dirty.clear(std::memory_order_release);
256 const size_t n = std::min(series.size(),
b.pending_raw.size());
257 std::copy_n(
b.pending_raw.begin(), n, series.begin());
258 if (n < series.size())
259 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
#define MF_ERROR(comp, ctx,...)
Core::GlobalNetworkConfig network
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Called when this processor is detached from a container.
void unbind(uint32_t series_index)
Remove a binding from a series slot.
bool has_binding(uint32_t series_index) const
void acquire_from_raw(SeriesBinding &b, std::vector< double > &series)
void bind_network(uint32_t series_index, std::shared_ptr< Nodes::Network::NodeNetwork > network)
Bind a series slot to a NodeNetwork with audio output.
void bind_audio_buffer(uint32_t series_index, std::shared_ptr< Buffers::AudioBuffer > buffer)
Bind a series slot to an AudioBuffer.
void bind_callable(uint32_t series_index, std::function< void(std::vector< double > &)> fn)
Bind a series slot to a callable.
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Called when this processor is attached to a container.
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Acquire data from all bound sources and write into the container.
void bind_node(uint32_t series_index, std::shared_ptr< Nodes::Node > node)
Bind a series slot to a Node.
std::atomic< bool > m_processing
void set_raw(uint32_t series_index, std::vector< double > data)
Push raw sample data for a series.
std::unordered_map< uint32_t, SeriesBinding > m_bindings
void acquire_from_audio_buffer(SeriesBinding &b, std::vector< double > &series)
void acquire_from_callable(SeriesBinding &b, std::vector< double > &series)
void acquire_from_node(SeriesBinding &b, std::vector< double > &series)
void set_series_semantics(uint32_t series_index, DataDimension::Role role, DataModality modality)
Set the role and modality for a series binding.
void acquire_from_network(SeriesBinding &b, std::vector< double > &series)
std::vector< double > extract_multiple_samples(const std::shared_ptr< Nodes::Node > &node, size_t num_samples)
Extract multiple samples from a node into a vector.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
DataModality
Data modality types for cross-modal analysis.
@ AUDIO_COMPUTE
processed each cycle but not sent to output
@ AUDIO_SINK
Aggregated audio samples sent to output.
Role
Semantic role of the dimension.