diff --git a/platform/qt/qsacnnode.cpp b/platform/qt/qsacnnode.cpp index c194dd4..5ff4c75 100644 --- a/platform/qt/qsacnnode.cpp +++ b/platform/qt/qsacnnode.cpp @@ -14,6 +14,7 @@ QSacnNode::QSacnNode(QObject *parent, QUuid cid) : Component(UUID::uuid(cid.toString().toStdString())) , QUdpSocket(parent) + , is_discovering_(false) { fctn_ = "OpenLCP QSacnNode"; @@ -31,6 +32,9 @@ QSacnNode::QSacnNode(QObject *parent, QUuid cid) */ QSacnNode::~QSacnNode() { + if (is_discovering_) + QSacnNode::unsubscribe(sACN::E131_DISCOVERY_UNIVERSE); + auto rx_list = rx_universes.keys(); for (const auto & num : rx_list) QSacnNode::unsubscribe(num); @@ -49,13 +53,26 @@ void QSacnNode::subscribe(const uint16_t num) { if (Receiver::universe(num)) // already subscribed return; - if (num != sACN::E131_DISCOVERY_UNIVERSE) + + switch (num) { + case sACN::E131_DISCOVERY_UNIVERSE: + { + if (is_discovering_) + return; + qDebug() << "Enabling sACN Discovery"; + is_discovering_ = true; + } + break; + default: { qDebug() << "Subscribing to universe" << QString::number(num); Receiver::subscribe(num); rx_universes.emplace(num, new QSacnUniverse(this, Receiver::universe(num))); emit subscribing(rx_universes.value(num)); } + break; + } + for (QNetworkInterface &iface : QNetworkInterface::allInterfaces()) joinMulticastGroup(IPv4MulticastAddress(num), iface); for (QNetworkInterface &iface : QNetworkInterface::allInterfaces()) @@ -69,17 +86,31 @@ void QSacnNode::subscribe(const uint16_t num) */ void QSacnNode::unsubscribe(const uint16_t num) { + switch (num) { + case sACN::E131_DISCOVERY_UNIVERSE: + { + if (!is_discovering_) + return; + qDebug() << "Disabling sACN Discovery"; + is_discovering_ = false; + } + break; + default: + { + if (Receiver::isSubscribed(num)) { + qDebug() << "Unsubscribing from universe " << QString::number(num); + emit unsubscribing(rx_universes.value(num)); + rx_universes.take(num)->deleteLater(); + Receiver::unsubscribe(num); + } + } + break; + } + for (QNetworkInterface &iface : QNetworkInterface::allInterfaces()) leaveMulticastGroup(IPv4MulticastAddress(num), iface); for (QNetworkInterface &iface : QNetworkInterface::allInterfaces()) leaveMulticastGroup(IPv6MulticastAddress(num), iface); - - if (Receiver::universe(num)) { - qDebug() << "Unsubscribing from universe " << QString::number(num); - emit unsubscribing(rx_universes.value(num)); - rx_universes.take(num)->deleteLater(); - Receiver::unsubscribe(num); - } } diff --git a/platform/qt/qsacnnode.h b/platform/qt/qsacnnode.h index 1b9b6cb..60e0844 100644 --- a/platform/qt/qsacnnode.h +++ b/platform/qt/qsacnnode.h @@ -29,6 +29,12 @@ public: QSacnUniverse* universe(const uint16_t u); QSacnUniverse* source(const uint16_t u); + /** + * @brief isDiscovering + * @return + */ + bool isDiscovering() const {return is_discovering_;} + public slots: void subscribe(const uint16_t) override; void unsubscribe(const uint16_t) override; @@ -48,6 +54,8 @@ private: QHash rx_universes; QHash tx_universes; + bool is_discovering_; + public: /// \cite sACN 9.3.1 Allocation of IPv4 Multicast Addresses ///