Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::host::SignalGraph Class Reference

#include <signal_graph_runtime.hpp>

Classes

struct  GraphLimits
struct  GeneratedGraphValidation
struct  PreparedStats
struct  PreparedNodeLatency
struct  PreparedConnectionDelay
struct  PreparedLatencySnapshot
struct  RuntimeBudgetReport
struct  PluginCatalogToken
struct  NodeLoadReport
struct  EdgeProbeIdentity
class  ExecutionSnapshot
 Strong, typed handle to one exact compiled SignalGraph generation. More...
class  PreparedTopologyEdit

Public Types

enum class  GeneratedGraphValidationRejectReason : uint8_t {
  None , InvalidBlockSize , MaxBlockSizeExceeded , NodeLimitExceeded ,
  ConnectionLimitExceeded , PortLimitExceeded , EstimatedWorkExceeded
}
enum class  SpectralTransitionState : std::uint8_t {
  Idle , Staged , Activated , Rejected ,
  Finalized
}
enum class  SwapResult { Swapped , Staged , NeedsEagerPrepare , NotInSwapEdit }
enum class  EdgeProbeStatus : std::uint8_t {
  Attached , Detached , Unprepared , UnknownPort ,
  MissingEdge , UnsupportedKind , UnsupportedExecution , Busy
}
using PluginLoaderForTest = std::function<std::unique_ptr<PluginSlot>(const PluginInfo&)>
using RoutedExecutionStatus = SignalGraphExecutionStatus
 Control-thread view of the actual routed paths embedded in the live compiled snapshot.

Public Member Functions

 SignalGraph ()=default
SpectralResult< SpectralAnalysisPorts > add_spectral_analysis (SpectralIdentity identity, const std::string &name)
SpectralResult< SpectralStagePorts > add_spectral_stage (SpectralIdentity identity, QualifiedSpectralStage stage, const std::string &name)
SpectralResult< SpectralSynthesisPorts > add_spectral_synthesis (SpectralIdentity identity, const std::string &name)
GraphResult connect (SpectralOutputPort source, SpectralInputPort dest)
SpectralTransitionState spectral_transition_state () const noexcept
SpectralError finalize_spectral_transition ()
SpectralError stop_spectral_controller ()
 Control thread only, after the host has stopped calling process().
SpectralError spectral_error () const noexcept
NodeId add_input_node (int channels, const std::string &name="Input")
NodeId add_output_node (int channels, const std::string &name="Output")
NodeId add_plugin_node (const PluginInfo &info)
NodeId add_unresolved_plugin_node (const PluginInfo &info, int num_inputs, int num_outputs, const std::string &name)
NodeId add_plugin_node (std::unique_ptr< PluginSlot > slot, int num_inputs, int num_outputs, const std::string &name="Plugin")
NodeId add_processor_node (std::shared_ptr< format::ProcessorNodeInstance > processor, const std::string &name={})
 Add an owned in-process Processor.
NodeId add_processor_node (std::unique_ptr< format::Processor > processor, const std::string &name={})
bool is_processor_node (NodeId id) const
std::shared_ptr< format::ProcessorNodeInstance > processor_node_instance (NodeId id) const
 Returns the retained Processor instance for a runtime-owned node.
bool set_processor_audio_input_provider (NodeId id, format::AudioInputBusProvider provider) noexcept
 Install a host-owned realtime input-bus provider on an in-process Processor node.
NodeId add_gain_node (const std::string &name="Gain")
NodeId add_trigger_producer (const TriggerProducerConfig &config)
NodeId add_trigger_envelope (const TriggerEnvelopeConfig &config={})
NodeId add_trigger_modulation ()
NodeId add_trigger_lowpass (float coefficient=0.5f)
TriggerGraphResult connect_trigger (TriggerEdge edge)
std::vector< TriggerEdge > trigger_edges () const
TriggerPreparation prepare_trigger_plan (double sample_rate, int max_frames)
TriggerGraphResult try_install_prepared_trigger_plan (std::unique_ptr< PreparedTriggerPlan > &candidate)
TriggerGraphResult try_reset_events () noexcept
TriggerGraphResult process_checked (audio::BufferView< float > &output, const audio::BufferView< const float > &input, int frames)
TriggerGraphResult trigger_counters (TriggerCounters &counters) const noexcept
TriggerResourceReport trigger_resources () const
std::span< const TriggerRecord > trigger_trace () const noexcept
NodeId add_midi_input_node (const std::string &name="MIDI In")
NodeId add_midi_output_node (const std::string &name="MIDI Out")
bool register_custom_node_type (CustomNodeType type)
bool register_custom_node_type (CustomNodeType type, SampleKernelDescriptor sample_kernel)
bool register_custom_node_diagnostics (CustomNodeDiagnosticsDescriptor descriptor)
CustomNodeDiagnosticResult custom_node_diagnostic_handle (NodeId id) const
CustomNodeDiagnosticResult query_custom_node_diagnostics (CustomNodeDiagnosticHandle handle, std::uint64_t schema, std::span< std::byte > output, CustomNodeDiagnosticConsistency consistency=CustomNodeDiagnosticConsistency::LiveApproximate) const
template<typename Report>
requires (!std::is_same_v<std::remove_cvref_t<Report>, std::span<std::byte>>)
CustomNodeDiagnosticResult query_custom_node_diagnostics (CustomNodeDiagnosticHandle handle, std::uint64_t schema, Report &output, CustomNodeDiagnosticConsistency consistency=CustomNodeDiagnosticConsistency::LiveApproximate) const
std::vector< CustomNodeTypeMetadata > custom_node_types () const
const CustomNodeType * custom_node_type (std::string_view type_id) const
const CustomNodeType * custom_node_type (std::string_view type_id, int version) const
const SampleKernelDescriptor * sample_kernel_type (std::string_view type_id, int version) const
SampleRegionProof prove_sample_region (SampleRegionId id) const
std::optional< SampleRegionDescriptor > sample_region (SampleRegionId id) const
std::vector< SampleRegionDescriptor > sample_regions () const
const SampleRegionParameterBinding * sample_region_parameter_binding () const noexcept
NodeId add_custom_node (std::string_view type_id, const std::string &name={})
NodeId add_custom_node (std::string_view type_id, int version, const std::string &name={})
NodeId add_unresolved_custom_node (std::string_view type_id, int version, int num_inputs, int num_outputs, const std::string &name)
std::vector< uint8_t > custom_node_state (NodeId id) const
bool set_custom_node_state (NodeId id, const std::vector< uint8_t > &bytes)
bool remove_node (NodeId id)
bool connect (NodeId source, PortIndex source_port, NodeId dest, PortIndex dest_port)
GraphResult connect (const PortHandle &source, const PortHandle &dest)
 Connect named typed ports.
