OSSIA
Open Scenario System for Interactive Application
ossia-max/src/utils.hpp
1 #pragma once
2 #include "ext.h"
3 #include "ext_obex.h"
4 #include "jpatcher_api.h"
5 #undef error
6 #undef post
7 
8 #include <ossia/detail/fmt.hpp>
10 #include <ossia/network/domain/domain.hpp>
11 
12 #include <ossia-max/src/client.hpp>
13 #include <ossia-max/src/model.hpp>
14 #include <ossia-max/src/object_base.hpp>
15 #include <ossia-max/src/ossia-max.hpp>
16 #include <ossia-max/src/parameter.hpp>
17 #include <ossia-max/src/remote.hpp>
18 #include <ossia-max/src/view.hpp>
19 namespace ossia
20 {
21 namespace max_binding
22 {
23 
24 void object_namespace(object_base* x);
25 
33 std::vector<object_base*> find_children_to_register(
34  t_object* object, t_object* patcher, t_symbol* classname, bool search_dev = false);
35 
42 void register_children_in_patcher_recursively(
43  t_object* root_patcher, object_base* caller);
44 
51 long get_poly_index(t_object* patcher);
52 
56 t_object* get_patcher(t_object* object);
57 
62 void update_path_recursively(t_object* patcher);
63 
66 std::vector<std::string> parse_tags_symbol(t_symbol** tags_symbol, long size);
67 
73 std::vector<ossia::net::generic_device*> get_all_devices();
74 
80 ossia::net::address_scope get_address_scope(ossia::string_view addr);
81 
88 std::vector<ossia::value> attribute2value(t_atom* atom, long size);
89 
95 ossia::val_type symbol2val_type(t_symbol* s);
96 t_symbol* val_type2symbol(ossia::val_type t);
97 
103 ossia::bounding_mode symbol2bounding_mode(t_symbol* bounding_mode);
104 t_symbol* bounding_mode2symbol(ossia::bounding_mode bm);
105 
106 ossia::access_mode symbol2access_mode(t_symbol* access_mode);
107 t_symbol* access_mode2symbol(ossia::access_mode mode);
108 
115 std::vector<ossia::max_binding::matcher*>
116 make_matchers_vector(object_base* x, const ossia::net::node_base* node);
117 
118 ossia::value atom2value(t_symbol* s, int argc, t_atom* argv);
119 
120 // return a list of nodes priority from root to node
121 std::vector<ossia::net::priority> get_priority_list(ossia::net::node_base* node);
122 
123 struct node_priority
124 {
125  matcher* obj{};
126  std::vector<ossia::net::priority> priorities;
127 
128  friend std::ostream& operator<<(std::ostream& output, const node_priority& n)
129  {
130  output << object_classname(n.obj->get_owner())->s_name << "\t"
131  << n.obj->get_node()->get_name() << "\t";
132  for(auto p : n.priorities)
133  output << p << " ";
134  return output;
135  }
136 };
137 
143 void fire_values_by_priority(
144  std::vector<node_priority>& priority_graph, bool only_default);
145 
151 void output_all_values(t_object* patcher, bool only_default);
152 
153 template <typename T>
154 void address_mess_cb(T* x, t_symbol* address)
155 {
156  x->save_children_state();
157  x->m_name = address;
158  x->m_addr_scope = ossia::net::get_address_scope(x->m_name->s_name);
159  x->update_path();
160  x->m_node_selection.clear();
161  x->m_matchers.clear();
162  x->do_registration();
163 
164  switch(x->m_otype)
165  {
166  case object_class::view:
167  case object_class::model:
168  register_children_in_patcher_recursively(x->m_patcher, x);
169  output_all_values(x->m_patcher, false);
170  break;
171  case object_class::param:
172  for(const auto& m : x->m_matchers)
173  {
174  auto param = m->get_node()->get_parameter();
175  param->push_value(param->value());
176  }
177  break;
178  case object_class::remote:
179  for(const auto& m : x->m_matchers)
180  {
181  auto param = m->get_node()->get_parameter();
182  auto val = param->value();
183  m->output_value(val);
184  }
185  break;
186  }
187 }
188 
189 struct domain_visitor
190 {
191  parameter_base* x;
192 
193  template <typename T>
194  void operator()(ossia::domain_base<T>& d)
195  {
196  if(d.min && d.max)
197  {
198  x->m_range_size = 2;
199  A_SETFLOAT(x->m_range, *d.min);
200  A_SETFLOAT(x->m_range + 1, *d.max);
201  }
202 
203  if(d.min)
204  {
205  x->m_min_size = 1;
206  A_SETFLOAT(x->m_min, *d.min);
207  }
208 
209  if(d.max)
210  {
211  x->m_max_size = 1;
212  A_SETFLOAT(x->m_max, *d.max);
213  }
214  }
215  void operator()(ossia::domain_base<bool>& d)
216  {
217  // nothing to do
218  }
219  void operator()(ossia::domain_base<impulse>& d)
220  {
221  // nothing to do
222  }
223  void operator()(ossia::domain_base<std::string> d)
224  {
225  if(!d.values.empty())
226  {
227  x->m_range_size = d.values.size() > OSSIA_MAX_MAX_ATTR_SIZE
228  ? OSSIA_MAX_MAX_ATTR_SIZE
229  : d.values.size();
230  int i = 0;
231  for(const auto& s : d.values)
232  {
233  auto sym = gensym(s.c_str());
234  A_SETSYM(x->m_range + i, sym);
235  i++;
236  if(i == x->m_range_size)
237  break;
238  }
239  }
240  }
241  void operator()(ossia::domain_base<ossia::value> d)
242  {
243  // TODO
244  if(d.min)
245  {
246  }
247  if(d.max)
248  {
249  }
250  if(!d.values.empty())
251  {
252  }
253  }
254 
255  template <std::size_t N>
256  void operator()(ossia::vecf_domain<N>& d)
257  {
258  x->m_min_size = d.min.size() > OSSIA_MAX_MAX_ATTR_SIZE ? OSSIA_MAX_MAX_ATTR_SIZE
259  : d.min.size();
260  x->m_max_size = d.max.size() > OSSIA_MAX_MAX_ATTR_SIZE ? OSSIA_MAX_MAX_ATTR_SIZE
261  : d.max.size();
262 
263  for(int i = 0; i < x->m_max_size; i++)
264  atom_setfloat(&x->m_max[i], *d.max[i]);
265 
266  for(int i = 0; i < x->m_min_size; i++)
267  atom_setfloat(&x->m_min[i], *d.min[i]);
268 
269  x->m_range_size = 0;
270  if(x->m_min_size == x->m_max_size && x->m_min_size > 1)
271  {
272  bool flag = true;
273  for(int i = 1; i < x->m_min_size && flag; i++)
274  {
275  flag |= *d.min[0] == *d.min[i];
276  flag |= *d.max[0] == *d.max[i];
277  if(!flag)
278  break;
279  }
280  if(flag)
281  {
282  x->m_range_size = 2;
283  atom_setfloat(&x->m_range[0], *d.min[0]);
284  atom_setfloat(&x->m_range[1], *d.max[0]);
285  }
286  }
287  }
288 
289  void operator()(ossia::vector_domain& d)
290  {
291  x->m_min_size = d.min.size() > OSSIA_MAX_MAX_ATTR_SIZE ? OSSIA_MAX_MAX_ATTR_SIZE
292  : d.min.size();
293  x->m_max_size = d.max.size() > OSSIA_MAX_MAX_ATTR_SIZE ? OSSIA_MAX_MAX_ATTR_SIZE
294  : d.max.size();
295 
296  std::vector<t_atom> vamin, vamax;
297  value2atom minvisitor{vamin}, maxvisitor{vamax};
298  for(const auto& v : d.min)
299  v.apply(minvisitor);
300  for(int i = 0; i < vamin.size(); i++)
301  x->m_min[i] = vamin[i];
302 
303  for(const auto& v : d.max)
304  v.apply(maxvisitor);
305  for(int i = 0; i < vamax.size(); i++)
306  x->m_max[i] = vamax[i];
307 
308  // TODO range
309  x->m_range_size = 0;
310  }
311  void operator()() { }
312 };
313 
314 } // namespace max
315 } // namespace ossia
The node_base class.
Definition: network/base/node.hpp:48
The value class.
Definition: value.hpp:173
Definition: git_info.h:7
val_type
Enum to represent the types that a value can take.
Definition: parameter_properties.hpp:16
bounding_mode
Address behaviors at crossing domain boundaries.
Definition: parameter_properties.hpp:56
access_mode
Address behaviors at crossing domain boundaries time.
Definition: parameter_properties.hpp:46