diff --git a/plugins/channeltx/udpsource/udpsource.cpp b/plugins/channeltx/udpsource/udpsource.cpp
index 764da4a16..73a99f532 100644
--- a/plugins/channeltx/udpsource/udpsource.cpp
+++ b/plugins/channeltx/udpsource/udpsource.cpp
@@ -153,6 +153,8 @@ void UDPSource::applySettings(const UDPSourceSettings& settings, bool force)
<< " m_amModFactor: " << settings.m_amModFactor
<< " m_udpAddressStr: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort
+ << " m_multicastAddress: " << settings.m_multicastAddress
+ << " m_multicastJoin: " << settings.m_multicastJoin
<< " m_channelMute: " << settings.m_channelMute
<< " m_gainIn: " << settings.m_gainIn
<< " m_gainOut: " << settings.m_gainOut
@@ -192,6 +194,12 @@ void UDPSource::applySettings(const UDPSourceSettings& settings, bool force)
if ((settings.m_udpPort != m_settings.m_udpPort) || force) {
reverseAPIKeys.append("udpPort");
}
+ if ((settings.m_multicastAddress != m_settings.m_multicastAddress) || force) {
+ reverseAPIKeys.append("multicastAddress");
+ }
+ if ((settings.m_multicastJoin != m_settings.m_multicastJoin) || force) {
+ reverseAPIKeys.append("multicastJoin");
+ }
if ((settings.m_channelMute != m_settings.m_channelMute) || force) {
reverseAPIKeys.append("channelMute");
}
diff --git a/plugins/channeltx/udpsource/udpsourcegui.cpp b/plugins/channeltx/udpsource/udpsourcegui.cpp
index e1b8f9b28..eed1ebc90 100644
--- a/plugins/channeltx/udpsource/udpsourcegui.cpp
+++ b/plugins/channeltx/udpsource/udpsourcegui.cpp
@@ -162,7 +162,7 @@ UDPSourceGUI::UDPSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb
m_channelMarker.setBandwidth(16000);
m_channelMarker.setCenterFrequency(0);
m_channelMarker.setColor(m_settings.m_rgbColor);
- m_channelMarker.setTitle("UDP Sample Sink");
+ m_channelMarker.setTitle("UDP Sample Source");
m_channelMarker.setSourceOrSinkStream(false);
m_channelMarker.blockSignals(false);
m_channelMarker.setVisible(true); // activate signal on the last setting only
@@ -257,6 +257,8 @@ void UDPSourceGUI::displaySettings()
ui->localUDPAddress->setText(m_settings.m_udpAddress);
ui->localUDPPort->setText(tr("%1").arg(m_settings.m_udpPort));
+ ui->multicastAddress->setText(m_settings.m_multicastAddress);
+ ui->multicastJoin->setChecked(m_settings.m_multicastJoin);
ui->applyBtn->setEnabled(false);
ui->applyBtn->setStyleSheet("QPushButton { background:rgb(79,79,79); }");
@@ -330,6 +332,20 @@ void UDPSourceGUI::on_localUDPPort_editingFinished()
ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
}
+void UDPSourceGUI::on_multicastAddress_editingFinished()
+{
+ m_settings.m_multicastAddress = ui->multicastAddress->text();
+ ui->applyBtn->setEnabled(true);
+ ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
+}
+
+void UDPSourceGUI::on_multicastJoin_toggled(bool checked)
+{
+ m_settings.m_multicastJoin = checked;
+ ui->applyBtn->setEnabled(true);
+ ui->applyBtn->setStyleSheet("QPushButton { background-color : green; }");
+}
+
void UDPSourceGUI::on_sampleRate_textEdited(const QString& arg1)
{
(void) arg1;
diff --git a/plugins/channeltx/udpsource/udpsourcegui.h b/plugins/channeltx/udpsource/udpsourcegui.h
index b521c6125..a8980023a 100644
--- a/plugins/channeltx/udpsource/udpsourcegui.h
+++ b/plugins/channeltx/udpsource/udpsourcegui.h
@@ -94,6 +94,8 @@ private slots:
void on_sampleFormat_currentIndexChanged(int index);
void on_localUDPAddress_editingFinished();
void on_localUDPPort_editingFinished();
+ void on_multicastAddress_editingFinished();
+ void on_multicastJoin_toggled(bool checked);
void on_sampleRate_textEdited(const QString& arg1);
void on_rfBandwidth_textEdited(const QString& arg1);
void on_fmDeviation_textEdited(const QString& arg1);
diff --git a/plugins/channeltx/udpsource/udpsourcegui.ui b/plugins/channeltx/udpsource/udpsourcegui.ui
index 245163d9e..06cbb7673 100644
--- a/plugins/channeltx/udpsource/udpsourcegui.ui
+++ b/plugins/channeltx/udpsource/udpsourcegui.ui
@@ -43,7 +43,7 @@
2
2
390
- 141
+ 221
@@ -71,320 +71,210 @@
3
- -
-
+
-
+
-
-
+
+
+ FMd
+
+
+
+ -
+
+
+ FM deviation in Hz
+
+
+ 00000
+
+
+ 2500
+
+
+
+ -
+
+
+ AM%
+
+
+
+ -
+
- 36
+ 26
0
-
- SRin
-
-
-
- -
-
- Input sample rate (S/s)
+ Percentage of AM modulation
- 0009999
+ 000
- 48000
+ 95
- -
-
+
-
+
+
+ 2
+
-
-
-
+
+
- 40
- 0
+ 16
+ 16777215
- RFBW
+ Df
-
-
-
- Signal bandwidth (Hz)
-
-
- 0009999
-
-
- 32000
-
-
-
-
-
- -
-
-
-
-
-
-
- 16777215
- 12
-
-
-
- Main buffer read/write positions unbalance: write lags read leads
-
-
- 50
-
-
- 0
-
-
- false
-
-
- true
-
-
- %v
-
-
-
- -
-
-
-
- 2
- 14
-
-
-
- .
-
-
-
- -
-
-
-
- 16777215
- 12
-
-
-
- Main buffer read/write positions unbalance: read lags write leads
-
-
- 50
-
-
- 0
-
-
- false
-
-
-
-
-
- -
-
-
-
-
+
-
+
0
0
+
+
+ 32
+ 16
+
+
Liberation Mono
+ 12
+
+
+
+ PointingHandCursor
+
+
+ Qt::StrongFocus
+
+
+ Modulator shift frequency from center in Hz
+
+
+
+ -
+
+
+
+
+
+
+
+ 26
+ 26
+ 26
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+
+
+ 26
+ 26
+ 26
+
+
+
+
+
+
+
+
+ 26
+ 26
+ 26
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+
+
+ 26
+ 26
+ 26
+
+
+
+
+
+
+
+
+ 118
+ 118
+ 117
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+
+
+ 26
+ 26
+ 26
+
+
+
+
+
+
+
+
8
-
- Amplitude meter in % of maximum
-
-
-
-
-
- -
-
-
-
-
- Gi
+ Hz
-
-
-
-
- 22
- 22
-
-
-
- 100
-
-
- 1
-
-
- 1
-
-
- 10
-
-
-
- -
-
-
-
- 32
- 0
-
-
-
- 10.0
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- Go
-
-
-
- -
-
-
-
- 22
- 22
-
-
-
- 100
-
-
- 1
-
-
- 10
-
-
-
- -
-
-
-
- 32
- 0
-
-
-
- Linear gain value
-
-
- 10.0
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 22
- 0
-
-
-
- R/W pointers offset from optimal (%)
-
-
- -00
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
- 0
- 22
-
-
-
-
- 22
- 16777215
-
-
-
- Reset UDP buffer index
-
-
- R
-
-
-
- -
-
-
-
- 0
- 22
-
-
-
-
- 22
- 16777215
-
-
-
- Automatic R/W balance compensation
-
-
- G
-
-
- true
-
-
-
- -
-
+
Qt::Horizontal
@@ -398,7 +288,7 @@
- -
+
-
-
@@ -497,76 +387,7 @@
- -
-
-
-
-
-
- FMd
-
-
-
- -
-
-
- FM deviation in Hz
-
-
- 00000
-
-
- 2500
-
-
-
- -
-
-
- AM%
-
-
-
- -
-
-
-
- 26
- 0
-
-
-
- Percentage of AM modulation
-
-
- 000
-
-
- 95
-
-
-
- -
-
-
- false
-
-
-
- 60
- 16777215
-
-
-
- Apply text input and/or samples format
-
-
- Apply
-
-
-
-
-
- -
+
-
-
@@ -645,143 +466,33 @@
- -
-
-
- 2
-
+
-
+
-
-
-
-
- 16
- 16777215
-
-
-
- Df
-
-
-
- -
-
-
-
- 0
- 0
-
-
+
- 32
- 16
+ 40
+ 0
-
-
- Liberation Mono
- 12
-
-
-
- PointingHandCursor
-
-
- Qt::StrongFocus
-
-
- Modulator shift frequency from center in Hz
-
-
-
- -
-
-
-
-
-
-
-
- 26
- 26
- 26
-
-
-
-
-
-
- 255
- 255
- 255
-
-
-
-
-
-
-
-
- 26
- 26
- 26
-
-
-
-
-
-
- 255
- 255
- 255
-
-
-
-
-
-
-
-
- 118
- 118
- 117
-
-
-
-
-
-
- 255
- 255
- 255
-
-
-
-
-
-
-
-
- 8
-
-
- Hz
+ RFBW
-
-
-
- Qt::Horizontal
+
+
+ Signal bandwidth (Hz)
-
-
- 40
- 20
-
+
+ 0009999
-
+
+ 32000
+
+
@@ -881,7 +592,37 @@
- -
+
-
+
+
-
+
+
+
+ 36
+ 0
+
+
+
+ SRin
+
+
+
+ -
+
+
+ Input sample rate (S/s)
+
+
+ 0009999
+
+
+ 48000
+
+
+
+
+
+ -
-
@@ -951,14 +692,344 @@
+ -
+
+
-
+
+
+ Join or leave multicast group
+
+
+ MCAST
+
+
+
+ -
+
+
+
+ 110
+ 0
+
+
+
+
+ 110
+ 16777215
+
+
+
+ Qt::ClickFocus
+
+
+ Multicast group address
+
+
+ 000.000.000.000
+
+
+ 224.0.0.1
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
-
+
+
+ Gi
+
+
+
+ -
+
+
+
+ 22
+ 22
+
+
+
+ 100
+
+
+ 1
+
+
+ 1
+
+
+ 10
+
+
+
+ -
+
+
+
+ 32
+ 0
+
+
+
+ 10.0
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Go
+
+
+
+ -
+
+
+
+ 22
+ 22
+
+
+
+ 100
+
+
+ 1
+
+
+ 10
+
+
+
+ -
+
+
+
+ 32
+ 0
+
+
+
+ Linear gain value
+
+
+ 10.0
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 24
+
+
+
+
+ Liberation Mono
+ 8
+
+
+
+ Amplitude meter in % of maximum
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 16777215
+ 12
+
+
+
+ Main buffer read/write positions unbalance: write lags read leads
+
+
+ 50
+
+
+ 0
+
+
+ false
+
+
+ true
+
+
+ %v
+
+
+
+ -
+
+
+
+ 2
+ 14
+
+
+
+ .
+
+
+
+ -
+
+
+
+ 16777215
+ 12
+
+
+
+ Main buffer read/write positions unbalance: read lags write leads
+
+
+ 50
+
+
+ 0
+
+
+ false
+
+
+
+ -
+
+
+
+ 22
+ 0
+
+
+
+ R/W pointers offset from optimal (%)
+
+
+ -00
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 22
+
+
+
+
+ 22
+ 16777215
+
+
+
+ Reset UDP buffer index
+
+
+ R
+
+
+
+ -
+
+
+
+ 0
+ 22
+
+
+
+
+ 22
+ 16777215
+
+
+
+ Automatic R/W balance compensation
+
+
+ G
+
+
+ true
+
+
+
+ -
+
+
+ false
+
+
+
+ 60
+ 16777215
+
+
+
+ Apply text input and/or samples format
+
+
+ Apply
+
+
+
+
+
- 15
- 160
- 321
+ 0
+ 230
+ 391
156
diff --git a/plugins/channeltx/udpsource/udpsourcesettings.cpp b/plugins/channeltx/udpsource/udpsourcesettings.cpp
index 52c3d5642..03ef81d69 100644
--- a/plugins/channeltx/udpsource/udpsourcesettings.cpp
+++ b/plugins/channeltx/udpsource/udpsourcesettings.cpp
@@ -49,6 +49,8 @@ void UDPSourceSettings::resetToDefaults()
m_squelchEnabled = true;
m_udpAddress = "127.0.0.1";
m_udpPort = 9998;
+ m_multicastAddress = "224.0.0.1";
+ m_multicastJoin = false;
m_rgbColor = QColor(225, 25, 99).rgb();
m_title = "UDP Sample Source";
m_streamIndex = 0;
@@ -75,6 +77,8 @@ QByteArray UDPSourceSettings::serialize() const
s.writeBlob(7, m_spectrumGUI->serialize());
}
+ s.writeString(8, m_multicastAddress);
+ s.writeBool(9, m_multicastJoin);
s.writeS32(10, roundf(m_gainOut * 10.0));
s.writeS32(11, m_fmDeviation);
s.writeReal(12, m_amModFactor);
@@ -139,6 +143,8 @@ bool UDPSourceSettings::deserialize(const QByteArray& data)
m_spectrumGUI->deserialize(bytetmp);
}
+ d.readString(8, &m_multicastAddress, "224.0.0.1");
+ d.readBool(9, &m_multicastJoin, false);
d.readS32(10, &s32tmp, 10);
m_gainOut = s32tmp / 10.0;
@@ -167,7 +173,7 @@ bool UDPSourceSettings::deserialize(const QByteArray& data)
m_udpPort = 9998;
}
- d.readString(20, &m_title, "UDP Sample Sink");
+ d.readString(20, &m_title, "UDP Sample Source");
d.readBool(21, &m_useReverseAPI, false);
d.readString(22, &m_reverseAPIAddress, "127.0.0.1");
diff --git a/plugins/channeltx/udpsource/udpsourcesettings.h b/plugins/channeltx/udpsource/udpsourcesettings.h
index 91ee64b32..b06d152f6 100644
--- a/plugins/channeltx/udpsource/udpsourcesettings.h
+++ b/plugins/channeltx/udpsource/udpsourcesettings.h
@@ -56,6 +56,8 @@ struct UDPSourceSettings
QString m_udpAddress;
uint16_t m_udpPort;
+ QString m_multicastAddress;
+ bool m_multicastJoin;
QString m_title;
int m_streamIndex;
diff --git a/plugins/channeltx/udpsource/udpsourcesource.cpp b/plugins/channeltx/udpsource/udpsourcesource.cpp
index aa264fe1b..366b4ef30 100644
--- a/plugins/channeltx/udpsource/udpsourcesource.cpp
+++ b/plugins/channeltx/udpsource/udpsourcesource.cpp
@@ -338,6 +338,8 @@ void UDPSourceSource::applySettings(const UDPSourceSettings& settings, bool forc
<< " m_amModFactor: " << settings.m_amModFactor
<< " m_udpAddressStr: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort
+ << " m_multicastAddress: " << settings.m_multicastAddress
+ << " m_multicastJoin: " << settings.m_multicastJoin
<< " m_channelMute: " << settings.m_channelMute
<< " m_gainIn: " << settings.m_gainIn
<< " m_gainOut: " << settings.m_gainOut
@@ -385,9 +387,11 @@ void UDPSourceSource::applySettings(const UDPSourceSettings& settings, bool forc
}
if ((settings.m_udpAddress != m_settings.m_udpAddress) ||
- (settings.m_udpPort != m_settings.m_udpPort) || force)
+ (settings.m_udpPort != m_settings.m_udpPort) ||
+ (settings.m_multicastAddress != m_settings.m_multicastAddress) ||
+ (settings.m_multicastJoin != m_settings.m_multicastJoin) || force)
{
- m_udpHandler.configureUDPLink(settings.m_udpAddress, settings.m_udpPort);
+ m_udpHandler.configureUDPLink(settings.m_udpAddress, settings.m_udpPort, settings.m_multicastAddress, settings.m_multicastJoin);
}
if ((settings.m_channelMute != m_settings.m_channelMute) || force)
diff --git a/plugins/channeltx/udpsource/udpsourceudphandler.cpp b/plugins/channeltx/udpsource/udpsourceudphandler.cpp
index 218cbd576..f514fffe0 100644
--- a/plugins/channeltx/udpsource/udpsourceudphandler.cpp
+++ b/plugins/channeltx/udpsource/udpsourceudphandler.cpp
@@ -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
diff --git a/plugins/channeltx/udpsource/udpsourceudphandler.h b/plugins/channeltx/udpsource/udpsourceudphandler.h
index 964fce5c9..89e600ab7 100644
--- a/plugins/channeltx/udpsource/udpsourceudphandler.h
+++ b/plugins/channeltx/udpsource/udpsourceudphandler.h
@@ -37,7 +37,8 @@ public:
void start();
void stop();
- void configureUDPLink(const QString& address, quint16 port);
+ void configureUDPLink(const QString& address, quint16 port, const QString& multicastAddress, bool multicastJoin);
+ void configureMulticastAddress(const QString& address);
void resetReadIndex();
void resizeBuffer(float sampleRate);
@@ -71,20 +72,26 @@ private:
public:
const QString& getAddress() const { return m_address; }
quint16 getPort() const { return m_port; }
+ const QString& getMulticastAddress() const { return m_multicastAddress; }
+ bool getMulticastJoin() const { return m_multicastJoin; }
- static MsgUDPAddressAndPort* create(QString address, quint16 port)
+ static MsgUDPAddressAndPort* create(const QString& address, quint16 port, const QString& multicastAddress, bool multicastJoin)
{
- return new MsgUDPAddressAndPort(address, port);
+ return new MsgUDPAddressAndPort(address, port, multicastAddress, multicastJoin);
}
private:
QString m_address;
quint16 m_port;
+ QString m_multicastAddress;
+ bool m_multicastJoin;
- MsgUDPAddressAndPort(QString address, quint16 port) :
+ MsgUDPAddressAndPort(const QString& address, quint16 port, const QString& multicastAddress, bool multicastJoin) :
Message(),
m_address(address),
- m_port(port)
+ m_port(port),
+ m_multicastAddress(multicastAddress),
+ m_multicastJoin(multicastJoin)
{ }
};
@@ -92,15 +99,17 @@ private:
void moveData(char *blk);
void advanceReadPointer(int nbBytes);
- void applyUDPLink(const QString& address, quint16 port);
+ void applyUDPLink(const QString& address, quint16 port, const QString& multicastAddress, bool muticastJoin);
bool handleMessage(const Message& message);
QUdpSocket *m_dataSocket;
QHostAddress m_dataAddress;
QHostAddress m_remoteAddress;
+ QHostAddress m_multicastAddress;
quint16 m_dataPort;
quint16 m_remotePort;
bool m_dataConnected;
+ bool m_multicast;
udpBlk_t *m_udpBuf;
char m_udpDump[m_udpBlockSize + 8192]; // UDP block size + largest possible block
int m_udpDumpIndex;