bool connect_feedback (NodeId source, PortIndex source_port, NodeId dest, PortIndex dest_port)
bool connect_midi (NodeId source, NodeId dest)
bool connect_sidechain (NodeId source, PortIndex source_port, NodeId dest, PortIndex dest_sidechain_port)
bool connect_automation (NodeId src, PortIndex src_audio_port, NodeId dest, uint32_t dest_param_id, float range_lo, float range_hi, float smoothing_ms=0.0f, AutomationMix mix=AutomationMix::Replace)
bool connect_audio_rate_modulation (NodeId src, PortIndex src_audio_port, NodeId dest, uint32_t dest_param_id, float range_lo, float range_hi, float smoothing_ms=0.0f, AutomationMix mix=AutomationMix::Replace)
bool disconnect_modulation (NodeId src, PortIndex src_audio_port, NodeId dest, uint32_t dest_param_id, bool audio_rate)
 Remove one automation or audio-rate modulation edge by its typed target.
bool audio_rate_modulation_lane (const Connection &connection, state::ModulationLane &lane) const
bool inject_midi (NodeId midi_input_node, const midi::MidiBuffer &events) noexcept
bool inject_midi (NodeId midi_input_node, const midi::MidiBuffer &events, const midi::MpeBuffer &mpe) noexcept
bool inject_parameter_events (NodeId plugin_node, const state::ParameterEventQueue &events)
bool extract_midi (NodeId midi_output_node, midi::MidiBuffer &out) const
bool disconnect (NodeId source, PortIndex source_port, NodeId dest, PortIndex dest_port)
const GraphNode * node (NodeId id) const
const std::vector< GraphNode > & nodes () const
const std::vector< Connection > & connections () const
GraphAuthoringReceipt authoring_receipt () const
GraphAuthoringReceiptStatus validate_authoring_receipt (GraphAuthoringReceipt receipt) const
bool would_create_cycle (NodeId source, NodeId dest) const
std::vector< NodeId > processing_order () const
bool prepare (double sample_rate, int max_block_size)
NodeId last_prepare_custom_failure_node () const
std::unique_ptr< PreparedTopologyEdit > begin_prepared_topology_edit ()
void begin_swap_edit ()
SwapResult prepare_swap (double sample_rate, int max_block_size)
void abort_swap_edit ()
void release ()
bool set_node_live_swap_policy (NodeId id, NodeLiveSwapPolicy policy)
bool set_node_hosted_editor_open (NodeId id, bool open)
PluginCatalogToken register_scanned_plugin (const PluginInfo &info)
void clear_scanned_plugin_catalog ()
SwapResult stage_plugin_replacement (NodeId id, PluginCatalogToken token)
LiveSwapDiagnostics last_swap_diagnostics () const
void set_live_swap_plugin_loader_for_test (PluginLoaderForTest loader)
bool seed_midi_input_sequence_for_test (NodeId midi_input_node, std::uint64_t predecessor) noexcept
std::uint64_t midi_input_sequence_for_test (NodeId midi_input_node) const noexcept
void set_limits (GraphLimits limits)
GraphLimits limits () const
std::size_t estimate_generated_graph_work_units (int max_block_size) const
GeneratedGraphValidation validate_generated_graph (int max_block_size) const
PreparedStats prepared_stats () const
std::uint64_t sample_region_binding_generation () const noexcept
std::vector< SampleRegionRuntimeReceipt > sample_region_runtime_receipts () const
EdgeProbeStatus attach_audio_edge_probe (const PortHandle &source, const PortHandle &destination)
void detach_audio_edge_probe ()
bool read_audio_edge_probe (graph::GraphRuntimeProbeSample &sample)
std::uint64_t audio_edge_probe_dropped () const
EdgeProbeStatus audio_edge_probe_status () const
EdgeProbeIdentity audio_edge_probe_identity () const
std::vector< NodeLoadReport > node_loads () const
void set_node_load_monitoring (bool enabled) noexcept
bool node_load_monitoring () const noexcept
audio::AudioProcessLoadSnapshot graph_load () const
void set_live_dsp_telemetry_enabled (bool enabled)
bool live_dsp_telemetry_enabled () const
audio::LiveDspTelemetrySnapshot poll_live_dsp_telemetry ()
void compile_snapshot_for_test (double sample_rate, int max_block_size)
bool is_prepared () const noexcept
int prepared_max_block_size () const noexcept
std::atomic< float > * live_gain_atomic (NodeId id) const noexcept
PluginSlot * live_plugin_slot (NodeId id) const noexcept
const CustomNodeProcessFn * live_custom_processor (NodeId id) const noexcept
const CustomNodeTransportProcessFn * live_custom_transport_processor (NodeId id) const noexcept
const CustomNodeEventProcessFn * live_custom_event_processor (NodeId id) const noexcept
int live_custom_latency_samples (NodeId id) const noexcept
const CustomNodeParamProcessFn * live_custom_param_processor (NodeId id) const noexcept
std::shared_ptr< const void > live_snapshot_handle () const noexcept
RoutedExecutionStatus routed_execution_status (int block_size) const noexcept
std::uint64_t routed_only_execution_failures () const noexcept
 Number of blocks made silent because routed processing failed, including a hosted node rejection, or because a routed-only lease had no usable compiled path.
