diff --git a/libmueb.ini b/libmueb.ini index ddf5847589263cab4becbf54b8cfd63f67313ac7..0acd1a44f9f6f5be0f832cef0bc3ee927edc46cf 100644 --- a/libmueb.ini +++ b/libmueb.ini @@ -14,10 +14,8 @@ color_depth=3 ; Network protocol specific constants. [network] -broadcast_animation_port=50001 -; Enables debug mode, sets target_address to localhost (127.0.0.1). -debug_mode=false -; Must be a broadcast or multicast address when debug_mode=false otherwise could be empty. +animation_port=50001 +; Could be any valid IP(v4/v6) address: broadcast, multicast, unicast, localhost etc. target_address=10.6.255.255 ; The number of windows divided by max_windows_per_datagram must be an integer. ; max_windows_per_datagram must be less than the number of windows. diff --git a/src/configuration.cc b/src/configuration.cc index 1ae26b22d864af42b2de224dcd0fcc99ab93594f..1277886d295d8dc5f791231e41d08f5a4d334c0e 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -52,6 +52,11 @@ Configuration::Configuration() { quint32 window_byte_size = (color_depth_ >= 3 && color_depth_ < 5) ? pixels_per_window * kRgbByteSize / 2 : pixels_per_window * kRgbByteSize; + if (target_address_.isMulticast()) { + multicast_interface_ = QNetworkInterface::interfaceFromName( + settings.value("multicast_interface").toString()); + } + quint32 max_windows_per_datagram = settings.value("max_windows_per_datagram", windows).toUInt(); packet_header_size_ = 2; @@ -68,7 +73,12 @@ Configuration::Configuration() { if (settings.status() != QSettings::NoError || vertical_pixel_unit % 2 != 0 || horizontal_pixel_unit % 2 != 0 || color_depth_ < 3 || color_depth_ > 8 || animation_port_ < 0 || windows % max_windows_per_datagram != 0 || - packet_size_ > 1472) { + packet_size_ > 1472 || + (target_address_.isMulticast() && !multicast_interface_.isValid())) { + if (target_address_.isMulticast()) { + qInfo() << "[Configuration] Possible multicast interfaces:" + << QNetworkInterface::allInterfaces(); + } qFatal("[Configuration] Configuration error aborting!"); } } @@ -109,4 +119,8 @@ quint8 Configuration::max_packet_number() const { return max_packet_number_; } quint8 Configuration::color_depth() const { return color_depth_; } +QNetworkInterface Configuration::multicast_interface() const { + return multicast_interface_; +} + } // namespace libmueb diff --git a/src/configuration.h b/src/configuration.h index e71fd7d5cdf0e2e2687a45e6fcc30b395e04ba62..3b8eeff78c3ce9c0519db656f384ba65faf1f61f 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -3,6 +3,7 @@ #include <QHostAddress> #include <QImage> +#include <QNetworkInterface> #include <QObject> #include <QSettings> #include <QtGlobal> @@ -41,8 +42,11 @@ class Configuration final { quint8 color_depth() const; + QNetworkInterface multicast_interface() const; + private: QImage frame_; + QNetworkInterface multicast_interface_; QHostAddress target_address_; quint32 pixels_; quint32 packet_header_size_; diff --git a/src/muebreceiver.cc b/src/muebreceiver.cc index 9092f13bd91f6d8d65fc83ce4a2b6263ca4316db..e85fe1863f6e44b5f6e3f25f01c8040b5a777a11 100644 --- a/src/muebreceiver.cc +++ b/src/muebreceiver.cc @@ -64,13 +64,9 @@ void MuebReceiver::ReadPendingDatagrams() { // Uncompress 1 byte into 2 color components if (d->configuration_.color_depth() < 5) { for (auto &i : data) { - *frame_begin = i & 0xf0; - *frame_begin <<= - Configuration::kFactor - d->configuration_.color_depth(); + *frame_begin = (i & 0xf0) << Configuration::kFactor - d->configuration_.color_depth(); frame_begin++; - *frame_begin = (i & 0x0f) << Configuration::kFactor; - *frame_begin <<= - Configuration::kFactor - d->configuration_.color_depth(); + *frame_begin = (i & 0x0f) << (Configuration::kFactor + Configuration::kFactor - d->configuration_.color_depth()); frame_begin++; } // No compression diff --git a/src/muebreceiver_p.h b/src/muebreceiver_p.h index 81a8448f86cb8065fcd88973e6de2d982113f151..4faaf8557010118ac508ce6560a45d3a03da4e62 100644 --- a/src/muebreceiver_p.h +++ b/src/muebreceiver_p.h @@ -27,7 +27,8 @@ class MuebReceiverPrivate { QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint); if (configuration_.target_address().isMulticast()) { - socket_.joinMulticastGroup(configuration_.target_address()); + socket_.joinMulticastGroup(configuration_.target_address(), + configuration_.multicast_interface()); } QObject::connect(&socket_, &QUdpSocket::readyRead, receiver, diff --git a/src/muebtransmitter_p.h b/src/muebtransmitter_p.h index 648027842640c1d96e68fdc5bdf205b322937e50..b267616ab8b322ceadb577e83c4011a09e0c86b2 100644 --- a/src/muebtransmitter_p.h +++ b/src/muebtransmitter_p.h @@ -23,6 +23,8 @@ class MuebTransmitterPrivate { datagram_(QByteArray(), configuration_.target_address(), configuration_.animation_port()), q_ptr(transmitter) { + socket_.setMulticastInterface(configuration_.multicast_interface()); + qInfo().noquote() << QString("[MuebTransmitter] UDP Socket will send frame to %2:%3") .arg(configuration_.target_address().toString())