2 #include <ossia/detail/fmt.hpp>
4 #include <ossia/network/base/device.hpp>
5 #include <ossia/network/base/listening.hpp>
6 #include <ossia/network/base/message_origin_identifier.hpp>
7 #include <ossia/network/base/parameter.hpp>
8 #include <ossia/network/common/network_logger.hpp>
9 #include <ossia/network/osc/detail/osc.hpp>
11 #include <oscpack/osc/OscPrintReceivedElements.h>
12 #include <oscpack/osc/OscReceivedElements.h>
14 #if defined(OSSIA_HAS_FMT)
18 struct formatter<oscpack::ReceivedMessage>
20 template <
typename ParseContext>
21 constexpr
auto parse(ParseContext& ctx)
26 template <
typename FormatContext>
27 auto format(
const oscpack::ReceivedMessage& m, FormatContext& ctx)
30 out = fmt::format_to(out,
"{}", m.AddressPattern());
31 if(m.ArgumentCount() > 0)
33 out = fmt::format_to(out,
": ");
34 auto buf = fmt::basic_memory_buffer<char>();
35 for(
auto it = m.ArgumentsBegin(); it != m.ArgumentsEnd(); ++it)
37 using namespace detail;
40 formatbuf<std::basic_streambuf<char>> format_buf{buf};
41 std::basic_ostream<char> output{&format_buf};
44 out = fmt::format_to(out,
"{} ", std::string_view{buf.data(), buf.size()});
56 struct osc_message_applier
58 message_origin_identifier id;
59 const oscpack::ReceivedMessage& m;
60 void on_listened_value(
62 network_logger& logger)
64 if(
auto v = net::get_filtered_value(the_addr, m); v.valid())
66 dev.apply_incoming_message(
id, the_addr, std::move(v));
69 if(
logger.inbound_listened_logger)
70 logger.inbound_listened_logger->info(
"[input] {}", m);
75 if(
auto v = net::get_filtered_value(the_addr, m); v.valid())
77 dev.apply_incoming_message(
id, the_addr, std::move(v));
83 if(
auto v = net::get_filtered_value(the_addr, m); v.valid())
85 dev.apply_incoming_message_quiet(
id, the_addr, std::move(v));
91 dev.on_unhandled_message(
93 net::osc_utilities::create_any(
94 m.ArgumentsBegin(), m.ArgumentsEnd(), m.ArgumentCount()));
97 void log(network_logger& logger)
100 logger.inbound_logger->info(
"[input] {}", m);
104 template <
bool SilentUpdate,
typename F>
105 void on_input_message(
106 std::string_view addr_txt, F&& f,
const ossia::net::listened_parameters& listening,
109 auto addr = listening.find(addr_txt);
113 f.on_listened_value(**addr, dev, logger);
118 if(
auto n =
find_node(dev.get_root_node(), addr_txt))
120 if(
auto base_addr = n->get_parameter())
122 if constexpr(!SilentUpdate)
123 f.on_value(*base_addr, dev);
125 f.on_value_quiet(*base_addr, dev);
131 auto nodes =
find_nodes(dev.get_root_node(), addr_txt);
134 if(
auto addr = n->get_parameter())
136 if(!SilentUpdate || listening.find(n->osc_address()))
137 f.on_value(*addr, dev);
139 f.on_value_quiet(*addr, dev);
Root of a device tree.
Definition: ossia/network/base/device.hpp:58
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
OSSIA_EXPORT ossia::net::node_base * find_node(node_base &dev, std::string_view parameter_base)
Find a node in a device.
OSSIA_EXPORT std::vector< ossia::net::node_base * > find_nodes(node_base &dev, std::string_view pattern)
Find all nodes matching a pattern in a device.