void acquire_routed_only_execution () noexcept
 Require compiled routed execution while at least one owner holds a lease.
void release_routed_only_execution () noexcept
void set_canonical_executor_routing_enabled (bool enabled) noexcept
bool canonical_executor_routing_enabled () const noexcept
void set_parallel_routing_enabled (bool enabled) noexcept
bool parallel_routing_enabled () const noexcept
void set_audio_workgroup (void *workgroup) noexcept override
 Publish the device-owned workgroup for subsequent renders, or null when the standalone device has no workgroup / removes its current one.
void set_audio_workgroup_from_render_context (void *workgroup) noexcept override
 Publish an AU render-context workgroup.
bool prepare_audio_workgroup_for_render () noexcept override
 RT-safe render-cycle preparation.
void wait_for_audio_workgroup_update () noexcept override
 Off-RT barrier for borrowed-handle teardown.
void * configured_audio_workgroup () const noexcept
void set_parallel_min_work_units (std::uint64_t channel_samples) noexcept
std::uint64_t parallel_min_work_units () const noexcept
format::GraphRuntimeExecutorStats routing_executor_stats () const noexcept
std::uint64_t routed_walk_fallbacks () const noexcept
void set_anticipation_enabled (bool enabled) noexcept
bool anticipation_enabled () const noexcept
int pump_anticipation (int max_blocks=8)
RuntimeBudgetReport evaluate_optional_runtime_budget (runtime::RuntimeBudgetFrame &frame, runtime::RuntimeWorkLane lane=runtime::RuntimeWorkLane::Background, bool required=false) const noexcept
void process (audio::BufferView< float > &output, const audio::BufferView< const float > &input, int num_samples)
void process (audio::BufferView< float > &output, const audio::BufferView< const float > &input, int num_samples, const format::ProcessContext &transport)
std::uint64_t transport_suppressed_for_anticipation () const noexcept
void clear ()
bool set_node_gain (NodeId id, float linear_gain)
float node_gain (NodeId id) const
int latency_samples () const
int node_latency_samples (NodeId id) const
std::optional< PreparedLatencySnapshot > prepared_latency_snapshot () const
bool set_node_parameter (NodeId id, uint32_t param_id, float value)
float get_node_parameter (NodeId id, uint32_t param_id) const
std::size_t custom_node_type_count () const

Friends

class GraphSerializer
class ExecutionSnapshot
class PreparedTriggerPlan
struct detail::TriggerTestAccess
struct SpectralControllerTestAccess
bool build_signal_graph_executor_routing (const SignalGraph &graph, SignalGraphExecutorRouting &out)
std::optional< std::vector< HostParamInfo > > detail::processor_node_parameters (const SignalGraph &, NodeId)
bool register_builtin_sample_region_types (SignalGraph &graph)

Member Typedef Documentation

◆ PluginLoaderForTest

using pulp::host::SignalGraph::PluginLoaderForTest = std::function<std::unique_ptr<PluginSlot>(const PluginInfo&)>

◆ RoutedExecutionStatus

Control-thread view of the actual routed paths embedded in the live compiled snapshot.

Unlike topology eligibility, this reports whether snapshot construction and its fixed scratch pools both succeeded for the requested block size.

Member Enumeration Documentation

◆ EdgeProbeStatus

enum class pulp::host::SignalGraph::EdgeProbeStatus : std::uint8_t
strong
Enumerator
Attached 
Detached 
Unprepared 
UnknownPort 
MissingEdge 
UnsupportedKind 
UnsupportedExecution 
Busy 

◆ GeneratedGraphValidationRejectReason

Enumerator
None 
InvalidBlockSize 
MaxBlockSizeExceeded 
NodeLimitExceeded 
ConnectionLimitExceeded 
PortLimitExceeded 
EstimatedWorkExceeded 

◆ SpectralTransitionState

enum class pulp::host::SignalGraph::SpectralTransitionState : std::uint8_t
strong
Enumerator
Idle 
Staged 
Activated 
Rejected 
Finalized 

◆ SwapResult

Enumerator
Swapped 
Staged 
NeedsEagerPrepare 
NotInSwapEdit 

Constructor & Destructor Documentation

◆ SignalGraph()

pulp::host::SignalGraph::SignalGraph ( )
default

Member Function Documentation

◆ abort_swap_edit()

void pulp::host::SignalGraph::abort_swap_edit ( )

