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)
41 qml_midi_inbound_socket() { }
43 ~qml_midi_inbound_socket() { close(); }
45 void open(
const libremidi::port_information& pi)
50 libremidi::input_configuration config;
52 = [
this](
const libremidi::message& message) { handleMidiMessage(message); };
53 config.ignore_sysex =
false;
54 config.ignore_timing =
false;
55 config.ignore_sensing =
true;
58 m_midi_in = std::make_unique<libremidi::midi_in>(config);
61 if(
auto err = m_midi_in->open_port(
static_cast<const libremidi::input_port&
>(pi));
64 if(onError.isCallable())
66 const auto& msg = err.message();
68 { onError.call({QString::fromUtf8(msg.data(), msg.size())}); });
76 if(onOpen.isCallable())
78 run_on_qt_thread({ onOpen.call({qjsEngine(
this)->newQObject(
this)}); });
81 catch(
const std::exception& e)
83 if(onError.isCallable())
85 run_on_qt_thread({ onError.call({QString::fromUtf8(e.what())}); });
95 m_observer = std::make_unique<libremidi::observer>();
98 auto ports = m_observer->get_input_ports();
102 if(onError.isCallable())
104 run_on_qt_thread({ onError.call({
"No MIDI input ports available"}); });
112 catch(
const std::exception& e)
114 if(onError.isCallable())
116 run_on_qt_thread({ onError.call({QString::fromUtf8(e.what())}); });
129 if(onClose.isCallable())
131 run_on_qt_thread({ onClose.call(); });
144 void handleMidiMessage(
const libremidi::message& message)
146 if(!onMessage.isCallable())
151 msg[
"timestamp"] = QVariant::fromValue(message.timestamp);
155 for(
const auto&
byte : message.bytes)
157 bytes.append(
static_cast<int>(
byte));
159 msg[
"bytes"] = bytes;
162 ossia::qt::run_async(
this, [
this, msg]() {
163 if(onMessage.isCallable())
165 onMessage.call({qjsEngine(this)->toScriptValue(msg)});
167 }, Qt::AutoConnection);
170 std::unique_ptr<libremidi::observer> m_observer;
171 std::unique_ptr<libremidi::midi_in> m_midi_in;
172 std::atomic_bool m_is_open{
false};
Definition qml_device.cpp:43