From b83677e319d70b54a0240979900fb42aa004b715 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Jan 2021 10:32:42 +1100 Subject: [PATCH] moved input signals to graph to prevent signal desyncs --- app/node/graph.cpp | 33 +++++++++++++++++++++++++++++++ app/node/graph.h | 13 ++++++++++++ app/node/output/track/track.cpp | 12 ++++++++--- app/node/output/track/track.h | 2 ++ app/node/traverser.cpp | 2 +- app/render/previewautocacher.cpp | 34 +++++++++++--------------------- app/render/previewautocacher.h | 6 +++--- app/render/renderprocessor.cpp | 2 +- 8 files changed, 74 insertions(+), 30 deletions(-) diff --git a/app/node/graph.cpp b/app/node/graph.cpp index d855917d2..865c0663e 100644 --- a/app/node/graph.cpp +++ b/app/node/graph.cpp @@ -44,15 +44,48 @@ void NodeGraph::childEvent(QChildEvent *event) if (event->type() == QEvent::ChildAdded) { node_children_.append(node); + + // Connect to each input + foreach (NodeInput* input, node->parameters()) { + connect(input, &NodeInput::InputConnected, this, &NodeGraph::SignalInputConnected); + connect(input, &NodeInput::InputDisconnected, this, &NodeGraph::SignalInputDisconnected); + connect(input, &NodeInput::ValueChanged, this, &NodeGraph::SignalValueChanged); + } + emit NodeAdded(node); } else if (event->type() == QEvent::ChildRemoved) { node_children_.removeOne(node); + + // Disconnect from inputs + foreach (NodeInput* input, node->parameters()) { + disconnect(input, &NodeInput::InputConnected, this, &NodeGraph::SignalInputConnected); + disconnect(input, &NodeInput::InputDisconnected, this, &NodeGraph::SignalInputDisconnected); + disconnect(input, &NodeInput::ValueChanged, this, &NodeGraph::SignalValueChanged); + } + emit NodeRemoved(node); } } } +void NodeGraph::SignalInputConnected(Node *output, int element) +{ + emit InputConnected(output, static_cast(sender()), element); +} + +void NodeGraph::SignalInputDisconnected(Node *output, int element) +{ + emit InputDisconnected(output, static_cast(sender()), element); +} + +void NodeGraph::SignalValueChanged(const TimeRange &range, int element) +{ + Q_UNUSED(range) + + emit ValueChanged(static_cast(sender()), element); +} + } diff --git a/app/node/graph.h b/app/node/graph.h index 7b51e944e..0119cb073 100644 --- a/app/node/graph.h +++ b/app/node/graph.h @@ -65,12 +65,25 @@ signals: */ void NodeRemoved(Node* node); + void InputConnected(Node* output, NodeInput* input, int element); + + void InputDisconnected(Node* output, NodeInput* input, int element); + + void ValueChanged(NodeInput* input, int element); + protected: virtual void childEvent(QChildEvent* event) override; private: QVector node_children_; +private slots: + void SignalInputConnected(Node* output, int element); + + void SignalInputDisconnected(Node* output, int element); + + void SignalValueChanged(const TimeRange& range, int element); + }; } diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 29f8f4dd6..5870b602a 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -100,9 +100,8 @@ TimeRange Track::InputTimeAdjustment(NodeInput *input, int element, const TimeRa { if (input == block_input_ && element >= 0) { int cache_index = GetCacheIndexFromArrayIndex(element); - const rational& block_in = blocks_.at(cache_index)->in(); - return input_time - block_in; + return TransformRangeForBlock(blocks_.at(cache_index), input_time); } return Node::InputTimeAdjustment(input, element, input_time); @@ -120,6 +119,11 @@ TimeRange Track::OutputTimeAdjustment(NodeInput *input, int element, const TimeR return Node::OutputTimeAdjustment(input, element, input_time); } +TimeRange Track::TransformRangeForBlock(Block *block, const TimeRange &range) +{ + return range - block->in(); +} + const double &Track::GetTrackHeight() const { return track_height_; @@ -229,7 +233,9 @@ Block *Track::BlockAtTime(const rational &time) const return nullptr; } - foreach (Block* block, blocks_) { + for (int i=0; iin() <= time && block->out() > time) { diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index e508ffe42..c8609a9ed 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -60,6 +60,8 @@ public: virtual TimeRange OutputTimeAdjustment(NodeInput* input, int element, const TimeRange& input_time) const override; + static TimeRange TransformRangeForBlock(Block* block, const TimeRange& range); + const double& GetTrackHeight() const; void SetTrackHeight(const double& height); diff --git a/app/node/traverser.cpp b/app/node/traverser.cpp index ecf1f6274..b7757c415 100644 --- a/app/node/traverser.cpp +++ b/app/node/traverser.cpp @@ -128,7 +128,7 @@ NodeValueTable NodeTraverser::GenerateBlockTable(const Track *track, const TimeR NodeValueTable table; if (active_block) { - table = GenerateTable(active_block, range); + table = GenerateTable(active_block, Track::TransformRangeForBlock(active_block, range)); } return table; diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index ce3a52483..608fdabdf 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -294,13 +294,6 @@ void PreviewAutoCacher::AddNode(Node *node) // Copy parameters Node::CopyInputs(node, copy, false); - - // Connect to each input - foreach (NodeInput* input, node->parameters()) { - connect(input, &NodeInput::InputConnected, this, &PreviewAutoCacher::EdgeAdded); - connect(input, &NodeInput::InputDisconnected, this, &PreviewAutoCacher::EdgeRemoved); - connect(input, &NodeInput::ValueChanged, this, &PreviewAutoCacher::ValueChanged); - } } void PreviewAutoCacher::RemoveNode(Node *node) @@ -310,13 +303,6 @@ void PreviewAutoCacher::RemoveNode(Node *node) // Delete it delete copy; - - // Disconnect from inputs - foreach (NodeInput* input, node->parameters()) { - disconnect(input, &NodeInput::InputConnected, this, &PreviewAutoCacher::EdgeAdded); - disconnect(input, &NodeInput::InputDisconnected, this, &PreviewAutoCacher::EdgeRemoved); - disconnect(input, &NodeInput::ValueChanged, this, &PreviewAutoCacher::ValueChanged); - } } void PreviewAutoCacher::AddEdge(Node *output, NodeInput *input, int element) @@ -445,21 +431,19 @@ void PreviewAutoCacher::NodeRemoved(Node *node) graph_update_queue_.append({QueuedJob::kNodeRemoved, node, nullptr, -1}); } -void PreviewAutoCacher::EdgeAdded(Node *output, int element) +void PreviewAutoCacher::EdgeAdded(Node *output, NodeInput *input, int element) { - graph_update_queue_.append({QueuedJob::kEdgeAdded, output, static_cast(sender()), element}); + graph_update_queue_.append({QueuedJob::kEdgeAdded, output, input, element}); } -void PreviewAutoCacher::EdgeRemoved(Node *output, int element) +void PreviewAutoCacher::EdgeRemoved(Node *output, NodeInput *input, int element) { - graph_update_queue_.append({QueuedJob::kEdgeRemoved, output, static_cast(sender()), element}); + graph_update_queue_.append({QueuedJob::kEdgeRemoved, output, input, element}); } -void PreviewAutoCacher::ValueChanged(const TimeRange &range, int element) +void PreviewAutoCacher::ValueChanged(NodeInput *input, int element) { - Q_UNUSED(range) - - graph_update_queue_.append({QueuedJob::kValueChanged, nullptr, static_cast(sender()), element}); + graph_update_queue_.append({QueuedJob::kValueChanged, nullptr, input, element}); } void PreviewAutoCacher::VideoParamsChanged() @@ -647,6 +631,9 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) disconnect(graph, &NodeGraph::NodeAdded, this, &PreviewAutoCacher::NodeAdded); disconnect(graph, &NodeGraph::NodeRemoved, this, &PreviewAutoCacher::NodeRemoved); + disconnect(graph, &NodeGraph::InputConnected, this, &PreviewAutoCacher::EdgeAdded); + disconnect(graph, &NodeGraph::InputDisconnected, this, &PreviewAutoCacher::EdgeRemoved); + disconnect(graph, &NodeGraph::ValueChanged, this, &PreviewAutoCacher::ValueChanged); // Disconnect signal (will be a no-op if the signal was never connected) disconnect(viewer_node_, @@ -702,6 +689,9 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) // Connect signals for future node additions/deletions connect(graph, &NodeGraph::NodeAdded, this, &PreviewAutoCacher::NodeAdded); connect(graph, &NodeGraph::NodeRemoved, this, &PreviewAutoCacher::NodeRemoved); + connect(graph, &NodeGraph::InputConnected, this, &PreviewAutoCacher::EdgeAdded); + connect(graph, &NodeGraph::InputDisconnected, this, &PreviewAutoCacher::EdgeRemoved); + connect(graph, &NodeGraph::ValueChanged, this, &PreviewAutoCacher::ValueChanged); // Copy invalidated ranges - used to determine which frames need hashing invalidated_video_ = viewer_node_->video_frame_cache()->GetInvalidatedRanges(); diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 3a6a5b429..c80f7a371 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -201,11 +201,11 @@ private slots: void NodeRemoved(Node* node); - void EdgeAdded(Node* output, int element); + void EdgeAdded(Node* output, NodeInput* input, int element); - void EdgeRemoved(Node* output, int element); + void EdgeRemoved(Node* output, NodeInput* input, int element); - void ValueChanged(const TimeRange& range, int element); + void ValueChanged(NodeInput* input, int element); void VideoParamsChanged(); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 2557d47fb..a5bbb5c05 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -210,7 +210,7 @@ NodeValueTable RenderProcessor::GenerateBlockTable(const Track *track, const Tim int max_dest_sz = audio_params.time_to_samples(range_for_block.length()); // Destination buffer - NodeValueTable table = GenerateTable(b, range_for_block); + NodeValueTable table = GenerateTable(b, Track::TransformRangeForBlock(b, range_for_block)); SampleBufferPtr samples_from_this_block = table.Take(NodeValue::kSamples).value(); if (!samples_from_this_block) {