2#include <ossia/network/osc/detail/osc_value_write_visitor.hpp>
3#include <ossia/network/osc/detail/osc_packet_processor.hpp>
4#include <ossia/network/sockets/writers.hpp>
6#include <ossia-qt/invoke.hpp>
7#include <ossia-qt/js_utilities.hpp>
9#include <boost/asio/io_context.hpp>
14#define run_on_qt_thread(...) \
15 ossia::qt::run_async(this, [=, this] { __VA_ARGS__; }, Qt::AutoConnection);
16#define run_on_asio_thread(...) \
17 boost::asio::dispatch(this->context(), [=, self = QPointer{this}] { __VA_ARGS__ });
21struct protocols_sender
23 void send_osc(
this auto&& self, QByteArray address, QJSValueList values)
25 using socket_type = std::remove_cvref_t<
decltype(self.socket)>;
26 using writer_type = ossia::net::socket_writer<socket_type>;
27 using send_visitor = ossia::net::osc_value_send_visitor<
31 const std::string addr = address.toStdString();
37 send_visitor{p, addr, writer_type{self.socket}});
41 auto v = ossia::qt::value_from_js(values[0]);
42 v.apply(send_visitor{p, addr, writer_type{self.socket}});
46 std::vector<ossia::value> vec;
47 vec.reserve(values.size());
48 for(
const auto& v : values)
49 vec.push_back(
ossia::qt::value_from_js(v));
51 vvec.apply(send_visitor{p, addr, writer_type{self.socket}});
57class qml_osc_processor :
public QObject
59 W_OBJECT(qml_osc_processor)
61 explicit qml_osc_processor() { }
65 void processMessage(
const QByteArray& bv)
67 if(onOsc.isCallable())
69 ossia::net::osc_packet_processor<
decltype(*this)> processor{*
this};
70 processor(bv.data(), bv.size());
73 W_SLOT(processMessage)
75 void operator()(
const oscpack::ReceivedMessage& msg)
77 QString address = QString::fromUtf8(msg.AddressPattern());
80 auto* engine = qjsEngine(
this);
84 for(
auto it = msg.ArgumentsBegin(); it != msg.ArgumentsEnd(); ++it)
85 values.append(oscArgToQJSValue(*it, *engine));
87 onOsc.call({engine->toScriptValue(address), engine->toScriptValue(values)});
91 oscArgToQJSValue(
const oscpack::ReceivedMessageArgument& arg, QJSEngine& engine)
95 case oscpack::INT32_TYPE_TAG:
96 return QJSValue(arg.AsInt32Unchecked());
97 case oscpack::INT64_TYPE_TAG:
98 return QJSValue((
int)arg.AsInt64Unchecked());
99 case oscpack::FLOAT_TYPE_TAG:
100 return QJSValue(arg.AsFloatUnchecked());
101 case oscpack::DOUBLE_TYPE_TAG:
102 return QJSValue(arg.AsDoubleUnchecked());
103 case oscpack::TIME_TAG_TYPE_TAG:
104 return QJSValue((
int)arg.AsTimeTagUnchecked());
105 case oscpack::CHAR_TYPE_TAG:
106 return QJSValue(QString(QChar(arg.AsCharUnchecked())));
107 case oscpack::TRUE_TYPE_TAG:
108 return QJSValue(
true);
109 case oscpack::FALSE_TYPE_TAG:
110 return QJSValue(
false);
111 case oscpack::STRING_TYPE_TAG:
112 return QJSValue(QString::fromUtf8(arg.AsStringUnchecked()));
113 case oscpack::SYMBOL_TYPE_TAG:
114 return QJSValue(QString::fromUtf8(arg.AsSymbolUnchecked()));
115 case oscpack::BLOB_TYPE_TAG: {
117 oscpack::osc_bundle_element_size_t size{};
118 arg.AsBlobUnchecked(data, size);
119 QByteArray blob((
const char*)data, size);
120 return engine.toScriptValue(blob);
122 case oscpack::RGBA_COLOR_TYPE_TAG: {
123 auto c = arg.AsRgbaColorUnchecked();
124 auto array = engine.newArray(4);
125 array.setProperty(0, uint8_t(c >> 24 & 0xFF));
126 array.setProperty(1, uint8_t(c >> 16 & 0xFF));
127 array.setProperty(2, uint8_t(c >> 8 & 0xFF));
128 array.setProperty(3, uint8_t(c & 0xFF));
132 return QJSValue(QJSValue::NullValue);
The value class.
Definition value.hpp:173
Definition qml_device.cpp:43
Full information about a parameter.
Definition parameter_data.hpp:61