2 #include <ossia/dataflow/data_copy.hpp>
3 #include <ossia/dataflow/execution/execution_policy.hpp>
4 #include <ossia/dataflow/execution_state.hpp>
5 #include <ossia/protocols/midi/detail/midi_impl.hpp>
6 #include <ossia/protocols/midi/midi_node.hpp>
11 struct local_pull_visitor
13 local_state_execution_policy& st;
15 bool operator()(value_port& val)
const
17 OSSIA_EXEC_STATE_LOCK_READ(st);
18 auto it = st.m_valueState.find(addr);
19 if(it != st.m_valueState.end() && !it->second.empty())
21 copy_data{}(it->second, val);
27 bool operator()(audio_port& val)
const
29 #if defined(OSSIA_PROTOCOL_AUDIO)
30 OSSIA_EXEC_STATE_LOCK_READ(st);
31 auto it = st.m_audioState.find(
static_cast<ossia::audio_parameter*
>(addr));
32 if(it != st.m_audioState.end() && !it->second.empty())
34 copy_data{}(it->second, val);
41 bool operator()(midi_port& val)
const
43 #if defined(OSSIA_PROTOCOL_MIDI)
44 OSSIA_EXEC_STATE_LOCK_READ(st);
45 auto it = st.m_midiState.find(addr);
46 if(it != st.m_midiState.end() && !it->second.empty())
48 copy_data{}(it->second, val);
55 [[noreturn]]
bool operator()(geometry_port& val)
const
61 bool operator()()
const {
return false; }
64 struct global_pull_visitor
66 ossia::execution_state& state;
67 const net::parameter_base& out;
68 void operator()(value_port& val)
const
72 copy_data{}(out, val);
76 auto it = state.m_receivedValues.find(
const_cast<net::parameter_base*
>(&out));
77 if(it != state.m_receivedValues.end())
79 copy_data{}(*it->first, it->second, val);
84 void operator()(audio_port& val)
const
86 #if defined(OSSIA_PROTOCOL_AUDIO)
88 auto aa =
dynamic_cast<const audio_parameter*
>(&out);
91 auto aa =
static_cast<const audio_parameter*
>(&out);
93 aa->clone_value(val.get());
97 void operator()(midi_port& val)
const
99 #if defined(OSSIA_PROTOCOL_MIDI)
100 auto& node = out.get_node();
101 auto& dev = node.get_device();
102 auto& proto = dev.get_protocol();
107 auto midi =
dynamic_cast<ossia::net::midi::midi_protocol*
>(&proto);
110 auto midi =
static_cast<ossia::net::midi::midi_protocol*
>(&proto);
113 auto it = state.m_receivedMidi.find(midi);
114 if(it != state.m_receivedMidi.end())
116 for(
const libremidi::message& v : it->second.messages)
118 val.messages.push_back(v);
124 [[noreturn]]
void operator()(geometry_port& val)
const { assert(
false); }
126 void operator()()
const { }
129 struct global_pull_node_visitor
131 ossia::execution_state& state;
132 const net::node_base& out;
133 void operator()(value_port& val)
const { val.write_value(ossia::net::to_map(out), 0); }
135 void operator()(audio_port& val)
const
140 void operator()(midi_port& val)
const
142 #if defined(OSSIA_PROTOCOL_MIDI)
144 auto& dev = node.get_device();
145 auto& proto = dev.get_protocol();
150 auto midi =
dynamic_cast<ossia::net::midi::midi_protocol*
>(&proto);
153 auto midi =
static_cast<ossia::net::midi::midi_protocol*
>(&proto);
157 if(node.get_parent() == &dev.get_root_node())
160 channel =
static_cast<const ossia::net::midi::channel_node&
>(node).channel;
163 auto it = state.m_receivedMidi.find(midi);
164 if(it != state.m_receivedMidi.end())
168 for(
const libremidi::message& v : it->second.messages)
170 val.messages.push_back(v);
175 for(
const libremidi::message& v : it->second.messages)
177 if(v.get_channel() == channel)
178 val.messages.push_back(v);
185 [[noreturn]]
void operator()(geometry_port& val)
const { assert(
false); }
187 void operator()()
const { }
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48