TracktionEngine
Namespaces | Classes | Enumerations | Functions
tracktion::graph Namespace Reference

Namespaces

 detail
 
 node_player_utils
 
 test_utilities
 

Classes

struct  ChannelConnection
 
class  ConnectedNode
 An Node which sums together the multiple inputs adding additional latency to provide a coherent output. More...
 
class  LatencyNode
 
class  SummingNode
 An Node which sums together the multiple inputs adding additional latency to provide a coherent output. More...
 
class  SimpleNodePlayer
 Simple player for a Node. More...
 
class  LockFreeMultiThreadedNodePlayer
 Plays back a node with mutiple threads. More...
 
class  MultiThreadedNodePlayer
 Plays back a node with mutiple threads. More...
 
struct  NodeBuffer
 Holds a view over some data and optionally some storage for that data. More...
 
struct  NodeAndID
 A Node and its ID cached for quick lookup (without having to traverse the graph). More...
 
struct  NodeGraph
 Holds a graph in an order ready for processing and a sorted map for quick lookups. More...
 
struct  PlaybackInitialisationInfo
 Passed into Nodes when they are being initialised, to give them useful contextual information that they may need. More...
 
struct  NodeProperties
 Holds some really basic properties of a node. More...
 
struct  NodeOptimisations
 Holds some hints that might be used by the Node or players to improve efficiency. More...
 
class  TransformCache
 
class  Node
 Main graph Node processor class. More...
 
class  NodePlayer
 Simple player for an Node. More...
 
struct  SplitTimelineRange
 Represents a pair of timeline ranges which could be wraped around the loop end. More...
 
class  PlayHead
 Converts a monotonically increasing reference range in to a timeline range. More...
 
class  PlayHeadState
 Determines how this block releates to other previous render blocks and if the play head has jumped in time. More...
 
class  MidiNode
 Plays back a MIDI sequence. More...
 
class  SinNode
 
class  SilentNode
 Just a simple audio node that doesn't take any input so can be used as a stub. More...
 
class  BasicSummingNode
 
class  FunctionNode
 
class  GainNode
 
class  SendNode
 
class  ReturnNode
 
class  ChannelRemappingNode
 Maps channels from one to another. More...
 
class  SinkNode
 Blocks audio and MIDI input from reaching the outputs. More...
 
class  ForwardingNode
 Takes a non-owning input node and simply forwards its outputs on. More...
 
class  AudioBufferPool
 A lock-free pool of audio buffers. More...
 
class  AudioBufferStack
 A stack of audio buffers. More...
 
class  AudioFifo
 
struct  LatencyProcessor
 
class  LockFreeObject
 Manages access to an object in a way that means it is lock-free to access from a real-time thread. More...
 
struct  ScopedSignpost
 A macOS specific class to start/stop a signpost for use in Instruments. More...
 
class  PerformanceMeasurement
 A timer for measuring performance of code. More...
 
class  ScopedPerformanceMeasurement
 RAII wrapper to start and stop a performance measurement. More...
 
class  RealTimeSpinLock
 A basic spin lock that uses an atomic_flag to store the locked state so should never result in a system call. More...
 
class  Semaphore
 A basic counting semaphore. More...
 
class  LightweightSemaphore
 A counting semaphore that spins on a atomic before waiting so will avoid system calls if wait periods are very short. More...
 

Enumerations

enum class  TransformResult { none , connectionsMade , nodesDeleted }
 Enum to signify the result of the transform function. More...
 
enum class  ClearBuffers { no , yes }
 
enum class  AllocateAudioBuffer { no , yes }
 
enum class  VertexOrdering {
  preordering , postordering , reversePreordering , reversePostordering ,
  bfsPreordering , bfsReversePreordering
}
 Specifies the ordering algorithm. More...
 
enum class  ThreadPoolStrategy {
  conditionVariable , realTime , hybrid , semaphore ,
  lightweightSemaphore , lightweightSemHybrid
}
 Available strategies for thread pools. More...
 

Functions

template<typename NodeType , typename... Args>
std::unique_ptr< NodemakeNode (Args &&... args)
 Creates a node of the given type and returns it as the base Node class. More...
 
