1
0
Fork 0

Without a way to query the subscription state of an IGMP group, use a boolean to track the state of sACN discovery.

This commit is contained in:
Kevin Matz 2022-11-19 12:24:46 -05:00
parent ffb82f3029
commit ef38fae104
2 changed files with 47 additions and 8 deletions

View File

@ -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);
}
}

View File

@ -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<uint16_t, QSacnUniverse*> rx_universes;
QHash<uint16_t, QSacnUniverse*> tx_universes;
bool is_discovering_;
public:
/// \cite sACN 9.3.1 Allocation of IPv4 Multicast Addresses
///