34 if(!p.ossia_state.impl)
44 std::vector<std::string> results;
45 boost::split(results, value, [](
char c){
return c ==
'\n' || c ==
'\r'; });
47 for(
auto& res : results) {
49 if(
auto path = ossia::traversal::make_path(res))
51 p.m_paths.push_back(std::move(*path));
63 auto& p = *current_object;
64 ossia::execution_state& st = *p.ossia_state.impl;
65 const auto& rdev = st.exec_devices();
73 if(devices_observed.find(dev) == devices_observed.end())
75 devices_observed.insert(dev);
76 dev->on_node_created.connect<&PatternSelector::mark_dirty>(
this);
77 dev->on_node_removing.connect<&PatternSelector::mark_dirty>(
this);
79 p.roots.push_back(&dev->get_root_node());
82 for(
auto it = devices_observed.begin(); it != devices_observed.end();)
84 if(!ossia::contains(rdev, *it))
85 it = devices_observed.erase(it);
90 const auto orig_roots = p.roots;
91 std::vector<ossia::net::node_base*> result;
92 std::vector<ossia::net::node_base*> total;
93 for(
auto& path : p.m_paths) {
94 result.assign(orig_roots.begin(), orig_roots.end());
96 ossia::traversal::apply(path, result);
97 total.insert(total.end(), result.begin(), result.end());
100 ossia::remove_duplicates(total);
103 [](ossia::net::node_base* lhs, ossia::net::node_base* rhs) {
107 std::swap(p.roots, total);
109 devices_dirty =
false;
115 for(
auto* dev : devices_observed)
117 dev->on_node_created.disconnect<&PatternSelector::mark_dirty>(
this);
118 dev->on_node_removing.disconnect<&PatternSelector::mark_dirty>(
this);
122 void mark_dirty(ossia::net::node_base&) { devices_dirty =
true; }
125 bool devices_dirty =
false;
127 ossia::flat_set<ossia::net::device_base*> devices_observed;
132 halp_meta(name,
"Pattern applier")
133 halp_meta(author,
"ossia team")
134 halp_meta(category,
"Control/Data processing")
135 halp_meta(description,
"Send a message to all nodes matching a pattern")
136 halp_meta(c_name,
"avnd_pattern_apply")
137 halp_meta(uuid,
"44a55ee1-c2c9-43d5-a655-8eaedaff394c")
138 halp_meta(manual_url,
"https://ossia.io/score-docs/processes/pattern-applier.html#pattern-applier")
142 halp::val_port<
"Input", ossia::value> input;
156 auto process = [
this](
const std::vector<ossia::value>& vec) {
157 const auto N = std::min(roots.size(), vec.size());
158 for(std::size_t i = 0; i < N; i++)
160 if(
auto p = roots[i]->get_parameter())
162 p->push_value(vec[i]);
167 if(
auto vvec = inputs.input.value.target<std::vector<ossia::value>>())
173 process(ossia::convert<std::vector<ossia::value>>(inputs.input.value));