From 9b7a2af07fd1f5df3e517021d676805eb20bc74f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 9 Aug 2007 05:16:00 +0000 Subject: Realtime safe parallel graph execution, e.g. run with ingen -e -p 3 for 3 concurrent audio threads. git-svn-id: http://svn.drobilla.net/lad/ingen@689 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/engine/NodeBase.hpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) (limited to 'src/libs/engine/NodeBase.hpp') diff --git a/src/libs/engine/NodeBase.hpp b/src/libs/engine/NodeBase.hpp index 68a60068..668f615c 100644 --- a/src/libs/engine/NodeBase.hpp +++ b/src/libs/engine/NodeBase.hpp @@ -21,6 +21,8 @@ #include "types.hpp" #include #include +#include +#include #include "Node.hpp" using std::string; @@ -52,10 +54,16 @@ public: virtual void activate(); virtual void deactivate(); bool activated() { return _activated; } + + virtual void reset_input_ready(); + virtual bool process_lock(); + virtual void process_unlock(); + virtual void wait_for_input(size_t num_providers); + virtual unsigned n_inputs_ready() const { return _n_inputs_ready.get(); } - virtual void post_process(SampleCount nframes, FrameTime start, FrameTime end); - virtual void process(SampleCount nframes, FrameTime start, FrameTime end) = 0; virtual void pre_process(SampleCount nframes, FrameTime start, FrameTime end); + virtual void process(SampleCount nframes, FrameTime start, FrameTime end) = 0; + virtual void post_process(SampleCount nframes, FrameTime start, FrameTime end); virtual void set_port_buffer(uint32_t voice, uint32_t port_num, Buffer* buf) {} @@ -70,18 +78,24 @@ public: const Raul::Array& ports() const { return *_ports; } - virtual Raul::List* providers() { return _providers; } - virtual void providers(Raul::List* l) { _providers = l; } + /* These are NOT to be used in the audio thread! + * The providers and dependants in CompiledNode are for that + */ + + virtual Raul::List* providers() { return _providers; } + virtual void providers(Raul::List* l) { _providers = l; } - virtual Raul::List* dependants() { return _dependants; } - virtual void dependants(Raul::List* l) { _dependants = l; } + virtual Raul::List* dependants() { return _dependants; } + virtual void dependants(Raul::List* l) { _dependants = l; } virtual const Plugin* plugin() const { return _plugin; } /** A node's parent is always a patch, so static cast should be safe */ Patch* parent_patch() const { return (Patch*)_parent; } -protected: +protected: + virtual void signal_input_ready(); + const Plugin* _plugin; uint32_t _poly; @@ -89,10 +103,13 @@ protected: size_t _buffer_size; bool _activated; - bool _traversed; ///< Flag for process order algorithm - Raul::Array* _ports; ///< Access in audio thread only - Raul::List* _providers; ///< Nodes connected to this one's input ports - Raul::List* _dependants; ///< Nodes this one's output ports are connected to + bool _traversed; ///< Flag for process order algorithm + Raul::Semaphore _input_ready; ///< Parallelism: input ready signal + Raul::AtomicInt _process_lock; ///< Parallelism: Waiting on inputs 'lock' + Raul::AtomicInt _n_inputs_ready; ///< Parallelism: # input ready signals this cycle + Raul::Array* _ports; ///< Access in audio thread only + Raul::List* _providers; ///< Nodes connected to this one's input ports + Raul::List* _dependants; ///< Nodes this one's output ports are connected to }; -- cgit v1.2.1