bool operator< (NodeAndID n1, NodeAndID n2)
 Compares two NodeAndIDs. More...
 
bool operator== (NodeAndID n1, NodeAndID n2)
 Compares two NodeAndIDs. More...
 
std::unique_ptr< NodeGraphcreateNodeGraph (std::unique_ptr< Node >)
 Transforms a Node and then returns a NodeGraph of it ready to be initialised. More...
 
template<typename Visitor >
void visitNodes (Node &, Visitor &&, bool preordering)
 Should call the visitor for any direct inputs to the node exactly once. More...
 
template<typename Visitor >
void visitNodesBFS (Node &node, Visitor &&visitor)
 
void addNodesRecursive (std::vector< NodeAndID > &nodeMap, Node &n)
 
std::vector< NodeAndIDcreateNodeMap (const std::vector< Node * > &nodes)
 
LockFreeMultiThreadedNodePlayer::ThreadPoolCreator getPoolCreatorFunction (ThreadPoolStrategy)
 Returns a function to create a ThreadPool for the given stategy. More...
 
template<typename IntType >
constexpr double sampleToTime (IntType samplePosition, double sampleRate)
 Converts an integer sample number to a time in seconds. More...
 
constexpr int64_t timeToSample (double timeInSeconds, double sampleRate)
 Converts a time in seconds to a sample number. More...
 
template<typename IntType >
constexpr juce::Range< double > sampleToTime (juce::Range< IntType > sampleRange, double sampleRate)
 Converts an integer sample range to a time range in seconds. More...
 
constexpr juce::Range< int64_t > timeToSample (juce::Range< double > timeInSeconds, double sampleRate)
 Converts a time range in seconds to a range of sample numbers. More...
 
template<typename RangeType >
constexpr juce::Range< int64_t > timeToSample (RangeType timeInSeconds, double sampleRate)
 Converts a time range in seconds to a range of sample numbers. More...
 
template<typename NodeType , typename Predicate >
NodeType * findNode (NodeGraph &nodeGraph, Predicate pred)
 Attempts to find a Node of a given type with a specified ID. More...
 
template<typename NodeType >
NodeType * findNodeWithID (NodeGraph &nodeGraph, size_t nodeIDToLookFor)
 Attempts to find a Node of a given type with a specified ID. More...
 
template<typename NodeType >
NodeType * findNodeWithIDIfNonZero (NodeGraph *nodeGraph, size_t nodeIDToLookFor)
 Attempts to find a Node of a given type with a specified ID. More...
 
juce::AudioBuffer< float > toAudioBuffer (choc::buffer::ChannelArrayView< float > view)
 Creates a juce::AudioBuffer from a choc::buffer::BufferView. More...
 
template<typename SampleType >
choc::buffer::BufferView< SampleType, choc::buffer::SeparateChannelLayout > toBufferView (juce::AudioBuffer< SampleType > &buffer)
 Converts a juce::AudioBuffer<SampleType> to a choc::buffer::BufferView. More...
 
juce::MidiMessage toMidiMessage (const choc::midi::Sequence::Event &e)
 Converts a choc::midi event to a juce::MidiMessage. More...
 
template<typename BufferViewType , typename SampleType , typename SmoothingType >
void multiplyBy (BufferViewType &view, juce::SmoothedValue< SampleType, SmoothingType > &value) noexcept
 Mutiplies a choc::buffer::BufferView by a juce::SmoothedValue. More...
 
choc::buffer::FrameRange frameRangeWithStartAndLength (choc::buffer::FrameCount start, choc::buffer::FrameCount length)
 Returns a FrameRange with a start and length. More...
 
choc::buffer::ChannelRange channelRangeWithStartAndLength (choc::buffer::ChannelCount start, choc::buffer::ChannelCount length)
 Returns a ChannelRange with a start and length. More...
 
template<typename SampleType , template< typename > typename LayoutType>
void sanityCheckView (const choc::buffer::BufferView< SampleType, LayoutType > &view)
 Checks that the channels have valid pointers if they have a non-zero number of frames. More...
 
bool setThreadPriority (std::thread &, int priority)
 Changes the thread's priority. More...
 

Enumeration Type Documentation

◆ TransformResult

Enum to signify the result of the transform function.

Enumerator
none 
connectionsMade 

No transform has been made.

nodesDeleted 

New connections have been made.

Nodes have been deleted.

◆ ClearBuffers

Enumerator
no 

Don't clear buffers before passing them to process, your subclass will take care of that.

yes 

Do clear buffers before passing to process so your subclass can simply add in to them.

◆ AllocateAudioBuffer

Enumerator
no 

Don't allocate an audio buffer, your subclass will ignore the dest buffer passed to process and simply use setAudioOutput to pass the buffer along.

yes 

Do allocate an audio buffer so your subclass use the dest buffer passed to process.

◆ VertexOrdering

Specifies the ordering algorithm.

Enumerator
preordering 
postordering 
reversePreordering 
reversePostordering 
bfsPreordering 
bfsReversePreordering 

◆ ThreadPoolStrategy

Available strategies for thread pools.

This will determine how worker threads are handled when no Nodes are available for processing.

Enumerator
conditionVariable 

Uses CVs to pause threads.

realTime 

Uses pause, yield and sleeps to suspend threads.

hybrid 

Uses a combination of the above, avoiding CVs on the audio thread.

semaphore 

Uses a semaphore to suspend threads.

lightweightSemaphore 

Uses a semaphore/spin mechanism to suspend threads.

lightweightSemHybrid 

Uses a combination of semaphores/spin and yields to suspend threads.

Function Documentation

◆ makeNode()

template<typename NodeType , typename... Args>
std::unique_ptr<Node> tracktion::graph::makeNode ( Args &&...  args)

Creates a node of the given type and returns it as the base Node class.

◆ operator<()

bool tracktion::graph::operator< ( NodeAndID  n1,
NodeAndID  n2 
)

Compares two NodeAndIDs.

◆ operator==()

bool tracktion::graph::operator== ( NodeAndID  n1,
NodeAndID  n2 
)

Compares two NodeAndIDs.

◆ createNodeGraph()

std::unique_ptr< NodeGraph > tracktion::graph::createNodeGraph ( std::unique_ptr< Node rootNode)

Transforms a Node and then returns a NodeGraph of it ready to be initialised.

◆ visitNodes()

template<typename Visitor >
void tracktion::graph::visitNodes ( Node node,
Visitor &&  visitor,
bool  preordering 
)

Should call the visitor for any direct inputs to the node exactly once.

If preordering is true, nodes will be visited before their inputs, if false, inputs will be visited first.

Parameters
Visitorhas the signature
void (Node&)

Referenced by tracktion::graph::ConnectedNode::addAudioConnection(), and tracktion::graph::ConnectedNode::addMidiConnection().

◆ visitNodesBFS()

template<typename Visitor >
void tracktion::graph::visitNodesBFS ( Node node,
Visitor &&  visitor 
)

◆ addNodesRecursive()

void tracktion::graph::addNodesRecursive ( std::vector< NodeAndID > &  nodeMap,
Node n 
)

◆ createNodeMap()

std::vector<NodeAndID> tracktion::graph::createNodeMap ( const std::vector< Node * > &  nodes)

◆ getPoolCreatorFunction()

LockFreeMultiThreadedNodePlayer::ThreadPoolCreator tracktion::graph::getPoolCreatorFunction ( ThreadPoolStrategy  )

Returns a function to create a ThreadPool for the given stategy.

Referenced by tracktion::engine::benchmark_utilities::renderEdit().

◆ sampleToTime() [1/2]

template<typename IntType >
constexpr double tracktion::graph::sampleToTime ( IntType  samplePosition,
double  sampleRate 
)
constexpr

◆ timeToSample() [1/3]

constexpr int64_t tracktion::graph::timeToSample ( double  timeInSeconds,
double  sampleRate 
)
constexpr

Converts a time in seconds to a sample number.

Referenced by tracktion::graph::NodePlayer::prepareToPlay().

◆ sampleToTime() [2/2]

template<typename IntType >
constexpr juce::Range<double> tracktion::graph::sampleToTime ( juce::Range< IntType >  sampleRange,
double  sampleRate 
)
constexpr

