2 #include <ossia/network/base/parameter.hpp>
3 #include <ossia/network/osc/detail/bundle.hpp>
4 #include <ossia/network/osc/detail/message_generator.hpp>
5 #include <ossia/network/osc/detail/osc_1_0_policy.hpp>
6 #include <ossia/network/osc/detail/osc_packet_processor.hpp>
7 #include <ossia/network/osc/detail/osc_receive.hpp>
8 #include <ossia/network/osc/detail/osc_value_write_visitor.hpp>
9 #include <ossia/network/value/format_value.hpp>
14 template <
typename OscVersion>
15 struct osc_protocol_common
17 template <
typename T,
typename Value_T>
20 auto val = bound_value(addr, std::forward<Value_T>(v));
23 using send_visitor = osc_value_send_visitor<
26 send_visitor vis{addr, addr.get_node().osc_address(),
self.writer()};
29 if(
const auto&
logger =
self.m_logger.outbound_logger)
31 logger->info(
"[push] {} {}", addr.get_node().osc_address(), val);
41 auto val = bound_value(addr, addr.value());
44 using send_visitor = osc_value_send_visitor<
46 val.apply(send_visitor{addr, addr.address,
self.writer()});
48 if(
const auto&
logger =
self.m_logger.outbound_logger)
50 logger->info(
"[push_raw] {} {}", addr.address, val);
58 static bool echo_incoming_message(
59 T&
self,
const message_origin_identifier&
id,
const parameter_base& addr,
62 if(&
id.protocol == &
self)
65 using send_visitor = osc_value_send_visitor<
67 val.apply(send_visitor{addr, addr.get_node().osc_address(),
self.writer()});
69 if(
const auto&
logger =
self.m_logger.outbound_logger)
71 logger->info(
"[echo] {} {}", addr.get_node().osc_address(), val);
80 self.m_listening.insert(
81 std::make_pair(address.get_node().osc_address(), &address));
83 self.m_listening.erase(address.get_node().osc_address());
89 static void on_received_message(T&
self,
const oscpack::ReceivedMessage& m)
91 [[unlikely]]
if(
self.learning())
93 auto already_learned = ossia::net::osc_learn(&
self.m_device->get_root_node(), m);
98 ossia::net::on_input_message<false>(
99 m.AddressPattern(), ossia::net::osc_message_applier{self.m_id, m},
100 self.m_listening, *
self.m_device,
self.m_logger);
105 template <
typename OscVersion>
106 struct osc_protocol_client : osc_protocol_common<OscVersion>
108 template <
typename T,
typename Val_T>
114 return osc_protocol_common<OscVersion>::push(
self, addr, std::forward<Val_T>(v));
117 template <
typename T>
123 return osc_protocol_common<OscVersion>::push_raw(
self, addr);
126 template <
typename T,
typename Writer,
typename Addresses>
127 static bool push_bundle(T&
self, Writer writer,
const Addresses& addresses)
129 if(
auto bundle = make_bundle(bundle_client_policy<OscVersion>{}, addresses))
131 writer(bundle->data.data(), bundle->data.size());
132 ossia::buffer_pool::instance().release(std::move(bundle->data));
138 template <
typename T,
typename Writer,
typename Addresses>
139 static bool push_bundle_bounded(T&
self, Writer writer,
const Addresses& addresses)
141 return make_bundle_bounded(
142 bundle_bounded_client_policy<OscVersion>{}, addresses,
143 [writer](
const ossia::net::bundle& bundle) {
144 writer(bundle.data.data(), bundle.data.size());
150 template <
typename OscVersion>
151 struct osc_protocol_server : osc_protocol_common<OscVersion>
153 template <
typename T,
typename Val_T>
159 return osc_protocol_common<OscVersion>::push(
self, addr, std::forward<Val_T>(v));
162 template <
typename T>
168 return osc_protocol_common<OscVersion>::push_raw(
self, addr);
171 template <
typename T,
typename Writer,
typename Addresses>
172 static bool push_bundle(T&
self, Writer writer,
const Addresses& addresses)
174 if(
auto bundle = make_bundle(bundle_server_policy<OscVersion>{}, addresses))
176 writer(bundle->data.data(), bundle->data.size());
177 ossia::buffer_pool::instance().release(std::move(bundle->data));
183 template <
typename T,
typename Writer>
185 push_bundle(T&
self, Writer writer, tcb::span<ossia::bundle_element> addresses)
187 if(
auto bundle = make_bundle(bundle_server_policy<OscVersion>{}, addresses))
189 writer(bundle->data.data(), bundle->data.size());
190 ossia::buffer_pool::instance().release(std::move(bundle->data));
196 template <
typename T,
typename Writer>
198 push_bundle_bounded(T&
self, Writer writer, tcb::span<ossia::bundle_element> addresses)
200 return make_bundle_bounded(
201 bundle_bounded_server_policy<OscVersion>{}, addresses,
202 [writer](
const ossia::net::bundle& bundle) {
203 writer(bundle.data.data(), bundle.data.size());
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
spdlog::logger & logger() noexcept
Where the errors will be logged. Default is stderr.
Definition: context.cpp:104
@ GET
The value can be retrieved and changed.
@ SET
The value can be retrieved.
Full information about a parameter.
Definition: parameter_data.hpp:61