◆ acquire_routed_only_execution()

void pulp::host::SignalGraph::acquire_routed_only_execution ( )
inlinenoexcept

Require compiled routed execution while at least one owner holds a lease.

If no prepared routed path can process a block, process() clears output instead of entering the legacy reference walk. Control-thread only.

◆ add_custom_node() [1/2]

NodeId pulp::host::SignalGraph::add_custom_node ( std::string_view type_id,
const std::string & name = {} )

◆ add_custom_node() [2/2]

NodeId pulp::host::SignalGraph::add_custom_node ( std::string_view type_id,
int version,
const std::string & name = {} )

◆ add_gain_node()

NodeId pulp::host::SignalGraph::add_gain_node ( const std::string & name = "Gain")

◆ add_input_node()

NodeId pulp::host::SignalGraph::add_input_node ( int channels,
const std::string & name = "Input" )

◆ add_midi_input_node()

NodeId pulp::host::SignalGraph::add_midi_input_node ( const std::string & name = "MIDI In")

◆ add_midi_output_node()

NodeId pulp::host::SignalGraph::add_midi_output_node ( const std::string & name = "MIDI Out")

◆ add_output_node()

NodeId pulp::host::SignalGraph::add_output_node ( int channels,
const std::string & name = "Output" )

◆ add_plugin_node() [1/2]

NodeId pulp::host::SignalGraph::add_plugin_node ( const PluginInfo & info)

◆ add_plugin_node() [2/2]

NodeId pulp::host::SignalGraph::add_plugin_node ( std::unique_ptr< PluginSlot > slot,
int num_inputs,
int num_outputs,
const std::string & name = "Plugin" )

◆ add_processor_node() [1/2]

NodeId pulp::host::SignalGraph::add_processor_node ( std::shared_ptr< format::ProcessorNodeInstance > processor,
const std::string & name = {} )

Add an owned in-process Processor.

The main-bus channel counts and default name come from its frozen descriptor. Processor nodes are runtime-only: graph serialization and baking refuse them explicitly.

◆ add_processor_node() [2/2]

NodeId pulp::host::SignalGraph::add_processor_node ( std::unique_ptr< format::Processor > processor,
const std::string & name = {} )

◆ add_spectral_analysis()

SpectralResult< SpectralAnalysisPorts > pulp::host::SignalGraph::add_spectral_analysis ( SpectralIdentity identity,
const std::string & name )

◆ add_spectral_stage()

SpectralResult< SpectralStagePorts > pulp::host::SignalGraph::add_spectral_stage ( SpectralIdentity identity,
QualifiedSpectralStage stage,
const std::string & name )

◆ add_spectral_synthesis()

SpectralResult< SpectralSynthesisPorts > pulp::host::SignalGraph::add_spectral_synthesis ( SpectralIdentity identity,
const std::string & name )

◆ add_trigger_envelope()

NodeId pulp::host::SignalGraph::add_trigger_envelope ( const TriggerEnvelopeConfig & config = {})

◆ add_trigger_lowpass()

NodeId pulp::host::SignalGraph::add_trigger_lowpass ( float coefficient = 0.5f)

◆ add_trigger_modulation()

NodeId pulp::host::SignalGraph::add_trigger_modulation ( )

◆ add_trigger_producer()

NodeId pulp::host::SignalGraph::add_trigger_producer ( const TriggerProducerConfig & config)

◆ add_unresolved_custom_node()

NodeId pulp::host::SignalGraph::add_unresolved_custom_node ( std::string_view type_id,
int version,
int num_inputs,
int num_outputs,
const std::string & name )

◆ add_unresolved_plugin_node()

NodeId pulp::host::SignalGraph::add_unresolved_plugin_node ( const PluginInfo & info,
int num_inputs,
int num_outputs,
const std::string & name )

◆ anticipation_enabled()

bool pulp::host::SignalGraph::anticipation_enabled ( ) const
inlinenoexcept

◆ attach_audio_edge_probe()

EdgeProbeStatus pulp::host::SignalGraph::attach_audio_edge_probe ( const PortHandle & source,
const PortHandle & destination )

◆ audio_edge_probe_dropped()

std::uint64_t pulp::host::SignalGraph::audio_edge_probe_dropped ( ) const

◆ audio_edge_probe_identity()

EdgeProbeIdentity pulp::host::SignalGraph::audio_edge_probe_identity ( ) const

◆ audio_edge_probe_status()

EdgeProbeStatus pulp::host::SignalGraph::audio_edge_probe_status ( ) const

◆ audio_rate_modulation_lane()

bool pulp::host::SignalGraph::audio_rate_modulation_lane ( const Connection & connection,
state::ModulationLane & lane ) const

◆ authoring_receipt()

GraphAuthoringReceipt pulp::host::SignalGraph::authoring_receipt ( ) const

◆ begin_prepared_topology_edit()

std::unique_ptr< PreparedTopologyEdit > pulp::host::SignalGraph::begin_prepared_topology_edit ( )

◆ begin_swap_edit()

void pulp::host::SignalGraph::begin_swap_edit ( )

◆ canonical_executor_routing_enabled()

bool pulp::host::SignalGraph::canonical_executor_routing_enabled ( ) const
inlinenoexcept

◆ clear()

void pulp::host::SignalGraph::clear ( )

◆ clear_scanned_plugin_catalog()

void pulp::host::SignalGraph::clear_scanned_plugin_catalog ( )

◆ compile_snapshot_for_test()

