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