18 void release_node(PlotProcessor::SeriesBinding& binding)
22 binding.node->remove_buffer_reference();
32 std::shared_ptr<Nodes::Node> node)
35 MF_ERROR(C, X,
"PlotProcessor::bind_node: null node for series {}", series_index);
41 b.node = std::move(node);
42 b.node->add_buffer_reference();
43 b.audio_buffer.reset();
49 std::shared_ptr<Buffers::AudioBuffer>
buffer)
52 MF_ERROR(C, X,
"PlotProcessor::bind_audio_buffer: null buffer for series {}", series_index);
57 b.audio_buffer = std::move(
buffer);
64 std::shared_ptr<Nodes::Network::NodeNetwork>
network)
67 MF_ERROR(C, X,
"PlotProcessor::bind_network: null network for series {}", series_index);
75 "PlotProcessor::bind_network: network for series {} has no audio output mode", series_index);
83 b.audio_buffer.reset();
88 std::function<
void(std::vector<double>&)> fn)
91 MF_ERROR(C, X,
"PlotProcessor::bind_callable: null callable for series {}", series_index);
96 b.callable = std::move(fn);
98 b.audio_buffer.reset();
107 b.pending_raw = std::move(data);
108 b.raw_dirty.test_and_set(std::memory_order_release);
118 it->second.role = role;
119 it->second.modality = modality;
128 it->second.node->remove_buffer_reference();
143 if (!std::dynamic_pointer_cast<PlotContainer>(container))
144 MF_ERROR(C, X,
"PlotProcessor requires a PlotContainer");
151 b.node->remove_buffer_reference();
158 auto plot = std::dynamic_pointer_cast<PlotContainer>(container);
160 MF_ERROR(C, X,
"PlotProcessor::process: container is not a PlotContainer");
167 if (idx >= plot->series_count())
170 thread_local std::vector<double> staging;
171 staging.resize(plot->series_size(idx));
174 auto frame = plot->get_frame(idx).as<
double>();
175 if (frame.size() == staging.size()) {
176 std::ranges::copy(frame, staging.begin());
178 std::ranges::fill(staging, 0.0);
182 switch (
b.source_type) {
200 plot->write_series(idx, staging);
203 auto&
src = plot->get_data();
204 auto&
dst = plot->get_processed_data();
206 for (
size_t i = 0; i <
src.size(); ++i)
222 const size_t n = std::min(series.size(), samples.size());
223 std::copy_n(samples.begin(), n, series.begin());
224 if (n < series.size())
225 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
233 const auto& data =
b.audio_buffer->get_data();
234 const size_t n = std::min(series.size(), data.size());
235 std::copy_n(data.begin(), n, series.begin());
236 if (n < series.size())
237 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
245 auto buf =
b.network->get_audio_buffer();
249 const size_t n = std::min(series.size(), buf->size());
250 std::copy_n(buf->begin(), n, series.begin());
251 if (n < series.size())
252 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
263 if (!
b.raw_dirty.test(std::memory_order_acquire))
265 b.raw_dirty.clear(std::memory_order_release);
266 const size_t n = std::min(series.size(),
b.pending_raw.size());
267 std::copy_n(
b.pending_raw.begin(), n, series.begin());
268 if (n < series.size())
269 std::fill(series.begin() +
static_cast<ptrdiff_t
>(n), series.end(), 0.0);
#define MF_ERROR(comp, ctx,...)
Core::GlobalNetworkConfig network
std::shared_ptr< NetworkGeometryBuffer > buffer
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.