diff options
author | David Robillard <d@drobilla.net> | 2007-08-09 05:16:00 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-08-09 05:16:00 +0000 |
commit | 9b7a2af07fd1f5df3e517021d676805eb20bc74f (patch) | |
tree | 3a75d0096fea9f013f7da24cd9c41dcea89fb4de /src/libs/engine/NodeBase.cpp | |
parent | fccb1edce5dda41bdfef12340a5d5b95b86a1389 (diff) | |
download | ingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.tar.gz ingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.tar.bz2 ingen-9b7a2af07fd1f5df3e517021d676805eb20bc74f.zip |
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
Diffstat (limited to 'src/libs/engine/NodeBase.cpp')
-rw-r--r-- | src/libs/engine/NodeBase.cpp | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/src/libs/engine/NodeBase.cpp b/src/libs/engine/NodeBase.cpp index b7066a0c..b61783b3 100644 --- a/src/libs/engine/NodeBase.cpp +++ b/src/libs/engine/NodeBase.cpp @@ -41,6 +41,9 @@ NodeBase::NodeBase(const Plugin* plugin, const string& name, uint32_t poly, Patc _buffer_size(buffer_size), _activated(false), _traversed(false), + _input_ready(1), + _process_lock(0), + _n_inputs_ready(0), _ports(NULL), _providers(new Raul::List<Node*>()), _dependants(new Raul::List<Node*>()) @@ -88,6 +91,55 @@ NodeBase::set_buffer_size(size_t size) for (size_t i=0; i < _ports->size(); ++i) _ports->at(i)->set_buffer_size(size); } + + +void +NodeBase::reset_input_ready() +{ + //cout << path() << " RESET" << endl; + _n_inputs_ready = 0; + _process_lock = 0; + _input_ready.reset(0); +} + + +bool +NodeBase::process_lock() +{ + return _process_lock.compare_and_exchange(0, 1); +} + + +void +NodeBase::process_unlock() +{ + _process_lock = 0; +} + + +void +NodeBase::wait_for_input(size_t num_providers) +{ + assert(_process_lock.get() == 1); + + while ((unsigned)_n_inputs_ready.get() < num_providers) { + //cout << path() << " WAITING " << _n_inputs_ready.get() << endl; + _input_ready.wait(); + //cout << path() << " CAUGHT SIGNAL" << endl; + //++_n_inputs_ready; + } + + //cout << path() << " READY" << endl; +} + + +void +NodeBase::signal_input_ready() +{ + //cout << path() << " SIGNAL" << endl; + ++_n_inputs_ready; + _input_ready.post(); +} /** Prepare to run a cycle (in the audio thread) @@ -108,7 +160,8 @@ void NodeBase::post_process(SampleCount nframes, FrameTime start, FrameTime end) { assert(_activated); - // Prepare any output ports for reading (MIDI) + + /* Write output ports */ for (size_t i=0; i < _ports->size(); ++i) _ports->at(i)->post_process(nframes, start, end); } |