2 #include <ossia/dataflow/audio_port.hpp>
3 #include <ossia/dataflow/data.hpp>
4 #include <ossia/dataflow/geometry_port.hpp>
5 #include <ossia/dataflow/midi_port.hpp>
6 #include <ossia/dataflow/typed_value.hpp>
7 #include <ossia/dataflow/value_port.hpp>
9 #include <ossia/detail/nullable_variant.hpp>
10 #include <ossia/network/base/parameter.hpp>
16 void operator()(value_port& p)
const { p.clear(); }
18 void operator()(midi_port& p)
const { p.messages.clear(); }
20 void operator()(audio_port& p)
const { p.set_channels(0); }
22 void operator()(geometry_port& p)
const { p.clear(); }
24 void operator()()
const { }
29 std::size_t operator()(
const value_delay_line& p)
const {
return p.data.
size(); }
31 std::size_t operator()(
const midi_delay_line& p)
const {
return p.messages.size(); }
33 std::size_t operator()(
const audio_delay_line& p)
const {
return p.samples.size(); }
35 std::size_t operator()(
const geometry_delay_line& p)
const {
return p.meshes.size(); }
37 std::size_t operator()(
const ossia::monostate&)
const {
return 0; }
38 std::size_t operator()()
const {
return 0; }
43 void operator()(value_port& out, value_port& in)
45 in.add_port_values(std::move(out));
48 void operator()(audio_port& out, audio_port& in)
50 auto tmp = std::move(in.get());
51 in.get() = std::move(out.get());
52 out.get() = std::move(tmp);
55 void operator()(midi_port& out, midi_port& in)
57 auto tmp = std::move(in.messages);
58 in.messages = std::move(out.messages);
59 out.messages = std::move(tmp);
62 void operator()(geometry_port& out, geometry_port& in)
66 in.meshes = out.meshes;
68 in.transform = out.transform;
78 operator()(
const value_vector<std::pair<ossia::typed_value, int>>& out, value_port& in)
82 in.add_local_value(val.first);
84 void operator()(
const value_vector<ossia::typed_value>& out, value_port& in)
88 in.add_local_value(val);
91 void operator()(
const value_port& out, value_port& in)
94 in.add_port_values(out);
97 void operator()(
const net::parameter_base& param, value_port& in)
100 in.add_global_value(param, param.value());
104 const net::parameter_base& param,
const value_vector<ossia::value>& vec,
108 in.add_global_values(param, vec);
111 void operator()(
const value_port& out, value_delay_line& in)
114 value_vector<ossia::typed_value> vec;
115 vec.reserve(out.get_data().size());
116 for(
const ossia::timed_value& val : out.get_data())
118 vec.emplace_back(val, out.index, out.type);
120 in.data.push_back(std::move(vec));
124 void operator()(
const audio_port& out, audio_delay_line& in)
127 in.samples.push_back(out.get());
130 void operator()(
const audio_port& out, audio_port& in)
133 mix(out.get(), in.get());
137 void operator()(
const midi_port& out, midi_port& in)
140 operator()(out.messages, in);
143 void operator()(
const value_vector<libremidi::message>& out, midi_port& in)
146 for(
const auto& data : out)
147 in.messages.push_back(data);
150 void operator()(
const midi_port& out, midi_delay_line& in)
153 in.messages.push_back(out.messages);
157 void operator()(
const geometry_port& out, geometry_port& in)
161 in.meshes = out.meshes;
163 in.transform = out.transform;
164 in.flags = out.flags;
167 void operator()(
const mesh_list_ptr& out, geometry_port& in)
173 void operator()(
const geometry_port& out, geometry_delay_line& in)
177 in.meshes.push_back(out.meshes);
183 const std::size_t pos;
185 template <
typename T,
typename U>
186 void operator()(
const T&,
const U&)
const
190 void operator()(
const value_delay_line& out, value_port& in)
192 if(pos < out.data.size())
194 copy_data{}(out.data[pos], in);
198 void operator()(
const audio_delay_line& out, audio_port& in)
200 if(pos < out.samples.size())
202 mix(out.samples[pos], in.get());
206 void operator()(
const midi_delay_line& out, midi_port& in)
208 if(pos < out.messages.size())
210 copy_data{}(out.messages[pos], in);
213 void operator()(
const geometry_delay_line& out, geometry_port& in)
215 if(pos < out.meshes.size())
217 copy_data{}(out.meshes[pos], in);