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:
parent
ffb82f3029
commit
ef38fae104
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue