2 #define OSSIA_MAX_AUTOREGISTER 1
5 #include "jpatcher_api.h"
7 #include <ossia/detail/config.hpp>
11 #include "ZeroconfMinuitListener.hpp"
12 #include "ZeroconfOscqueryListener.hpp"
14 #include "attribute.hpp"
18 #include "explorer.hpp"
19 #include "fuzzysearch.hpp"
22 #include "monitor.hpp"
23 #include "ossia_object.hpp"
24 #include "parameter.hpp"
30 #include <ossia/detail/hash_map.hpp>
31 #include <ossia/detail/safe_vec.hpp>
32 #include <ossia/network/common/websocket_log_sink.hpp>
34 #include <ossia-max/src/object_base.hpp>
36 #include <ossia-max_export.h>
39 OSSIA_MAX_EXPORT
void ossia_router_setup();
40 OSSIA_MAX_EXPORT
void ossia_attribute_setup();
41 OSSIA_MAX_EXPORT
void ossia_client_setup();
42 OSSIA_MAX_EXPORT
void ossia_device_setup();
43 OSSIA_MAX_EXPORT
void ossia_logger_setup();
44 OSSIA_MAX_EXPORT
void ossia_model_setup();
45 OSSIA_MAX_EXPORT
void ossia_parameter_setup();
46 OSSIA_MAX_EXPORT
void ossia_remote_setup();
47 OSSIA_MAX_EXPORT
void ossia_view_setup();
48 OSSIA_MAX_EXPORT
void ossia_ossia_setup();
49 OSSIA_MAX_EXPORT
void ossia_explorer_setup();
50 OSSIA_MAX_EXPORT
void ossia_search_setup();
51 OSSIA_MAX_EXPORT
void ossia_monitor_setup();
52 OSSIA_MAX_EXPORT
void ossia_fuzzysearch_setup();
53 OSSIA_MAX_EXPORT
void ossia_assert_setup();
54 OSSIA_MAX_EXPORT
void ossia_cue_setup();
55 OSSIA_MAX_EXPORT
void ossia_equals_setup();
66 struct max_msp_log_sink final :
public spdlog::sinks::sink
68 void log(
const spdlog::details::log_msg& msg)
override
70 std::string s(msg.payload.data(), msg.payload.size());
73 case spdlog::level::warn:
74 case spdlog::level::err: {
75 error(
"%s", s.c_str());
80 post(
"%s", s.c_str());
85 void flush()
override { }
87 void set_pattern(
const std::string& pattern)
override { }
88 void set_formatter(std::unique_ptr<spdlog::formatter> sink_formatter)
override { }
91 struct patcher_descriptor
93 ossia::safe_set<parameter*> parameters{};
94 ossia::safe_set<remote*> remotes{};
95 ossia::safe_set<attribute*> attributes{};
96 ossia::safe_set<ocue*> cues{};
102 t_object* parent_patcher{};
103 ossia::safe_set<t_object*> subpatchers{};
112 return parameters.empty() && remotes.empty() && attributes.empty() && cues.empty()
113 && model !=
nullptr && view !=
nullptr && device !=
nullptr
114 && client !=
nullptr;
119 return parameters.size() + remotes.size() + attributes.size() + cues.size()
120 + (model ? 1 : 0) + (view ? 1 : 0) + (device ? 1 : 0) + (client ? 1 : 0);
123 bool has_no_master_node()
125 return model ==
nullptr && view ==
nullptr && device ==
nullptr && client ==
nullptr;
131 bool defer_by_default =
true;
132 bool autoregister =
true;
138 static ossia_max& instance();
139 static const std::shared_ptr<ossia::net::generic_device>& get_default_device()
141 return instance().m_device;
145 static void discover_network_devices(ossia_max* x);
147 template <
typename T>
150 if(std::is_same<T, parameter>::value)
151 return ossia_parameter_class;
152 if(std::is_same<T, remote>::value)
153 return ossia_remote_class;
154 if(std::is_same<T, model>::value)
155 return ossia_model_class;
156 if(std::is_same<T, view>::value)
157 return ossia_view_class;
158 if(std::is_same<T, device>::value)
159 return ossia_device_class;
160 if(std::is_same<T, client>::value)
161 return ossia_client_class;
162 if(std::is_same<T, attribute>::value)
163 return ossia_attribute_class;
164 if(std::is_same<T, ossia_object>::value)
165 return ossia_ossia_class;
166 if(std::is_same<T, ossia::max_binding::logger>::value)
167 return ossia_logger_class;
168 if(std::is_same<T, ossia::max_binding::explorer>::value)
169 return ossia_explorer_class;
170 if(std::is_same<T, ossia::max_binding::monitor>::value)
171 return ossia_monitor_class;
172 if(std::is_same<T, ossia::max_binding::search>::value)
173 return ossia_search_class;
174 if(std::is_same<T, ossia::max_binding::router>::value)
175 return ossia_router_class;
176 if(std::is_same<T, ossia::max_binding::fuzzysearch>::value)
177 return ossia_fuzzysearch_class;
178 if(std::is_same<T, ossia::max_binding::oassert>::value)
179 return ossia_assert_class;
180 if(std::is_same<T, ossia::max_binding::ocue>::value)
181 return ossia_cue_class;
185 void set_log_level(t_symbol* log_sym)
187 std::vector<spdlog::string_view_t> vec SPDLOG_LEVEL_NAMES;
188 auto it = std::find(vec.begin(), vec.end(), log_sym->s_name);
191 int level = it - vec.begin();
192 m_log_sink.get()->set_level(
static_cast<spdlog::level::level_enum
>(level));
196 error(
"Unknown log level : %s", log_sym->s_name);
200 t_class* ossia_router_class{};
201 t_class* ossia_client_class{};
202 t_class* ossia_attribute_class{};
203 t_class* ossia_device_class{};
204 t_class* ossia_explorer_class{};
205 t_class* ossia_monitor_class{};
206 t_class* ossia_search_class{};
207 t_class* ossia_fuzzysearch_class{};
208 t_class* ossia_logger_class{};
209 t_class* ossia_model_class{};
210 t_class* ossia_parameter_class{};
211 t_class* ossia_remote_class{};
212 t_class* ossia_view_class{};
213 t_class* ossia_ossia_class{};
214 t_class* ossia_assert_class{};
215 t_class* ossia_cue_class{};
216 t_class* ossia_equals_class{};
217 static t_class* ossia_patcher_listener_class;
221 ossia::safe_vector<remote*> remotes;
222 ossia::safe_vector<view*> views;
223 ossia::safe_vector<device*> devices;
224 ossia::safe_vector<client*> clients;
225 ossia::safe_vector<logger*> loggers;
227 static ossia::hash_map<ossia::net::node_base*, ossia::safe_set<matcher*>>
229 static std::recursive_mutex s_node_matchers_mut;
232 bool registering_nodes =
false;
234 std::map<t_object*, patcher_descriptor> patchers;
236 static patcher_descriptor& get_patcher_descriptor(t_object* patcher);
237 static void remove_patcher_descriptor(t_object* patcher);
240 static void* s_browse_clock;
242 static ZeroconfOscqueryListener s_zeroconf_oscq_listener;
243 static ZeroconfMinuitListener s_zeroconf_minuit_listener;
245 configuration config;
250 ossia_max(
const ossia_max&) =
delete;
251 ossia_max(ossia_max&&) =
delete;
254 std::shared_ptr<ossia::net::generic_device> m_device;
255 string_map<std::shared_ptr<ossia::websocket_threaded_connection>> m_connections;
256 std::shared_ptr<max_msp_log_sink> m_log_sink;
258 t_object* m_patcher_listener;
261 template <
typename T,
typename... Args>
262 T* make_ossia(Args&&... args)
264 auto obj = object_alloc(ossia_max::instance().get_class<T>());
268 memcpy(&tmp, obj,
sizeof(t_object));
269 auto x =
new(obj) T{std::forward<Args>(args)...};
270 memcpy(x, &tmp,
sizeof(t_object));
A protocol used to expose a local application's data through multiple other protocols.
Definition: local.hpp:22