2 #include <Process/Execution/ProcessComponent.hpp>
3 #include <Process/ExecutionContext.hpp>
5 #include <Explorer/DeviceList.hpp>
6 #include <Explorer/DocumentPlugin/DeviceDocumentPlugin.hpp>
8 #include <Engine/Node/Process.hpp>
9 #include <Engine/Node/TickPolicy.hpp>
11 #include <score/tools/Bind.hpp>
13 #include <ossia/dataflow/safe_nodes/executor.hpp>
20 template <
typename Info_T,
typename Node_T,
typename Element>
25 const std::shared_ptr<Node_T>& node_ptr;
28 template <
typename Idx_T>
32 std::weak_ptr<Node_T> weak_node;
33 void operator()(
const ossia::value& val)
35 using namespace ossia::safe_nodes;
36 constexpr
auto idx = Idx_T::value;
39 typename std::tuple_element<idx, decltype(Info_T::Metadata::controls)>::type;
40 using control_value_type =
typename control_type::type;
42 if(
auto node = weak_node.lock())
44 constexpr
const auto ctrl = tuplet::get<idx>(Info_T::Metadata::controls);
45 if(
auto v = ctrl.fromValue(val))
47 tuplet::get<idx>(node->controls), std::move(*v)});
52 template <
typename Idx_T>
56 std::weak_ptr<Node_T> weak_node;
57 void operator()(
const ossia::value& val)
59 using namespace ossia::safe_nodes;
60 constexpr
auto idx = Idx_T::value;
63 typename std::tuple_element<idx, decltype(Info_T::Metadata::controls)>::type;
64 using control_value_type =
typename control_type::type;
66 if(
auto node = weak_node.lock())
68 constexpr
const auto ctrl = tuplet::get<idx>(Info_T::Metadata::controls);
70 tuplet::get<idx>(node->controls), ctrl.fromValue(val)});
78 using namespace ossia::safe_nodes;
80 constexpr
int idx = T::value;
82 constexpr
const auto ctrl = tuplet::get<idx>(Info_T::Metadata::controls);
83 constexpr
const auto control_start = info_functions<Info>::control_start;
85 typename std::tuple_element<idx, decltype(Info_T::Metadata::controls)>::type;
89 auto& node = *node_ptr;
90 std::weak_ptr<Node_T> weak_node = node_ptr;
92 if constexpr(control_type::must_validate)
94 if(
auto res = ctrl.fromValue(element.control(idx)))
95 tuplet::get<idx>(node.controls) = *res;
98 inlet, &Process::ControlInlet::valueChanged, parent,
103 tuplet::get<idx>(node.controls) = ctrl.fromValue(element.control(idx));
106 inlet, &Process::ControlInlet::valueChanged, parent,
107 con_unvalidated<T>{ctx, weak_node});
112 template <
typename Info,
typename Element,
typename Node_T>
115 typename Node_T::controls_values_type& arr;
118 template <
typename T>
121 using namespace ossia::safe_nodes;
123 using namespace tuplet;
124 constexpr
const auto ctrl = tuplet::get<T::value>(Info::Metadata::controls);
126 element.setControl(T::value, ctrl.toValue(get<T::value>(arr)));
130 template <
typename Info,
typename Element,
typename Node_T>
133 typename Node_T::control_outs_values_type& arr;
136 template <
typename T>
139 using namespace ossia::safe_nodes;
141 using namespace tuplet;
142 constexpr
const auto ctrl = tuplet::get<T::value>(Info::Metadata::control_outs);
144 element.setControlOut(T::value, ctrl.toValue(get<T::value>(arr)));
148 template <
typename Info,
typename Node_T,
typename Element_T>
151 std::weak_ptr<Node_T> weak_node;
154 void handle_controls(Node_T& node)
const noexcept
156 using namespace ossia::safe_nodes;
159 typename Node_T::controls_values_type arr;
161 while(node.cqueue.try_dequeue(arr))
167 constexpr
const auto control_count = info_functions<Info>::control_count;
169 ossia::for_each_in_range<control_count>(
174 void handle_control_outs(Node_T& node)
const noexcept
176 using namespace ossia::safe_nodes;
179 typename Node_T::control_outs_values_type arr;
181 while(node.control_outs_queue.try_dequeue(arr))
187 constexpr
const auto control_out_count = info_functions<Info>::control_out_count;
189 ossia::for_each_in_range<control_out_count>(
194 void operator()()
const noexcept
196 using namespace ossia::safe_nodes;
197 if(
auto node = weak_node.lock())
199 if constexpr(info_functions<Info>::control_count > 0)
200 handle_controls(*node);
202 if constexpr(info_functions<Info>::control_out_count > 0)
203 handle_control_outs(*node);
208 template <
typename Info,
typename Node_T,
typename Element_T>
210 const std::shared_ptr<Node_T>& node_ptr, Element_T& element,
213 using namespace ossia::safe_nodes;
216 if constexpr(info_functions<Info>::control_count > 0)
221 ossia::for_each_in_range<info_functions<Info>::control_count>(
226 info_functions<Info>::control_count > 0
227 || info_functions<Info>::control_out_count > 0)
230 std::weak_ptr<Node_T> weak_node = node_ptr;
231 con(ctx.doc.coarseUpdateTimer, &QTimer::timeout, parent,
232 ExecutorGuiUpdate<Info, Node_T, Element_T>{weak_node, element},
233 Qt::QueuedConnection);
237 template <
typename Info>
244 return Info::Metadata::uuid;
251 return static_key() == other || Execution::ProcessComponent::base_key_match(other);
257 element, ctx,
"Executor::ControlProcess<Info>", parent}
259 std::shared_ptr<ossia::safe_nodes::safe_node<Info>> n{
260 new ossia::safe_nodes::safe_node<Info>};
261 n->prepare(*ctx.execState.get());
263 this->m_ossia_process = std::make_shared<ossia::node_process>(this->node);
265 setup_node<Info>(n, element, ctx,
this);
Definition: score-plugin-engine/Engine/Node/Process.hpp:319
Definition: score-plugin-engine/Engine/Node/Executor.hpp:240
Definition: score-lib-process/Process/Dataflow/Port.hpp:202
Definition: UuidKey.hpp:343
Definition: score-plugin-engine/Engine/Node/Executor.hpp:150
Definition: score-plugin-engine/Engine/Node/Executor.hpp:54
Definition: score-plugin-engine/Engine/Node/Executor.hpp:30
Definition: score-plugin-engine/Engine/Node/Executor.hpp:22
Definition: score-plugin-engine/Engine/Node/Executor.hpp:132
Definition: score-plugin-engine/Engine/Node/Executor.hpp:114
Definition: ExecutionContext.hpp:75
ExecutionCommandQueue & executionQueue
Definition: ExecutionContext.hpp:90
Definition: Process/Execution/ProcessComponent.hpp:89