void pulp::host::SignalGraph::compile_snapshot_for_test ( double sample_rate,
int max_block_size )

◆ configured_audio_workgroup()

void * pulp::host::SignalGraph::configured_audio_workgroup ( ) const
inlinenoexcept

◆ connect() [1/3]

GraphResult pulp::host::SignalGraph::connect ( const PortHandle & source,
const PortHandle & dest )

Connect named typed ports.

The returned diagnostic is stable and suitable for CLI/MCP surfaces; the legacy index overload remains unchanged.

◆ connect() [2/3]

bool pulp::host::SignalGraph::connect ( NodeId source,
PortIndex source_port,
NodeId dest,
PortIndex dest_port )

◆ connect() [3/3]

GraphResult pulp::host::SignalGraph::connect ( SpectralOutputPort source,
SpectralInputPort dest )
inline

◆ connect_audio_rate_modulation()

bool pulp::host::SignalGraph::connect_audio_rate_modulation ( NodeId src,
PortIndex src_audio_port,
NodeId dest,
uint32_t dest_param_id,
float range_lo,
float range_hi,
float smoothing_ms = 0.0f,
AutomationMix mix = AutomationMix::Replace )

◆ connect_automation()

bool pulp::host::SignalGraph::connect_automation ( NodeId src,
PortIndex src_audio_port,
NodeId dest,
uint32_t dest_param_id,
float range_lo,
float range_hi,
float smoothing_ms = 0.0f,
AutomationMix mix = AutomationMix::Replace )

◆ connect_feedback()

bool pulp::host::SignalGraph::connect_feedback ( NodeId source,
PortIndex source_port,
NodeId dest,
PortIndex dest_port )

◆ connect_midi()

bool pulp::host::SignalGraph::connect_midi ( NodeId source,
NodeId dest )

◆ connect_sidechain()

bool pulp::host::SignalGraph::connect_sidechain ( NodeId source,
PortIndex source_port,
NodeId dest,
PortIndex dest_sidechain_port )

◆ connect_trigger()

TriggerGraphResult pulp::host::SignalGraph::connect_trigger ( TriggerEdge edge)

◆ connections()

const std::vector< Connection > & pulp::host::SignalGraph::connections ( ) const
inline

◆ custom_node_diagnostic_handle()

CustomNodeDiagnosticResult pulp::host::SignalGraph::custom_node_diagnostic_handle ( NodeId id) const

◆ custom_node_state()

std::vector< uint8_t > pulp::host::SignalGraph::custom_node_state ( NodeId id) const

◆ custom_node_type() [1/2]

const CustomNodeType * pulp::host::SignalGraph::custom_node_type ( std::string_view type_id) const

◆ custom_node_type() [2/2]

const CustomNodeType * pulp::host::SignalGraph::custom_node_type ( std::string_view type_id,
int version ) const

◆ custom_node_type_count()

std::size_t pulp::host::SignalGraph::custom_node_type_count ( ) const

◆ custom_node_types()

std::vector< CustomNodeTypeMetadata > pulp::host::SignalGraph::custom_node_types ( ) const

◆ detach_audio_edge_probe()

void pulp::host::SignalGraph::detach_audio_edge_probe ( )

◆ disconnect()

bool pulp::host::SignalGraph::disconnect ( NodeId source,
PortIndex source_port,
NodeId dest,
PortIndex dest_port )

◆ disconnect_modulation()

bool pulp::host::SignalGraph::disconnect_modulation ( NodeId src,
PortIndex src_audio_port,
NodeId dest,
uint32_t dest_param_id,
bool audio_rate )

Remove one automation or audio-rate modulation edge by its typed target.

The route kind is part of the identity so sparse and dense edges cannot be confused by a control operation.

◆ estimate_generated_graph_work_units()

std::size_t pulp::host::SignalGraph::estimate_generated_graph_work_units ( int max_block_size) const

◆ evaluate_optional_runtime_budget()

RuntimeBudgetReport pulp::host::SignalGraph::evaluate_optional_runtime_budget ( runtime::RuntimeBudgetFrame & frame,
runtime::RuntimeWorkLane lane = runtime::RuntimeWorkLane::Background,
bool required = false ) const
noexcept

◆ extract_midi()

bool pulp::host::SignalGraph::extract_midi ( NodeId midi_output_node,
midi::MidiBuffer & out ) const

◆ finalize_spectral_transition()

SpectralError pulp::host::SignalGraph::finalize_spectral_transition ( )

◆ get_node_parameter()

float pulp::host::SignalGraph::get_node_parameter ( NodeId id,
uint32_t param_id ) const

◆ graph_load()

audio::AudioProcessLoadSnapshot pulp::host::SignalGraph::graph_load ( ) const

◆ inject_midi() [1/2]

bool pulp::host::SignalGraph::inject_midi ( NodeId midi_input_node,
const midi::MidiBuffer & events )
noexcept

◆ inject_midi() [2/2]

bool pulp::host::SignalGraph::inject_midi ( NodeId midi_input_node,
const midi::MidiBuffer & events,
const midi::MpeBuffer & mpe )
noexcept

◆ inject_parameter_events()

bool pulp::host::SignalGraph::inject_parameter_events ( NodeId plugin_node,
const state::ParameterEventQueue & events )

◆ is_prepared()

bool pulp::host::SignalGraph::is_prepared ( ) const
inlinenoexcept

◆ is_processor_node()

bool pulp::host::SignalGraph::is_processor_node ( NodeId id) const

◆ last_prepare_custom_failure_node()

