#include "qsacnnode.h" #include #include namespace SACN { QSacnNode::QSacnNode(QUuid cid) : Appliance(UUID::uuid(cid.toString().toStdString())) , Node() { bind(QHostAddress::AnyIPv4, ACN_SDT_MULTICAST_PORT); connect(this, &QUdpSocket::readyRead, this, &QSacnNode::UdpStreamHandler); onDiscovered(std::bind(&QSacnNode::emitFound, this, std::placeholders::_1)); } void QSacnNode::subscribe(const uint16_t num) { if (universe(num)) // already subscribed return; qDebug() << "Subscribing to universe" << QString::number(num); Receiver::subscribe(num); joinMulticastGroup(IPv4MulticastAddress(num)); } void QSacnNode::unsubscribe(const uint16_t num) { if (!universe(num)) // not subscribed return; qDebug() << "Unsubscribing from universe " << QString::number(num); leaveMulticastGroup(IPv4MulticastAddress(num)); Receiver::unsubscribe(num); } void QSacnNode::UdpStreamHandler() { while (hasPendingDatagrams()) { qDebug() << "processing UDP datagram..."; QNetworkDatagram datagram = receiveDatagram(); // Expecting IANA registered Session Data Transport traffic if (datagram.destinationPort() != ACN_SDT_MULTICAST_PORT) return; // wrap a PDU io stream around the QNetworkDatagram data buffer PDU::Stream stream(new PDU::pdu_stream( (uint8_t*)datagram.data().constData(), datagram.data().length())); Appliance::UdpStreamHandler(stream); } } // wrap callback to Qt signal void QSacnNode::emitFound( std::shared_ptr univ) { qDebug() << "found universe " << QString::number(univ->universe()); emit foundUniverse(univ); } } // SACN