1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-12 10:48:42 -04:00

UDP sink: implemented multicast join. Implements #610

This commit is contained in:
f4exb
2020-08-24 19:56:04 +02:00
parent 77051b87fd
commit 6d65bc74fc
9 changed files with 636 additions and 491 deletions
@@ -29,9 +29,11 @@ UDPSourceUDPHandler::UDPSourceUDPHandler() :
m_dataSocket(nullptr),
m_dataAddress(QHostAddress::LocalHost),
m_remoteAddress(QHostAddress::LocalHost),
m_multicastAddress(QStringLiteral("224.0.0.1")),
m_dataPort(9999),
m_remotePort(0),
m_dataConnected(false),
m_multicast(false),
m_udpDumpIndex(0),
m_nbUDPFrames(m_minNbUDPFrames),
m_nbAllocatedUDPFrames(m_minNbUDPFrames),
@@ -50,6 +52,7 @@ UDPSourceUDPHandler::UDPSourceUDPHandler() :
UDPSourceUDPHandler::~UDPSourceUDPHandler()
{
stop();
delete[] m_udpBuf;
}
@@ -65,9 +68,19 @@ void UDPSourceUDPHandler::start()
if (!m_dataConnected)
{
if (m_dataSocket->bind(m_dataAddress, m_dataPort))
if (m_dataSocket->bind(m_multicast ? QHostAddress::AnyIPv4 : m_dataAddress, m_dataPort, QUdpSocket::ShareAddress))
{
qDebug("UDPSourceUDPHandler::start: bind data socket to %s:%d", m_dataAddress.toString().toStdString().c_str(), m_dataPort);
if (m_multicast)
{
if (m_dataSocket->joinMulticastGroup(m_multicastAddress)) {
qDebug("UDPSourceUDPHandler::start: joined multicast group %s", qPrintable(m_multicastAddress.toString()));
} else {
qDebug("UDPSourceUDPHandler::start: failed joining multicast group %s", qPrintable(m_multicastAddress.toString()));
}
}
connect(m_dataSocket, SIGNAL(readyRead()), this, SLOT(dataReadyRead())); // , Qt::QueuedConnection gets stuck since Qt 5.8.0
m_dataConnected = true;
}
@@ -92,7 +105,7 @@ void UDPSourceUDPHandler::stop()
if (m_dataSocket)
{
delete m_dataSocket;
m_dataSocket = 0;
m_dataSocket = nullptr;
}
}
@@ -224,15 +237,20 @@ void UDPSourceUDPHandler::advanceReadPointer(int nbBytes)
}
}
void UDPSourceUDPHandler::configureUDPLink(const QString& address, quint16 port)
void UDPSourceUDPHandler::configureUDPLink(const QString& address, quint16 port, const QString& multicastAddress, bool multicastJoin)
{
Message* msg = MsgUDPAddressAndPort::create(address, port);
Message* msg = MsgUDPAddressAndPort::create(address, port, multicastAddress, multicastJoin);
m_inputMessageQueue.push(msg);
}
void UDPSourceUDPHandler::applyUDPLink(const QString& address, quint16 port)
void UDPSourceUDPHandler::applyUDPLink(const QString& address, quint16 port, const QString& multicastAddress, bool multicastJoin)
{
qDebug("UDPSourceUDPHandler::configureUDPLink: %s:%d", address.toStdString().c_str(), port);
qDebug() << "UDPSourceUDPHandler::configureUDPLink: "
<< " address: " << address
<< " port: " << port
<< " multicastAddress: " << multicastAddress
<< " multicastJoin: " << multicastJoin;
bool addressOK = m_dataAddress.setAddress(address);
if (!addressOK)
@@ -241,6 +259,15 @@ void UDPSourceUDPHandler::applyUDPLink(const QString& address, quint16 port)
m_dataAddress = QHostAddress::LocalHost;
}
m_multicast = multicastJoin;
addressOK = m_multicastAddress.setAddress(multicastAddress);
if (!addressOK)
{
qWarning("UDPSourceUDPHandler::configureUDPLink: invalid multicast address %s. disabling multicast.", address.toStdString().c_str());
m_multicast = false;
}
stop();
m_dataPort = port;
resetReadIndex();
@@ -291,7 +318,7 @@ bool UDPSourceUDPHandler::handleMessage(const Message& cmd)
if (UDPSourceUDPHandler::MsgUDPAddressAndPort::match(cmd))
{
UDPSourceUDPHandler::MsgUDPAddressAndPort& notif = (UDPSourceUDPHandler::MsgUDPAddressAndPort&) cmd;
applyUDPLink(notif.getAddress(), notif.getPort());
applyUDPLink(notif.getAddress(), notif.getPort(), notif.getMulticastAddress(), notif.getMulticastJoin());
return true;
}
else