NodeId pulp::host::SignalGraph::last_prepare_custom_failure_node ( ) const

◆ last_swap_diagnostics()

LiveSwapDiagnostics pulp::host::SignalGraph::last_swap_diagnostics ( ) const

◆ latency_samples()

int pulp::host::SignalGraph::latency_samples ( ) const
inline

◆ limits()

GraphLimits pulp::host::SignalGraph::limits ( ) const
inline

◆ live_custom_event_processor()

const CustomNodeEventProcessFn * pulp::host::SignalGraph::live_custom_event_processor ( NodeId id) const
noexcept

◆ live_custom_latency_samples()

int pulp::host::SignalGraph::live_custom_latency_samples ( NodeId id) const
noexcept

◆ live_custom_param_processor()

const CustomNodeParamProcessFn * pulp::host::SignalGraph::live_custom_param_processor ( NodeId id) const
noexcept

◆ live_custom_processor()

const CustomNodeProcessFn * pulp::host::SignalGraph::live_custom_processor ( NodeId id) const
noexcept

◆ live_custom_transport_processor()

const CustomNodeTransportProcessFn * pulp::host::SignalGraph::live_custom_transport_processor ( NodeId id) const
noexcept

◆ live_dsp_telemetry_enabled()

bool pulp::host::SignalGraph::live_dsp_telemetry_enabled ( ) const

◆ live_gain_atomic()

std::atomic< float > * pulp::host::SignalGraph::live_gain_atomic ( NodeId id) const
noexcept

◆ live_plugin_slot()

PluginSlot * pulp::host::SignalGraph::live_plugin_slot ( NodeId id) const
noexcept

◆ live_snapshot_handle()

std::shared_ptr< const void > pulp::host::SignalGraph::live_snapshot_handle ( ) const
noexcept

◆ midi_input_sequence_for_test()

std::uint64_t pulp::host::SignalGraph::midi_input_sequence_for_test ( NodeId midi_input_node) const
noexcept

◆ node()

const GraphNode * pulp::host::SignalGraph::node ( NodeId id) const

◆ node_gain()

float pulp::host::SignalGraph::node_gain ( NodeId id) const

◆ node_latency_samples()

int pulp::host::SignalGraph::node_latency_samples ( NodeId id) const

◆ node_load_monitoring()

bool pulp::host::SignalGraph::node_load_monitoring ( ) const
noexcept

◆ node_loads()

std::vector< NodeLoadReport > pulp::host::SignalGraph::node_loads ( ) const

◆ nodes()

const std::vector< GraphNode > & pulp::host::SignalGraph::nodes ( ) const
inline

◆ parallel_min_work_units()

std::uint64_t pulp::host::SignalGraph::parallel_min_work_units ( ) const
inlinenoexcept

◆ parallel_routing_enabled()

bool pulp::host::SignalGraph::parallel_routing_enabled ( ) const
inlinenoexcept

◆ poll_live_dsp_telemetry()

audio::LiveDspTelemetrySnapshot pulp::host::SignalGraph::poll_live_dsp_telemetry ( )

◆ prepare()

bool pulp::host::SignalGraph::prepare ( double sample_rate,
int max_block_size )

◆ prepare_audio_workgroup_for_render()

bool pulp::host::SignalGraph::prepare_audio_workgroup_for_render ( )
inlineoverridevirtualnoexcept

RT-safe render-cycle preparation.

Every worker completes the transition; false means at least one new join failed and the caller must render inline for this publication.

Reimplemented from pulp::format::AudioWorkgroupClient.

◆ prepare_swap()

SwapResult pulp::host::SignalGraph::prepare_swap ( double sample_rate,
int max_block_size )

◆ prepare_trigger_plan()

TriggerPreparation pulp::host::SignalGraph::prepare_trigger_plan ( double sample_rate,
int max_frames )

◆ prepared_latency_snapshot()

std::optional< PreparedLatencySnapshot > pulp::host::SignalGraph::prepared_latency_snapshot ( ) const

◆ prepared_max_block_size()

int pulp::host::SignalGraph::prepared_max_block_size ( ) const
noexcept

◆ prepared_stats()

PreparedStats pulp::host::SignalGraph::prepared_stats ( ) const

◆ process() [1/2]

void pulp::host::SignalGraph::process ( audio::BufferView< float > & output,
const audio::BufferView< const float > & input,
int num_samples )

◆ process() [2/2]

void pulp::host::SignalGraph::process ( audio::BufferView< float > & output,
const audio::BufferView< const float > & input,
int num_samples,
const format::ProcessContext & transport )

◆ process_checked()

TriggerGraphResult pulp::host::SignalGraph::process_checked ( audio::BufferView< float > & output,
const audio::BufferView< const float > & input,
int frames )

◆ processing_order()

std::vector< NodeId > pulp::host::SignalGraph::processing_order ( ) const

◆ processor_node_instance()

std::shared_ptr< format::ProcessorNodeInstance > pulp::host::SignalGraph::processor_node_instance ( NodeId id) const

Returns the retained Processor instance for a runtime-owned node.

Control-thread only; the returned shared handle keeps the instance alive.

◆ prove_sample_region()

SampleRegionProof pulp::host::SignalGraph::prove_sample_region ( SampleRegionId id) const

◆ pump_anticipation()

int pulp::host::SignalGraph::pump_anticipation ( int max_blocks = 8)

◆ query_custom_node_diagnostics() [1/2]

