2#include <ossia/audio/audio_parameter.hpp>
3#include <ossia/dataflow/data_copy.hpp>
4#include <ossia/dataflow/graph_edge.hpp>
5#include <ossia/dataflow/graph_node.hpp>
6#include <ossia/dataflow/port.hpp>
8#include <ossia/network/common/path.hpp>
10#include <boost/range/algorithm/lexicographical_compare.hpp>
17 const std::vector<graph_node*>& node_order;
18 const execution_state& st;
20 bool compare(
const graph_node* lhs,
const graph_node* rhs)
const
22 for(std::size_t i = 0, N = node_order.size(); i < N; i++)
24 if(node_order[i] == lhs)
26 else if(node_order[i] == rhs)
32 std::runtime_error,
"lhs and rhs have to be found");
35 bool operator()(
const graph_node* lhs,
const graph_node* rhs)
const
40 bool c1 = lhs->has_port_inputs();
41 bool c2 = rhs->has_port_inputs();
49 return compare(lhs, rhs);
51 bool l1 = lhs->has_local_inputs(st);
52 bool l2 = rhs->has_local_inputs(st);
59 return compare(lhs, rhs);
61 bool g1 = lhs->has_global_inputs();
62 bool g2 = rhs->has_global_inputs();
68 return compare(lhs, rhs);
70 return compare(lhs, rhs);
74struct init_node_visitor
77 const graph_edge& edge;
80 static bool copy(
const delay_line_type& out, std::size_t pos, inlet& in)
82 const auto w = out.which();
83 if(w.to_std_index() == in.which() && w.valid())
87 case delay_line_type::index_of<ossia::audio_delay_line>().index():
88 return copy_data_pos{pos}(
89 *
reinterpret_cast<const ossia::audio_delay_line*
>(out.target()),
90 in.cast<ossia::audio_port>());
91 case delay_line_type::index_of<ossia::midi_delay_line>().index():
92 return copy_data_pos{pos}(
93 *
reinterpret_cast<const ossia::midi_delay_line*
>(out.target()),
94 in.cast<ossia::midi_port>());
95 case delay_line_type::index_of<ossia::value_delay_line>().index():
96 return copy_data_pos{pos}(
97 *
reinterpret_cast<const ossia::value_delay_line*
>(out.target()),
98 in.cast<ossia::value_port>());
99 case delay_line_type::index_of<ossia::geometry_delay_line>().index():
100 return copy_data_pos{pos}(
101 *
reinterpret_cast<const ossia::geometry_delay_line*
>(out.target()),
102 in.cast<ossia::geometry_port>());
108 static void move(outlet& out, inlet& in)
110 const auto w = out.which();
115 case ossia::audio_port::which:
116 move_data{}(out.cast<ossia::audio_port>(), in.cast<ossia::audio_port>());
118 case ossia::midi_port::which:
119 move_data{}(out.cast<ossia::midi_port>(), in.cast<ossia::midi_port>());
121 case ossia::value_port::which:
122 move_data{}(out.cast<ossia::value_port>(), in.cast<ossia::value_port>());
124 case ossia::geometry_port::which:
125 move_data{}(out.cast<ossia::geometry_port>(), in.cast<ossia::geometry_port>());
130 static void copy(outlet& out, inlet& in)
132 if(out.cables().size() == 1 && in.cables().size() == 1 && !out.address
139 const auto w = out.which();
144 case ossia::audio_port::which:
145 copy_data{}(out.cast<ossia::audio_port>(), in.cast<ossia::audio_port>());
147 case ossia::midi_port::which:
148 copy_data{}(out.cast<ossia::midi_port>(), in.cast<ossia::midi_port>());
150 case ossia::value_port::which:
151 copy_data{}(out.cast<ossia::value_port>(), in.cast<ossia::value_port>());
153 case ossia::geometry_port::which:
155 out.cast<ossia::geometry_port>(), in.cast<ossia::geometry_port>());
162 bool operator()(immediate_glutton_connection)
const
164 if(edge.out_node->enabled())
176 bool operator()(immediate_strict_connection)
const
184 bool operator()(delayed_glutton_connection& con)
const
186 if(copy(con.buffer, con.pos, in))
191 bool operator()(delayed_strict_connection& con)
const
193 if(copy(con.buffer, con.pos, in))
198 bool operator()(dependency_connection)
const {
return true; }
200 bool operator()()
const {
return true; }
202struct init_must_copy_visitor
204 const graph_edge& edge;
206 bool operator()(
const immediate_glutton_connection&)
const
208 return !edge.out_node->enabled();
211 bool operator()(
const immediate_strict_connection&)
const {
return false; }
213 bool operator()(
const delayed_glutton_connection&)
const {
return false; }
215 bool operator()(
const delayed_strict_connection&)
const {
return false; }
217 bool operator()(
const dependency_connection&)
const {
return true; }
219 bool operator()()
const {
return true; }
226 bool operator()(
const immediate_glutton_connection&)
const
228 return !edge.in_node->enabled();
230 bool operator()(
const immediate_strict_connection& con)
const
232 using rs = immediate_strict_connection::required_sides_t;
233 switch(con.required_sides)
247 bool operator()(delayed_glutton_connection& con)
const
250 const auto con_w = con.buffer.which();
251 const auto out_w = out.which();
252 if(con_w.to_std_index() == out_w)
254 switch(con_w.index())
256 case delay_line_type::index_of<ossia::audio_delay_line>().index():
258 out.cast<ossia::audio_port>(),
259 *
reinterpret_cast<ossia::audio_delay_line*
>(con.buffer.target()));
261 case delay_line_type::index_of<ossia::midi_delay_line>().index():
263 out.cast<ossia::midi_port>(),
264 *
reinterpret_cast<ossia::midi_delay_line*
>(con.buffer.target()));
266 case delay_line_type::index_of<ossia::value_delay_line>().index():
268 out.cast<ossia::value_port>(),
269 *
reinterpret_cast<ossia::value_delay_line*
>(con.buffer.target()));
275 bool operator()(delayed_strict_connection& con)
const
278 const auto con_w = con.buffer.which();
279 const auto out_w = out.which();
280 if(con_w.to_std_index() == out_w)
282 switch(con_w.index())
284 case delay_line_type::index_of<ossia::audio_delay_line>().index():
286 out.cast<ossia::audio_port>(),
287 *
reinterpret_cast<ossia::audio_delay_line*
>(con.buffer.target()));
289 case delay_line_type::index_of<ossia::midi_delay_line>().index():
291 out.cast<ossia::midi_port>(),
292 *
reinterpret_cast<ossia::midi_delay_line*
>(con.buffer.target()));
294 case delay_line_type::index_of<ossia::value_delay_line>().index():
296 out.cast<ossia::value_port>(),
297 *
reinterpret_cast<ossia::value_delay_line*
>(con.buffer.target()));
303 bool operator()(
const dependency_connection&)
const {
return false; }
304 bool operator()()
const {
return false; }