2 #include <ossia/dataflow/exec_state_facade.hpp>
3 #include <ossia/dataflow/execution_state.hpp>
4 #include <ossia/detail/algorithms.hpp>
5 #include <ossia/network/common/path.hpp>
7 #include <halp/controls.hpp>
8 #include <halp/meta.hpp>
21 ossia::exec_state_facade ossia_state;
22 std::optional<ossia::traversal::path> m_path;
23 std::vector<ossia::net::node_base*> roots;
31 if(!p.ossia_state.impl)
40 p.m_path = ossia::traversal::make_path(value);
49 auto& p = *current_object;
50 ossia::execution_state& st = *p.ossia_state.impl;
51 const auto& rdev = st.exec_devices();
59 if(devices_observed.find(dev) == devices_observed.end())
61 devices_observed.insert(dev);
62 dev->on_node_created.connect<&PatternSelector::mark_dirty>(
this);
63 dev->on_node_removing.connect<&PatternSelector::mark_dirty>(
this);
65 p.roots.push_back(&dev->get_root_node());
68 for(
auto it = devices_observed.begin(); it != devices_observed.end();)
70 if(!ossia::contains(rdev, *it))
71 it = devices_observed.erase(it);
76 ossia::traversal::apply(*p.m_path, p.roots);
77 devices_dirty =
false;
83 for(
auto* dev : devices_observed)
85 dev->on_node_created.disconnect<&PatternSelector::mark_dirty>(
this);
86 dev->on_node_removing.disconnect<&PatternSelector::mark_dirty>(
this);
90 void mark_dirty(ossia::net::node_base&) { devices_dirty =
true; }
93 bool devices_dirty =
false;
95 ossia::flat_set<ossia::net::device_base*> devices_observed;
100 halp_meta(name,
"Pattern applier")
101 halp_meta(author,
"ossia team")
102 halp_meta(category,
"Control/Data processing")
103 halp_meta(description,
"Send a message to all nodes matching a pattern")
104 halp_meta(c_name,
"avnd_pattern_apply")
105 halp_meta(uuid,
"44a55ee1-c2c9-43d5-a655-8eaedaff394c")
109 halp::val_port<
"Input", ossia::value> input;
123 auto process = [
this](
const std::vector<ossia::value>& vec) {
124 const auto N = std::min(roots.size(), vec.size());
125 for(std::size_t i = 0; i < N; i++)
127 if(
auto p = roots[i]->get_parameter())
129 p->push_value(vec[i]);
134 if(
auto vvec = inputs.input.value.target<std::vector<ossia::value>>())
140 process(ossia::convert<std::vector<ossia::value>>(inputs.input.value));