Converts an integer sample range to a time range in seconds.

◆ timeToSample() [2/3]

constexpr juce::Range<int64_t> tracktion::graph::timeToSample ( juce::Range< double >  timeInSeconds,
double  sampleRate 
)
constexpr

Converts a time range in seconds to a range of sample numbers.

◆ timeToSample() [3/3]

template<typename RangeType >
constexpr juce::Range<int64_t> tracktion::graph::timeToSample ( RangeType  timeInSeconds,
double  sampleRate 
)
constexpr

Converts a time range in seconds to a range of sample numbers.

◆ findNode()

template<typename NodeType , typename Predicate >
NodeType* tracktion::graph::findNode ( NodeGraph nodeGraph,
Predicate  pred 
)

Attempts to find a Node of a given type with a specified ID.

This uses the sortedNodes vector so should be relatively quick (much quicker than traversing from the root node.

◆ findNodeWithID()

template<typename NodeType >
NodeType* tracktion::graph::findNodeWithID ( NodeGraph nodeGraph,
size_t  nodeIDToLookFor 
)

Attempts to find a Node of a given type with a specified ID.

This uses the sortedNodes vector so should be relatively quick (much quicker than traversing from the root node.

◆ findNodeWithIDIfNonZero()

template<typename NodeType >
NodeType* tracktion::graph::findNodeWithIDIfNonZero ( NodeGraph nodeGraph,
size_t  nodeIDToLookFor 
)

Attempts to find a Node of a given type with a specified ID.

This uses the sortedNodes vector so should be relatively quick (much quicker than traversing from the root node.

◆ toAudioBuffer()

juce::AudioBuffer<float> tracktion::graph::toAudioBuffer ( choc::buffer::ChannelArrayView< float >  view)

Creates a juce::AudioBuffer from a choc::buffer::BufferView.

Referenced by tracktion::graph::test_utilities::TestProcess< NodePlayerType >::process(), and tracktion::graph::test_utilities::writeToFile().

◆ toBufferView()

template<typename SampleType >
choc::buffer::BufferView<SampleType, choc::buffer::SeparateChannelLayout> tracktion::graph::toBufferView ( juce::AudioBuffer< SampleType > &  buffer)

Converts a juce::AudioBuffer<SampleType> to a choc::buffer::BufferView.

◆ toMidiMessage()

juce::MidiMessage tracktion::graph::toMidiMessage ( const choc::midi::Sequence::Event &  e)

Converts a choc::midi event to a juce::MidiMessage.

◆ multiplyBy()

template<typename BufferViewType , typename SampleType , typename SmoothingType >
void tracktion::graph::multiplyBy ( BufferViewType &  view,
juce::SmoothedValue< SampleType, SmoothingType > &  value 
)
noexcept

Mutiplies a choc::buffer::BufferView by a juce::SmoothedValue.

◆ frameRangeWithStartAndLength()

choc::buffer::FrameRange tracktion::graph::frameRangeWithStartAndLength ( choc::buffer::FrameCount  start,
choc::buffer::FrameCount  length 
)

Returns a FrameRange with a start and length.

◆ channelRangeWithStartAndLength()

choc::buffer::ChannelRange tracktion::graph::channelRangeWithStartAndLength ( choc::buffer::ChannelCount  start,
choc::buffer::ChannelCount  length 
)

Returns a ChannelRange with a start and length.

◆ sanityCheckView()

template<typename SampleType , template< typename > typename LayoutType>
void tracktion::graph::sanityCheckView ( const choc::buffer::BufferView< SampleType, LayoutType > &  view)

Checks that the channels have valid pointers if they have a non-zero number of frames.

Referenced by tracktion::engine::InputProvider::getInputs(), and tracktion::engine::InputProvider::setInputs().

◆ setThreadPriority()

bool tracktion::graph::setThreadPriority ( std::thread &  ,
int  priority 
)

Changes the thread's priority.

May return false if for some reason the priority can't be changed.

Parameters
prioritythe new priority, in the range 0 (lowest) to 10 (highest). A priority of 5 is normal.