diff options
Diffstat (limited to 'src/flowgraph/FlowGraphNode.cpp')
-rw-r--r-- | src/flowgraph/FlowGraphNode.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/flowgraph/FlowGraphNode.cpp b/src/flowgraph/FlowGraphNode.cpp index bb6ecc9f..fd267489 100644 --- a/src/flowgraph/FlowGraphNode.cpp +++ b/src/flowgraph/FlowGraphNode.cpp @@ -22,23 +22,21 @@ using namespace flowgraph; /***************************************************************************/ -int32_t FlowGraphNode::pullData(int64_t framePosition, int32_t numFrames) { +int32_t FlowGraphNode::pullData(int32_t numFrames, int64_t callCount) { int32_t frameCount = numFrames; // Prevent recursion and multiple execution of nodes. - if (framePosition <= mLastFramePosition && !mBlockRecursion) { - mBlockRecursion = true; // for cyclic graphs + if (callCount > mLastCallCount) { + mLastCallCount = callCount; if (mDataPulledAutomatically) { // Pull from all the upstream nodes. for (auto &port : mInputPorts) { // TODO fix bug of leaving unused data in some ports if using multiple AudioSource - frameCount = port.get().pullData(framePosition, frameCount); + frameCount = port.get().pullData(callCount, frameCount); } } if (frameCount > 0) { frameCount = onProcess(frameCount); } - mLastFramePosition += frameCount; - mBlockRecursion = false; mLastFrameCount = frameCount; } else { frameCount = mLastFrameCount; @@ -60,6 +58,7 @@ void FlowGraphNode::pullReset() { void FlowGraphNode::reset() { mLastFrameCount = 0; + mLastCallCount = kInitialCallCount; } /***************************************************************************/ @@ -74,9 +73,9 @@ FlowGraphPortFloat::FlowGraphPortFloat(FlowGraphNode &parent, } /***************************************************************************/ -int32_t FlowGraphPortFloatOutput::pullData(int64_t framePosition, int32_t numFrames) { +int32_t FlowGraphPortFloatOutput::pullData(int64_t callCount, int32_t numFrames) { numFrames = std::min(getFramesPerBuffer(), numFrames); - return mContainingNode.pullData(framePosition, numFrames); + return mContainingNode.pullData(numFrames, callCount); } void FlowGraphPortFloatOutput::pullReset() { @@ -93,10 +92,10 @@ void FlowGraphPortFloatOutput::disconnect(FlowGraphPortFloatInput *port) { } /***************************************************************************/ -int32_t FlowGraphPortFloatInput::pullData(int64_t framePosition, int32_t numFrames) { +int32_t FlowGraphPortFloatInput::pullData(int64_t callCount, int32_t numFrames) { return (mConnected == nullptr) ? std::min(getFramesPerBuffer(), numFrames) - : mConnected->pullData(framePosition, numFrames); + : mConnected->pullData(callCount, numFrames); } void FlowGraphPortFloatInput::pullReset() { if (mConnected != nullptr) mConnected->pullReset(); @@ -109,3 +108,7 @@ float *FlowGraphPortFloatInput::getBuffer() { return mConnected->getBuffer(); } } + +int32_t FlowGraphSink::pullData(int32_t numFrames) { + return FlowGraphNode::pullData(numFrames, getLastCallCount() + 1); +}
\ No newline at end of file |