Loading...
Searching...
No Matches
ExecutionSetup.hpp
1#pragma once
2#include <Process/Dataflow/Cable.hpp>
3#include <Process/Dataflow/PortForward.hpp>
4#include <Process/ExecutionContext.hpp>
5
6#include <score/tools/std/HashMap.hpp>
7
8#include <ossia/detail/flat_map.hpp>
9#include <ossia/detail/small_vector.hpp>
10
11#include <QMetaObject>
12
13#include <nano_observer.hpp>
14
15namespace ossia
16{
17class time_process;
18}
19
20namespace Process
21{
22class ProcessModel;
23class ProcessModel;
24class Cable;
25}
26
27namespace State
28{
29struct AddressAccessor;
30}
31
32namespace Execution
33{
34struct Transaction;
35struct SCORE_LIB_PROCESS_EXPORT SetupContext final
36 : public QObject
37 , public Nano::Observer
38{
39 explicit SetupContext(Context& other) noexcept;
41 Context& context;
42 void register_node(
43 const Process::ProcessModel& proc, const std::shared_ptr<ossia::graph_node>& node);
44 void unregister_node(
45 const Process::ProcessModel& proc, const std::shared_ptr<ossia::graph_node>& node);
46 void register_node(
47 const Process::Inlets& inlets, const Process::Outlets& outlets,
48 const std::shared_ptr<ossia::graph_node>& node);
49 void unregister_node(
50 const Process::Inlets& inlets, const Process::Outlets& outlets,
51 const std::shared_ptr<ossia::graph_node>& node);
52 void unregister_node_soft(
53 const Process::Inlets& inlets, const Process::Outlets& outlets,
54 const std::shared_ptr<ossia::graph_node>& node, Transaction& vec);
55
56 void set_destination(const State::AddressAccessor& address, const ossia::inlet_ptr&);
57 void set_destination(const State::AddressAccessor& address, const ossia::outlet_ptr&);
58
59 void register_inlet(
60 Process::Inlet& inlet, const ossia::inlet_ptr& exec,
61 const std::shared_ptr<ossia::graph_node>& node);
62 void register_outlet(
63 Process::Outlet& outlet, const ossia::outlet_ptr& exec,
64 const std::shared_ptr<ossia::graph_node>& node);
65
66 void unregister_inlet(
67 const Process::Inlet& inlet, const std::shared_ptr<ossia::graph_node>& node);
68 void unregister_outlet(
69 const Process::Outlet& outlet, const std::shared_ptr<ossia::graph_node>& node);
70
71 // Deferred versions, stored in a vec
72 void register_node(
73 const Process::Inlets& inlets, const Process::Outlets& outlets,
74 const std::shared_ptr<ossia::graph_node>& node, Transaction& vec);
75 void unregister_node(
76 const Process::Inlets& inlets, const Process::Outlets& outlets,
77 const std::shared_ptr<ossia::graph_node>& node, Transaction& vec);
78 void register_node(
79 const Process::ProcessModel& proc, const std::shared_ptr<ossia::graph_node>& node,
80 Transaction& vec);
81 void unregister_node(
82 const Process::ProcessModel& proc, const std::shared_ptr<ossia::graph_node>& node,
83 Transaction& vec);
84
85 void register_inlet(
86 Process::Inlet& inlet, const ossia::inlet_ptr& exec,
87 const std::shared_ptr<ossia::graph_node>& node, Transaction& vec);
88 void register_outlet(
89 Process::Outlet& outlet, const ossia::outlet_ptr& exec,
90 const std::shared_ptr<ossia::graph_node>& node, Transaction& vec);
91
92 void unregister_inlet(
93 const Process::Inlet& inlet, const std::shared_ptr<ossia::graph_node>& node,
94 Transaction& vec);
95 void unregister_outlet(
96 const Process::Outlet& outlet, const std::shared_ptr<ossia::graph_node>& node,
97 Transaction& vec);
98
99 void replace_node(
100 const std::shared_ptr<ossia::time_process>& process,
101 const std::shared_ptr<ossia::graph_node>& node, Transaction& commands);
102
103 void on_cableCreated(Process::Cable& c);
104 void on_cableRemoved(const Process::Cable& c);
105 void connectCable(Process::Cable& cable);
106 void connectCable(Process::Cable& c, Transaction& vec);
107 void removeCable(const Process::Cable& c);
108 void removeCable(const Process::Cable& c, Transaction& vec);
109
110 score::hash_map<Process::Outlet*, std::pair<ossia::node_ptr, ossia::outlet_ptr>>
111 outlets;
112 score::hash_map<Process::Inlet*, std::pair<ossia::node_ptr, ossia::inlet_ptr>> inlets;
113 score::hash_map<Id<Process::Cable>, std::shared_ptr<ossia::graph_edge>> m_cables;
114
116 {
117 using connections = ossia::small_vector<QMetaObject::Connection, 3>;
118 ossia::flat_map<Id<Process::Port>, connections> inlets;
119 ossia::flat_map<Id<Process::Port>, connections> outlets;
120 void clear() const noexcept
121 {
122 for(auto& [id, cons] : inlets)
123 for(auto& con : cons)
124 QObject::disconnect(con);
125 for(auto& [id, cons] : outlets)
126 for(auto& con : cons)
127 QObject::disconnect(con);
128 }
129 };
130
131 score::hash_map<std::shared_ptr<ossia::graph_node>, RegisteredPorts>
132 runtime_connections;
133 score::hash_map<const ossia::graph_node*, const Process::ProcessModel*> proc_map;
134
135private:
136 template <typename Impl>
137 void register_node_impl(
138 const Process::Inlets& inlets, const Process::Outlets& outlets,
139 const std::shared_ptr<ossia::graph_node>& node, Impl&&);
140
141 void follow_published();
144 void rebind(QObject* port);
145 bool m_followsPublished{};
146
147 template <typename Port_T, typename OssiaPort_T, typename Impl>
148 void bind_address(
149 Port_T& proc_port, const OssiaPort_T& ossia_port,
150 const std::shared_ptr<ossia::graph_node>& node, RegisteredPorts::connections& cons,
151 Impl&& impl);
152
153 template <typename Impl>
154 void register_inlet_impl(
155 Process::Inlet& inlet, const ossia::inlet_ptr& exec,
156 const std::shared_ptr<ossia::graph_node>& node, Impl&&);
157
158 template <typename Impl>
159 void register_outlet_impl(
160 Process::Outlet& outlet, const ossia::outlet_ptr& exec,
161 const std::shared_ptr<ossia::graph_node>& node, Impl&&);
162
163 template <typename Impl>
164 void connect_cable_impl(Process::Cable& c, Impl&&);
165
166 template <typename Impl>
167 void disconnect_cable_impl(const Process::Cable& c, Impl&&);
168};
169}
Definition Cable.hpp:38
Definition Port.hpp:221
Definition Port.hpp:329
The Process class.
Definition score-lib-process/Process/Process.hpp:82
Components used for the execution of a score.
Definition PortTap.cpp:24
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
Utilities for OSSIA data structures.
Definition DeviceInterface.hpp:35
Definition ExecutionContext.hpp:208
Definition ExecutionSetup.hpp:116
Definition ExecutionSetup.hpp:38
Definition ExecutionTransaction.hpp:21
Definition PortForward.hpp:23
Definition PortForward.hpp:27
Definition Address.hpp:136