2#include <ossia/network/context.hpp>
4#include <ossia-qt/protocols/utils.hpp>
11#include <libremidi/libremidi.hpp>
13#include <nano_observer.hpp>
35class qml_ump_inbound_socket
37 ,
public Nano::Observer
39 W_OBJECT(qml_ump_inbound_socket)
41 qml_ump_inbound_socket() { }
43 ~qml_ump_inbound_socket() { close(); }
45 void open(
const libremidi::port_information& pi)
50 libremidi::ump_input_configuration config;
52 = [
this](
const libremidi::ump& message) { handleUMPMessage(message); };
55 m_ump_in = std::make_unique<libremidi::midi_in>(
56 config, libremidi::midi2::default_api());
59 if(
auto err = m_ump_in->open_port(
static_cast<const libremidi::input_port&
>(pi));
62 if(onError.isCallable())
64 const auto& msg = err.message();
66 { onError.call({QString::fromUtf8(msg.data(), msg.size())}); });
74 if(onOpen.isCallable())
76 run_on_qt_thread({ onOpen.call({qjsEngine(
this)->newQObject(
this)}); });
79 catch(
const std::exception& e)
81 if(onError.isCallable())
83 run_on_qt_thread({ onError.call({QString::fromUtf8(e.what())}); });
93 m_observer = std::make_unique<libremidi::observer>(
94 libremidi::observer_configuration{}, libremidi::midi2::default_api());
97 auto ports = m_observer->get_input_ports();
101 if(onError.isCallable())
103 run_on_qt_thread({ onError.call({
"No UMP input ports available"}); });
111 catch(
const std::exception& e)
113 if(onError.isCallable())
115 run_on_qt_thread({ onError.call({QString::fromUtf8(e.what())}); });
128 if(onClose.isCallable())
130 run_on_qt_thread({ onClose.call(); });
143 void handleUMPMessage(
const libremidi::ump& message)
145 if(!onMessage.isCallable())
150 msg[
"timestamp"] = QVariant::fromValue(message.timestamp);
154 for(
int i = 0; i < 4; ++i)
156 words.append(
static_cast<quint32
>(message.data[i]));
158 msg[
"words"] = words;
161 ossia::qt::run_async(
this, [
this, msg]() {
162 if(onMessage.isCallable())
164 onMessage.call({qjsEngine(this)->toScriptValue(msg)});
166 }, Qt::AutoConnection);
169 std::unique_ptr<libremidi::observer> m_observer;
170 std::unique_ptr<libremidi::midi_in> m_ump_in;
171 std::atomic_bool m_is_open{
false};
Definition qml_device.cpp:43