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)
|
QSacnNode::QSacnNode(QObject *parent, QUuid cid)
|
||||||
: Component(UUID::uuid(cid.toString().toStdString()))
|
: Component(UUID::uuid(cid.toString().toStdString()))
|
||||||
, QUdpSocket(parent)
|
, QUdpSocket(parent)
|
||||||
|
, is_discovering_(false)
|
||||||
{
|
{
|
||||||
fctn_ = "OpenLCP QSacnNode";
|
fctn_ = "OpenLCP QSacnNode";
|
||||||
|
|
||||||
@ -31,6 +32,9 @@ QSacnNode::QSacnNode(QObject *parent, QUuid cid)
|
|||||||
*/
|
*/
|
||||||
QSacnNode::~QSacnNode()
|
QSacnNode::~QSacnNode()
|
||||||
{
|
{
|
||||||
|
if (is_discovering_)
|
||||||
|
QSacnNode::unsubscribe(sACN::E131_DISCOVERY_UNIVERSE);
|
||||||
|
|
||||||
auto rx_list = rx_universes.keys();
|
auto rx_list = rx_universes.keys();
|
||||||
for (const auto & num : rx_list)
|
for (const auto & num : rx_list)
|
||||||
QSacnNode::unsubscribe(num);
|
QSacnNode::unsubscribe(num);
|
||||||
@ -49,13 +53,26 @@ void QSacnNode::subscribe(const uint16_t num)
|
|||||||
{
|
{
|
||||||
if (Receiver::universe(num)) // already subscribed
|
if (Receiver::universe(num)) // already subscribed
|
||||||
return;
|
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);
|
qDebug() << "Subscribing to universe" << QString::number(num);
|
||||||
Receiver::subscribe(num);
|
Receiver::subscribe(num);
|
||||||
rx_universes.emplace(num, new QSacnUniverse(this, Receiver::universe(num)));
|
rx_universes.emplace(num, new QSacnUniverse(this, Receiver::universe(num)));
|
||||||
emit subscribing(rx_universes.value(num));
|
emit subscribing(rx_universes.value(num));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
||||||
joinMulticastGroup(IPv4MulticastAddress(num), iface);
|
joinMulticastGroup(IPv4MulticastAddress(num), iface);
|
||||||
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
||||||
@ -69,17 +86,31 @@ void QSacnNode::subscribe(const uint16_t num)
|
|||||||
*/
|
*/
|
||||||
void QSacnNode::unsubscribe(const uint16_t num)
|
void QSacnNode::unsubscribe(const uint16_t num)
|
||||||
{
|
{
|
||||||
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
switch (num) {
|
||||||
leaveMulticastGroup(IPv4MulticastAddress(num), iface);
|
case sACN::E131_DISCOVERY_UNIVERSE:
|
||||||
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
{
|
||||||
leaveMulticastGroup(IPv6MulticastAddress(num), iface);
|
if (!is_discovering_)
|
||||||
|
return;
|
||||||
if (Receiver::universe(num)) {
|
qDebug() << "Disabling sACN Discovery";
|
||||||
|
is_discovering_ = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (Receiver::isSubscribed(num)) {
|
||||||
qDebug() << "Unsubscribing from universe " << QString::number(num);
|
qDebug() << "Unsubscribing from universe " << QString::number(num);
|
||||||
emit unsubscribing(rx_universes.value(num));
|
emit unsubscribing(rx_universes.value(num));
|
||||||
rx_universes.take(num)->deleteLater();
|
rx_universes.take(num)->deleteLater();
|
||||||
Receiver::unsubscribe(num);
|
Receiver::unsubscribe(num);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
||||||
|
leaveMulticastGroup(IPv4MulticastAddress(num), iface);
|
||||||
|
for (QNetworkInterface &iface : QNetworkInterface::allInterfaces())
|
||||||
|
leaveMulticastGroup(IPv6MulticastAddress(num), iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,6 +29,12 @@ public:
|
|||||||
QSacnUniverse* universe(const uint16_t u);
|
QSacnUniverse* universe(const uint16_t u);
|
||||||
QSacnUniverse* source(const uint16_t u);
|
QSacnUniverse* source(const uint16_t u);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief isDiscovering
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool isDiscovering() const {return is_discovering_;}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void subscribe(const uint16_t) override;
|
void subscribe(const uint16_t) override;
|
||||||
void unsubscribe(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*> rx_universes;
|
||||||
QHash<uint16_t, QSacnUniverse*> tx_universes;
|
QHash<uint16_t, QSacnUniverse*> tx_universes;
|
||||||
|
|
||||||
|
bool is_discovering_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// \cite sACN 9.3.1 Allocation of IPv4 Multicast Addresses
|
/// \cite sACN 9.3.1 Allocation of IPv4 Multicast Addresses
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user