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)
43 std::atomic_bool alive{
true};
46 qml_ump_inbound_socket()
47 : m_state{std::make_shared<state>()}
51 ~qml_ump_inbound_socket()
53 m_state->alive =
false;
57 void open(
const libremidi::port_information& pi)
63 auto self = QPointer{
this};
65 libremidi::ump_input_configuration config;
67 = [st, self](
const libremidi::ump& message) {
73 msg[
"timestamp"] = QVariant::fromValue(message.timestamp);
77 for(
int i = 0; i < 4; ++i)
79 words.append(
static_cast<quint32
>(message.data[i]));
89 if(self->onMessage.isCallable())
91 self->onMessage.call({qjsEngine(self.get())->toScriptValue(msg)});
98 m_ump_in = std::make_unique<libremidi::midi_in>(
99 config, libremidi::midi2::default_api());
102 if(
auto err = m_ump_in->open_port(
static_cast<const libremidi::input_port&
>(pi));
103 err != stdx::error{})
105 if(onError.isCallable())
107 const auto& msg = err.message();
108 onError.call({QString::fromUtf8(msg.data(), msg.size())});
116 if(onOpen.isCallable())
118 onOpen.call({qjsEngine(
this)->newQObject(
this)});
121 catch(
const std::exception& e)
123 if(onError.isCallable())
125 onError.call({QString::fromUtf8(e.what())});
135 m_observer = std::make_unique<libremidi::observer>(
136 libremidi::observer_configuration{}, libremidi::midi2::default_api());
139 auto ports = m_observer->get_input_ports();
143 if(onError.isCallable())
145 onError.call({
"No UMP input ports available"});
153 catch(
const std::exception& e)
155 if(onError.isCallable())
157 onError.call({QString::fromUtf8(e.what())});
170 if(onClose.isCallable())
185 std::shared_ptr<state> m_state;
186 std::unique_ptr<libremidi::observer> m_observer;
187 std::unique_ptr<libremidi::midi_in> m_ump_in;
188 std::atomic_bool m_is_open{
false};
Definition qml_device.cpp:43