template<typename Report>
requires (!std::is_same_v<std::remove_cvref_t<Report>, std::span<std::byte>>)
CustomNodeDiagnosticResult pulp::host::SignalGraph::query_custom_node_diagnostics ( CustomNodeDiagnosticHandle handle,
std::uint64_t schema,
Report & output,
CustomNodeDiagnosticConsistency consistency = CustomNodeDiagnosticConsistency::LiveApproximate ) const
inline

◆ query_custom_node_diagnostics() [2/2]

CustomNodeDiagnosticResult pulp::host::SignalGraph::query_custom_node_diagnostics ( CustomNodeDiagnosticHandle handle,
std::uint64_t schema,
std::span< std::byte > output,
CustomNodeDiagnosticConsistency consistency = CustomNodeDiagnosticConsistency::LiveApproximate ) const

◆ read_audio_edge_probe()

bool pulp::host::SignalGraph::read_audio_edge_probe ( graph::GraphRuntimeProbeSample & sample)

◆ register_custom_node_diagnostics()

bool pulp::host::SignalGraph::register_custom_node_diagnostics ( CustomNodeDiagnosticsDescriptor descriptor)

◆ register_custom_node_type() [1/2]

bool pulp::host::SignalGraph::register_custom_node_type ( CustomNodeType type)

◆ register_custom_node_type() [2/2]

bool pulp::host::SignalGraph::register_custom_node_type ( CustomNodeType type,
SampleKernelDescriptor sample_kernel )

◆ register_scanned_plugin()

PluginCatalogToken pulp::host::SignalGraph::register_scanned_plugin ( const PluginInfo & info)

◆ release()

void pulp::host::SignalGraph::release ( )

◆ release_routed_only_execution()

void pulp::host::SignalGraph::release_routed_only_execution ( )
inlinenoexcept

◆ remove_node()

bool pulp::host::SignalGraph::remove_node ( NodeId id)

◆ routed_execution_status()

RoutedExecutionStatus pulp::host::SignalGraph::routed_execution_status ( int block_size) const
noexcept

◆ routed_only_execution_failures()

std::uint64_t pulp::host::SignalGraph::routed_only_execution_failures ( ) const
inlinenoexcept

Number of blocks made silent because routed processing failed, including a hosted node rejection, or because a routed-only lease had no usable compiled path.

Setup-only routing fallback is tracked separately by routed_walk_fallbacks().

◆ routed_walk_fallbacks()

std::uint64_t pulp::host::SignalGraph::routed_walk_fallbacks ( ) const
inlinenoexcept

◆ routing_executor_stats()

format::GraphRuntimeExecutorStats pulp::host::SignalGraph::routing_executor_stats ( ) const
inlinenoexcept

◆ sample_kernel_type()

const SampleKernelDescriptor * pulp::host::SignalGraph::sample_kernel_type ( std::string_view type_id,
int version ) const

◆ sample_region()

std::optional< SampleRegionDescriptor > pulp::host::SignalGraph::sample_region ( SampleRegionId id) const

◆ sample_region_binding_generation()

std::uint64_t pulp::host::SignalGraph::sample_region_binding_generation ( ) const
noexcept

◆ sample_region_parameter_binding()

const SampleRegionParameterBinding * pulp::host::SignalGraph::sample_region_parameter_binding ( ) const
inlinenoexcept

◆ sample_region_runtime_receipts()

std::vector< SampleRegionRuntimeReceipt > pulp::host::SignalGraph::sample_region_runtime_receipts ( ) const

◆ sample_regions()

std::vector< SampleRegionDescriptor > pulp::host::SignalGraph::sample_regions ( ) const

◆ seed_midi_input_sequence_for_test()

bool pulp::host::SignalGraph::seed_midi_input_sequence_for_test ( NodeId midi_input_node,
std::uint64_t predecessor )
noexcept

◆ set_anticipation_enabled()

void pulp::host::SignalGraph::set_anticipation_enabled ( bool enabled)
inlinenoexcept

◆ set_audio_workgroup()

void pulp::host::SignalGraph::set_audio_workgroup ( void * workgroup)
inlineoverridevirtualnoexcept

Publish the device-owned workgroup for subsequent renders, or null when the standalone device has no workgroup / removes its current one.

A null device publication preserves the worker pool's best-effort priority fallback. The publisher for one client must be serialized (CoreAudio serializes device changes). This may run on the realtime thread and must not allocate, lock, block, retain/release Objective-C/os objects, or call host APIs.

AU lifetime follows Apple's render-context protocol: the context struct is callback-scoped, while its workgroup is the host-owned current render context that auxiliary realtime threads are instructed to join and leave when the next observer publication arrives. Standalone devices hold a caller-owned query reference until the explicit teardown barrier below.

Implements pulp::format::AudioWorkgroupClient.

◆ set_audio_workgroup_from_render_context()

void pulp::host::SignalGraph::set_audio_workgroup_from_render_context ( void * workgroup)
inlineoverridevirtualnoexcept

Publish an AU render-context workgroup.

Null is an explicit context removal and must not select the standalone no-workgroup fallback. Apple does not document os_retain/os_release as RT-safe and supplies no completion callback by which a host can know a late asynchronous join no longer references the previous context. Pulp therefore adopts it in a synchronous observer barrier: every worker, including cold sleepers, completes leave of the old context and acknowledges its new join result before the observer returns.

Reimplemented from pulp::format::AudioWorkgroupClient.

◆ set_canonical_executor_routing_enabled()

