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_midi_inbound_socket
37 ,
public Nano::Observer
39 W_OBJECT(qml_midi_inbound_socket)
43 std::atomic_bool alive{
true};
46 qml_midi_inbound_socket()
47 : m_state{std::make_shared<state>()}
51 ~qml_midi_inbound_socket()
53 m_state->alive =
false;
57 void open(
const libremidi::port_information& pi)
63 auto self = QPointer{
this};
65 libremidi::input_configuration config;
67 = [st, self](
const libremidi::message& message) {
73 msg[
"timestamp"] = QVariant::fromValue(message.timestamp);
77 for(
const auto&
byte : message.bytes)
79 bytes.append(
static_cast<int>(
byte));
89 if(self->onMessage.isCallable())
91 self->onMessage.call({qjsEngine(self.get())->toScriptValue(msg)});
96 config.ignore_sysex =
false;
97 config.ignore_timing =
false;
98 config.ignore_sensing =
true;
101 m_midi_in = std::make_unique<libremidi::midi_in>(config);
104 if(
auto err = m_midi_in->open_port(
static_cast<const libremidi::input_port&
>(pi));
105 err != stdx::error{})
107 if(onError.isCallable())
109 const auto& msg = err.message();
110 onError.call({QString::fromUtf8(msg.data(), msg.size())});
118 if(onOpen.isCallable())
120 onOpen.call({qjsEngine(
this)->newQObject(
this)});
123 catch(
const std::exception& e)
125 if(onError.isCallable())
127 onError.call({QString::fromUtf8(e.what())});
137 m_observer = std::make_unique<libremidi::observer>();
140 auto ports = m_observer->get_input_ports();
144 if(onError.isCallable())
146 onError.call({
"No MIDI input ports available"});
154 catch(
const std::exception& e)
156 if(onError.isCallable())
158 onError.call({QString::fromUtf8(e.what())});
171 if(onClose.isCallable())
186 std::shared_ptr<state> m_state;
187 std::unique_ptr<libremidi::observer> m_observer;
188 std::unique_ptr<libremidi::midi_in> m_midi_in;
189 std::atomic_bool m_is_open{
false};
Definition qml_device.cpp:43