2 #include <ossia/detail/buffer_pool.hpp>
4 #include <ossia/network/base/bundle.hpp>
5 #include <ossia/network/base/osc_address.hpp>
6 #include <ossia/network/osc/detail/osc_1_0_policy.hpp>
7 #include <ossia/network/osc/detail/osc_messages.hpp>
8 #include <ossia/network/value/value.hpp>
10 #include <oscpack/osc/OscOutboundPacketStream.h>
18 template <
typename OscPolicy>
19 struct bundle_common_policy
21 template <
typename Addr_T>
23 operator()(oscpack::OutboundPacketStream& str,
ossia::value& val,
const Addr_T& addr)
25 if(val = bound_value(addr, val); val.valid())
27 str << oscpack::BeginMessageN(osc_address(addr));
28 val.apply(
typename OscPolicy::dynamic_policy{{str, addr.get_unit()}});
29 str << oscpack::EndMessage();
34 template <
typename OscPolicy>
35 struct bundle_client_policy
37 template <
typename Addr_T>
39 operator()(oscpack::OutboundPacketStream& str,
ossia::value& val,
const Addr_T& addr)
44 bundle_common_policy<OscPolicy>{}(str, val, addr);
48 template <
typename OscPolicy>
49 using bundle_server_policy = bundle_common_policy<OscPolicy>;
52 template <
typename OscPolicy>
53 struct bundle_bounded_common_policy
55 template <
typename Addr_T>
57 operator()(oscpack::OutboundPacketStream& str,
ossia::value& val,
const Addr_T& addr)
61 str << oscpack::BeginMessageN(osc_address(addr));
62 val.apply(
typename OscPolicy::dynamic_policy{{str, addr.get_unit()}});
63 str << oscpack::EndMessage();
68 template <
typename OscPolicy>
69 struct bundle_bounded_client_policy
71 template <
typename Addr_T>
73 operator()(oscpack::OutboundPacketStream& str,
ossia::value& val,
const Addr_T& addr)
78 bundle_bounded_common_policy<OscPolicy>{}(str, val, addr);
82 template <
typename OscPolicy>
83 using bundle_bounded_server_policy = bundle_bounded_common_policy<OscPolicy>;
93 static inline auto& access_parameter(
const ossia::bundle_element& p)
100 ossia::buffer_pool::buffer data;
104 template <
typename NetworkPolicy,
typename Addresses>
105 std::optional<bundle>
106 make_bundle(NetworkPolicy add_element_to_bundle,
const Addresses& addresses)
109 bundle ret{ossia::buffer_pool::instance().acquire(max_osc_message_size),
false};
111 oscpack::OutboundPacketStream str(ret.data.data(), max_osc_message_size);
112 str << oscpack::BeginBundleImmediate();
115 for(
const auto& a : addresses)
117 auto& param = access_parameter(a);
118 ret.critical |= param.get_critical();
120 add_element_to_bundle(str, val, param);
122 str << oscpack::EndBundle();
123 ret.data.resize(str.Size());
131 catch(
const oscpack::OutOfBufferMemoryException&)
134 "make_bundle_client: message too large (limit is {} bytes)", max_osc_message_size);
137 catch(
const std::runtime_error& e)
148 template <
typename NetworkPolicy>
149 std::optional<bundle> make_bundle(
150 NetworkPolicy add_element_to_bundle,
151 const tcb::span<ossia::bundle_element>& addresses)
154 bundle ret{ossia::buffer_pool::instance().acquire(max_osc_message_size),
false};
156 oscpack::OutboundPacketStream str(ret.data.data(), max_osc_message_size);
157 str << oscpack::BeginBundleImmediate();
159 for(
auto& [p, v] : addresses)
162 ret.critical |= param.get_critical();
163 add_element_to_bundle(str, v, param);
165 str << oscpack::EndBundle();
166 ret.data.resize(str.Size());
174 catch(
const oscpack::OutOfBufferMemoryException&)
177 "make_bundle_client: message too large (limit is {} bytes)", max_osc_message_size);
180 catch(
const std::runtime_error& e)
191 template <
typename NetworkPolicy>
192 bool make_bundle_bounded(
193 NetworkPolicy add_element_to_bundle,
194 const tcb::span<ossia::bundle_element>& addresses,
auto callback)
196 bundle ret{ossia::buffer_pool::instance().acquire(max_osc_message_size),
false};
200 oscpack::OutboundPacketStream str(ret.data.data(), max_osc_message_size);
201 str << oscpack::BeginBundleImmediate();
203 for(
auto& [p, v] : addresses)
206 ret.critical |= param.get_critical();
207 add_element_to_bundle(str, v, param);
209 str << oscpack::EndBundle();
210 ret.data.resize(str.Size());
218 catch(
const oscpack::OutOfBufferMemoryException&)
221 "make_bundle_client: message too large (limit is {} bytes)",
222 max_osc_message_size);
224 catch(
const std::runtime_error& e)
232 ossia::buffer_pool::instance().release(std::move(ret.data));
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
The value class.
Definition: value.hpp:173
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.
bool critical
Means that the node is very important, e.g. a "play" message.
Definition: node_attributes.hpp:92
Full information about a parameter.
Definition: parameter_data.hpp:61