diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2023-03-21 17:33:41 +0100 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-04-13 23:55:27 +0200 | 
| commit | 051fb2f94f6364b80219a3c671bb953d2e54a140 (patch) | |
| tree | d76351f995884acbada1e26b5fe869daf5f4a8a1 /proto-osc/proto.cpp | |
| parent | 94e7374bad0da0d9d132401bd57526b509497c7d (diff) | |
proto/osc: add open sound control output method
Diffstat (limited to 'proto-osc/proto.cpp')
| -rw-r--r-- | proto-osc/proto.cpp | 54 | 
1 files changed, 54 insertions, 0 deletions
| diff --git a/proto-osc/proto.cpp b/proto-osc/proto.cpp new file mode 100644 index 00000000..2f90957c --- /dev/null +++ b/proto-osc/proto.cpp @@ -0,0 +1,54 @@ +#include "proto.hpp" +#include "ui_dialog.h" +#include "api/plugin-api.hpp" +#include <QQuaternion> +#include <QHostAddress> +#include "osc/OscOutboundPacketStream.h" + +osc_proto::osc_proto() +{ +    auto reload_fn = [this] { +        dest = QHostAddress{s.address }; +        port = (unsigned short)s.port; +    }; +    connect(&*s.b, &bundle_::changed, this, reload_fn); +    connect(&*s.b, &bundle_::reloading, this, reload_fn); +} + +void osc_proto::pose(const double* data, const double*) +{ +    if (dest.isNull()) +        return; + +    static constexpr unsigned buffer_size = 1024; +    char buffer[buffer_size] = {}; +    osc::OutboundPacketStream p{buffer, buffer_size}; +    auto q = QQuaternion::fromEulerAngles((float)data[Pitch], (float)data[Yaw], (float)-data[Roll]).normalized(); +    p << osc::BeginMessage("/bridge/quat") << q.scalar() << q.x() << q.y() << q.z() << osc::EndMessage; +    sock.writeDatagram(p.Data(), (int)p.Size(), dest, port); +} + +module_status osc_proto::initialize() +{ +    QString error; + +    dest = QHostAddress{s.address }; +    port = (unsigned short)s.port; + +    if (dest.isNull()) +    { +        error = tr("Invalid destination address '%1'").arg(s.address); +        goto fail; +    } + +    if (!sock.bind()) +    { +        error = tr("Error binding socket to INADDR_ANY"); +        goto fail; +    } + +    return status_ok(); + +fail: +    return { tr("%1: %2").arg(error, sock.errorString()) }; +} | 
