12 , m_is_initialized(false)
15 error<std::invalid_argument>(
17 std::source_location::current(),
18 "ChainNode requires both source and target nodes to be non-null");
25 auto self = shared_from_this();
77 uint32_t sstate =
m_Source->m_state.load();
85 uint32_t tstate =
m_Target->m_state.load();
105 std::vector<double> output(num_samples);
106 for (
size_t i = 0; i < num_samples; i++) {
143 auto sState =
m_Source->m_state.load();
144 auto tState =
m_Target->m_state.load();
154 error<std::runtime_error>(
156 std::source_location::current(),
157 "ChainNode target node is null when retrieving last context");
159 return m_Target->get_last_context();
164 , lhs_value(lhs_value)
165 , rhs_value(rhs_value)
179 , m_func(
std::move(func))
180 , m_context(0.0, 0.0, 0.0)
181 , m_context_gpu(0.0, 0.0, 0.0, get_gpu_data_buffer())
184 error<std::invalid_argument>(
186 std::source_location::current(),
187 "BinaryOpNode requires both lhs and rhs nodes to be non-null");
194 auto self = shared_from_this();
195 uint32_t lhs_mask =
m_lhs ?
m_lhs->get_channel_mask().load() : 0;
196 uint32_t rhs_mask =
m_rhs ?
m_rhs->get_channel_mask().load() : 0;
197 uint32_t combined_mask = lhs_mask | rhs_mask;
199 if (combined_mask != 0) {
241 uint32_t lstate =
m_lhs->m_state.load();
249 uint32_t rstate =
m_rhs->m_state.load();
273 std::vector<double> output(num_samples);
274 for (
unsigned int i = 0; i < num_samples; ++i) {
290 if (condition(ctx)) {
300 m_lhs->reset_processed_state();
302 m_rhs->reset_processed_state();
324 m_lhs->restore_state();
326 m_rhs->restore_state();
354 auto lstate =
m_lhs->m_state.load();
355 auto rstate =
m_rhs->m_state.load();
358 return !is_lhs_registered && !is_rhs_registered;
BinaryOpContextGpu(double value, double lhs_value, double rhs_value, std::span< const float > gpu_data)
GPU-compatible context for binary operation callbacks.
double rhs_value
The value from the right-hand side node.
BinaryOpContext(double value, double lhs_value, double rhs_value)
Constructs a BinaryOpContext with the current operation state.
double lhs_value
The value from the left-hand side node.
Specialized context for binary operation callbacks.
bool m_is_initialized
Flag indicating whether the binary operator has been properly initialized.
void restore_state() override
Restores the node's state from the last save Recursively cascades through all connected modulator nod...
void update_context(double value) override
updates context object for callbacks
void initialize()
Initializes the binary operation node.
bool is_initialized() const
NodeContext & get_last_context() override
Retrieves the last created context object.
void notify_tick(double value) override
Notifies all registered callbacks about a new output value.
std::shared_ptr< Node > m_lhs
The left-hand side node.
double m_saved_last_rhs_value
std::function< double(double, double)> CombineFunc
Function type for combining two node outputs.
void reset_processed_state() override
Resets the processed state of the node and any attached input nodes.
CombineFunc m_func
The function used to combine the outputs of both nodes.
double process_sample(double input=0.) override
Processes a single sample through both nodes and combines the results.
void save_state() override
Saves the node's current state for later restoration Recursively cascades through all connected modul...
double m_saved_last_lhs_value
std::vector< double > process_batch(unsigned int num_samples) override
Processes multiple samples through both nodes and combines the results.
double m_last_rhs_value
The last output value from the right-hand side node.
double m_last_lhs_value
The last output value from the left-hand side node.
BinaryOpContext m_context
BinaryOpNode(const std::shared_ptr< Node > &lhs, const std::shared_ptr< Node > &rhs, CombineFunc func)
Creates a new binary operation node.
std::shared_ptr< Node > m_rhs
The right-hand side node.
BinaryOpContextGpu m_context_gpu
NodeContext & get_last_context() override
Retrieves the last created context object.
std::shared_ptr< Node > m_Source
The upstream node that processes input first.
std::shared_ptr< Node > m_Target
The downstream node that processes the source's output.
void initialize()
Initializes the chain node.
std::vector< double > process_batch(unsigned int num_samples) override
Processes multiple samples through the chain.
bool m_is_initialized
Flag indicating whether the chain has been properly initialized.
double process_sample(double input=0.) override
Processes a single sample through the chain.
void restore_state() override
Restores the node's state from the last save Recursively cascades through all connected modulator nod...
void save_state() override
Saves the node's current state for later restoration Recursively cascades through all connected modul...
void reset_processed_state() override
Resets the processed state of the node and any attached input nodes.
ChainNode(const std::shared_ptr< Node > &source, const std::shared_ptr< Node > &target)
Creates a new chain connecting source to target.
bool is_initialized() const
GPU-uploadable 1D array data interface.
std::string type_id
Type identifier for runtime type checking.
double value
Current sample value.
Base context class for node callbacks.
std::vector< NodeHook > m_callbacks
Collection of standard callback functions.
double m_last_output
The most recent sample value generated by this oscillator.
bool m_fire_events_during_snapshot
Internal flag controlling whether notify_tick fires during state snapshots Default: false (events don...
std::vector< std::pair< NodeHook, NodeCondition > > m_conditional_callbacks
Collection of conditional callback functions with their predicates.
std::atomic< Utils::NodeState > m_state
Atomic state flag tracking the node's processing status.
bool m_gpu_compatible
Flag indicating if the node supports GPU processing This flag is set by derived classes to indicate w...
GraphConfig & get_graph_config()
@ Init
Engine/subsystem initialization.
@ Runtime
General runtime operations (default fallback)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
void atomic_add_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically adds a flag to a node state.
std::vector< uint32_t > get_active_channels(const std::shared_ptr< Nodes::Node > &node, uint32_t fallback_channel)
Extracts active channel list from a node's channel mask.
void try_reset_processed_state(std::shared_ptr< Node > node)
Attempts to reset the processed state of a node.
void atomic_inc_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically increments the modulator count by a specified amount.
void atomic_dec_modulator_count(std::atomic< uint32_t > &count, int amount)
Atomically decrements the modulator count by a specified amount.
void atomic_remove_flag(std::atomic< Utils::NodeState > &state, Utils::NodeState flag)
Atomically removes a flag from a node state.
Contains the node-based computational processing system components.
@ PRESERVE_BOTH
Preserve both nodes in the chain, add new chain node to root, i.e doubling the target signal.
@ REPLACE_TARGET
Unregister the target and register with the new chain node.
@ ONLY_CHAIN
Only keep the new chain node, unregistering the source and target.
@ KEEP
Preserve both nodes in the binary op, add new binary op node to root, i.e doubling the signal.
@ REPLACE
Unregister both nodes and register with the new binary op node.
@ ACTIVE
Engine is processing this node.
@ PROCESSED
Node has been processed this cycle.
void register_audio_node(const std::shared_ptr< Nodes::Node > &node, uint32_t channel)
Adds a node to the root node of a specific channel.
void unregister_audio_node(const std::shared_ptr< Nodes::Node > &node, uint32_t channel)
Removes a node from the root node of a specific channel.
Utils::NodeBinaryOpSemantics binary_op_semantics
Utils::NodeChainSemantics chain_semantics