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