void pulp::host::SignalGraph::set_canonical_executor_routing_enabled ( bool enabled)
inlinenoexcept

◆ set_custom_node_state()

bool pulp::host::SignalGraph::set_custom_node_state ( NodeId id,
const std::vector< uint8_t > & bytes )

◆ set_limits()

void pulp::host::SignalGraph::set_limits ( GraphLimits limits)

◆ set_live_dsp_telemetry_enabled()

void pulp::host::SignalGraph::set_live_dsp_telemetry_enabled ( bool enabled)

◆ set_live_swap_plugin_loader_for_test()

void pulp::host::SignalGraph::set_live_swap_plugin_loader_for_test ( PluginLoaderForTest loader)

◆ set_node_gain()

bool pulp::host::SignalGraph::set_node_gain ( NodeId id,
float linear_gain )

◆ set_node_hosted_editor_open()

bool pulp::host::SignalGraph::set_node_hosted_editor_open ( NodeId id,
bool open )

◆ set_node_live_swap_policy()

bool pulp::host::SignalGraph::set_node_live_swap_policy ( NodeId id,
NodeLiveSwapPolicy policy )

◆ set_node_load_monitoring()

void pulp::host::SignalGraph::set_node_load_monitoring ( bool enabled)
noexcept

◆ set_node_parameter()

bool pulp::host::SignalGraph::set_node_parameter ( NodeId id,
uint32_t param_id,
float value )

◆ set_parallel_min_work_units()

void pulp::host::SignalGraph::set_parallel_min_work_units ( std::uint64_t channel_samples)
inlinenoexcept

◆ set_parallel_routing_enabled()

void pulp::host::SignalGraph::set_parallel_routing_enabled ( bool enabled)
inlinenoexcept

◆ set_processor_audio_input_provider()

bool pulp::host::SignalGraph::set_processor_audio_input_provider ( NodeId id,
format::AudioInputBusProvider provider )
noexcept

Install a host-owned realtime input-bus provider on an in-process Processor node.

The small POD handle is copied before prepare(); the provider itself must remain immutable and valid for every audio block until the node is removed. Returns false for unknown/non-Processor nodes or after a live snapshot has been prepared.

◆ spectral_error()

SpectralError pulp::host::SignalGraph::spectral_error ( ) const
inlinenoexcept

◆ spectral_transition_state()

SpectralTransitionState pulp::host::SignalGraph::spectral_transition_state ( ) const
noexcept

◆ stage_plugin_replacement()

SwapResult pulp::host::SignalGraph::stage_plugin_replacement ( NodeId id,
PluginCatalogToken token )

◆ stop_spectral_controller()

SpectralError pulp::host::SignalGraph::stop_spectral_controller ( )

Control thread only, after the host has stopped calling process().

◆ transport_suppressed_for_anticipation()

std::uint64_t pulp::host::SignalGraph::transport_suppressed_for_anticipation ( ) const
inlinenoexcept

◆ trigger_counters()

TriggerGraphResult pulp::host::SignalGraph::trigger_counters ( TriggerCounters & counters) const
noexcept

◆ trigger_edges()

std::vector< TriggerEdge > pulp::host::SignalGraph::trigger_edges ( ) const

◆ trigger_resources()

TriggerResourceReport pulp::host::SignalGraph::trigger_resources ( ) const

◆ trigger_trace()

std::span< const TriggerRecord > pulp::host::SignalGraph::trigger_trace ( ) const
noexcept

◆ try_install_prepared_trigger_plan()

TriggerGraphResult pulp::host::SignalGraph::try_install_prepared_trigger_plan ( std::unique_ptr< PreparedTriggerPlan > & candidate)

◆ try_reset_events()

TriggerGraphResult pulp::host::SignalGraph::try_reset_events ( )
noexcept

◆ validate_authoring_receipt()

GraphAuthoringReceiptStatus pulp::host::SignalGraph::validate_authoring_receipt ( GraphAuthoringReceipt receipt) const

◆ validate_generated_graph()

GeneratedGraphValidation pulp::host::SignalGraph::validate_generated_graph ( int max_block_size) const

◆ wait_for_audio_workgroup_update()

void pulp::host::SignalGraph::wait_for_audio_workgroup_update ( )
inlineoverridevirtualnoexcept

Off-RT barrier for borrowed-handle teardown.

Returns only after every auxiliary worker has acknowledged the most recently published value. Never call this from an audio callback or AU render-context observer.

Implements pulp::format::AudioWorkgroupClient.

◆ would_create_cycle()

bool pulp::host::SignalGraph::would_create_cycle ( NodeId source,
NodeId dest ) const

◆ build_signal_graph_executor_routing

bool build_signal_graph_executor_routing ( const SignalGraph & graph,
SignalGraphExecutorRouting & out )
friend

◆ detail::processor_node_parameters

std::optional< std::vector< HostParamInfo > > detail::processor_node_parameters ( const SignalGraph & ,
NodeId  )
friend

◆ detail::TriggerTestAccess

friend struct detail::TriggerTestAccess
friend

◆ ExecutionSnapshot

friend class ExecutionSnapshot
friend

◆ GraphSerializer

friend class GraphSerializer
friend

◆ PreparedTriggerPlan

friend class PreparedTriggerPlan
friend

◆ register_builtin_sample_region_types

bool register_builtin_sample_region_types ( SignalGraph & graph)
friend

◆ SpectralControllerTestAccess

friend struct SpectralControllerTestAccess
friend

The documentation for this class was generated from the following file: