mDNS Support (#1452)

* Allow build, if no grabbers are enabled

* Align available functions to right Qt version

* Update to next development version

* Align available functions to right Qt version

* fix workflows (apt/nightly)

* Disable QNetworkConfigurationManager deprecation warnings

* Initial go on Smart Pointers

* Add Deallocation

* Correct QT_WARNING_DISABLE_DEPRECATED (available since 5.9)

* Cluster Build Variables

* Hyperion Light

* Address build warnings

* Hyperion Light - UI

* Update Protobuf to latest master

* Removed compiler warnings

* Added restart ability to systray

* Correct Protobuf

* Ignore 'no-return' warning on protobuf build

* hyperion-remote: Fix auto discovery of hyperion server

* Fix Qt version override

* Update changelog

* Remove Grabber Components, if no Grabber exists

* Standalone Grabber - Fix fps default

* Remote Control - Have Source Selction accrosswhole screen

* Enable Blackborder detection only, if relevant input sources available

* Enable Blackborder detection only, if relevant input sources available

* Remote UI - rearrange containers

* Checkout

* Fix compilation on windows

* Re-added qmdnsengine template cmake

* chrono added for linux

* Removed existing AVAHI/Bonjour, allow to enable/disable mDNS

* hyperiond macos typo fix

* Fix macOS Bundle build

* Fix macOS bundle info details

* Correct CMake files

* Removed existing AVAHI/Bonjour (2)

* Share hyperion's services via mDNS

* Add mDNS Browser and mDNS for LED-Devices

* Support mDNS discovery for standalone grabbers

* Remove ZLib Dependency & Cleanup

* mDNS - hanle 2.local2 an ".local." domains equally

* Hue - Link discovery to bridge class, workaround port 443 for mDNS discovery

* Fix save button state when switching between devices

* Removed sessions (of other hyperions)

* mDNS Publisher - Simplify service naming

* mDNS refactoring & Forwarder discovery

* mDNS Updates to use device service name

* Consistency of standalone grabbers with mDNS Service Registry

* Merge branch 'hyperion-project:master' into mDNS

* Start JSON and WebServers only after Instance 0 is available

* Remove bespoke qDebug Output again

* MDNS updates and refactor Forwarder

* Minor updates

* Upgrade to CMake 3.1

* typo

* macOS fix

* Correct merge

* - Remove dynamic linker flag from standalone dispmanX Grabber
- Added ability to use system qmdns libs

* Cec handler library will load at runtime

* typo fix

* protobuf changes

* mDNS changes for Windows/macOS

* test window build qmdnsengine

* absolute path to protobuf cmake dir

* Rework Hue Wizard supporting mDNS

* LED-Devices - Retry support + Refactoring (excl. Hue)

* LED-Devices - Refactoring/Retry support Hue + additional alignments

* Address LGTM findings

* Fix CI-Build, revert test changes

* Build Windows in Release mode to avoid python problem

* Correct that WebServerObject is available earlier

* Ensure that instance name in logs for one instance are presented

* Update content LEDs

* Rework mDNS Address lookup

* Fix LED UI

* Fix for non mDNS Services (ignore default port)

* Disbale device when now input is available

* Revert back some updates, ensure last color is updated when switched on

* Handle reopening case and changed IP, port for API-calls

* Add UPD-DDP Device

* WLED support for DDP

* Fix printout

* LEDDevice - Allow more retries, udapte defaults

* LED-Net Devices - Select Custom device, if configured

Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
Co-authored-by: Paulchen Panther <Paulchen-Panter@protonmail.com>
This commit is contained in:
LordGrey
2022-05-01 19:42:47 +02:00
committed by GitHub
parent 3ef4ebc1a4
commit e9936e131b
148 changed files with 5885 additions and 4459 deletions

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-aml)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -29,12 +29,17 @@ target_link_libraries(${PROJECT_NAME}
flatbuffers
amlogic-grabber
framebuffer-grabber
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
if (ENABLE_AMLOGIC)
target_link_libraries(${PROJECT_NAME}
pcre16 dl z

View File

@@ -9,12 +9,25 @@
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -111,27 +124,34 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("AML Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-dispmanx)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -22,21 +22,23 @@ add_executable( ${PROJECT_NAME}
${Hyperion_Dispmanx_SOURCES}
)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-rdynamic")
SET(CMAKE_C_FLAGS ${CMAKE_CXX_FLAGS} "-rdynamic")
target_link_libraries( ${PROJECT_NAME}
commandline
hyperion-utils
flatbufconnect
flatbuffers
dispmanx-grabber
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_dispmanx" )
if(CMAKE_HOST_UNIX)

View File

@@ -10,12 +10,25 @@
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -114,27 +127,34 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("Dispmanx Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-framebuffer)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -28,13 +28,18 @@ target_link_libraries( ${PROJECT_NAME}
flatbufconnect
flatbuffers
framebuffer-grabber
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
if (ENABLE_AMLOGIC)
target_link_libraries( ${PROJECT_NAME}
pcre16 dl z

View File

@@ -9,12 +9,25 @@
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -114,27 +127,34 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("Framebuffer Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-osx)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Widgets REQUIRED)
@@ -28,11 +28,16 @@ target_link_libraries( ${PROJECT_NAME}
flatbufconnect
flatbuffers
osx-grabber
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
install ( TARGETS ${PROJECT_NAME} DESTINATION "." COMPONENT "hyperion_osx" )

View File

@@ -8,12 +8,25 @@
#include "OsxWrapper.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -108,27 +121,35 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("OSX Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-qt)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Gui Network Widgets REQUIRED)
@@ -34,13 +34,18 @@ target_link_libraries(${PROJECT_NAME}
qt-grabber
flatbufconnect
flatbuffers
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
if(APPLE)
install ( TARGETS ${PROJECT_NAME} DESTINATION "." COMPONENT "hyperion_qt" )
elseif(NOT WIN32)

View File

@@ -1,4 +1,3 @@
// QT includes
#include <QCoreApplication>
#include <QImage>
@@ -10,20 +9,33 @@
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
//flatbuf sending
#include <flatbufserver/FlatBufferConnection.h>
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#include <utils/NetUtils.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
void saveScreenshot(QString filename, const Image<ColorRgb> & image)
void saveScreenshot(const QString& filename, const Image<ColorRgb> & image)
{
// store as PNG
QImage pngImage((const uint8_t *) image.memptr(), image.width(), image.height(), 3*image.width(), QImage::Format_RGB888);
QImage pngImage(reinterpret_cast<const uint8_t *>(image.memptr()), static_cast<int>(image.width()), static_cast<int>(image.height()), static_cast<int>(3*image.width()), QImage::Format_RGB888);
pngImage.save(filename);
}
@@ -115,38 +127,46 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port { FLATBUFFER_DEFAULT_PORT };
QString serviceName {QHostInfo::localHostName()};
int port {FLATBUFFER_DEFAULT_PORT};
if ( !NetUtils::resolveHostPort(address, host, port) )
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("Qt Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);
// Connect the screen capturing to flatbuf connection processing
QObject::connect(&qtWrapper, SIGNAL(sig_screenshot(const Image<ColorRgb> &)), &flatbuf, SLOT(setImage(Image<ColorRgb>)));
QObject::connect(&qtWrapper, &QtWrapper::sig_screenshot, &flatbuf, &FlatBufferConnection::setImage);
// Start the capturing
qtWrapper.start();
// Start the application
app.exec();
QGuiApplication::exec();
}
}
catch (const std::runtime_error & e)

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-remote)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -32,7 +32,6 @@ add_executable(${PROJECT_NAME}
target_link_libraries(${PROJECT_NAME}
commandline
hyperion-utils
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
@@ -44,6 +43,12 @@ if (ENABLE_AMLOGIC)
)
endif()
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
if(ENABLE_EFFECTENGINE)
target_link_libraries(${PROJECT_NAME} effectengine)
endif()

View File

@@ -9,7 +9,7 @@
//forward class decl
class Logger;
const int JSON_DEFAULT_PORT = 19444;
const int JSONAPI_DEFAULT_PORT = 19444;
///
/// Connection class to setup an connection to the hyperion server and execute commands
@@ -24,7 +24,7 @@ public:
/// @param address The port of the Hyperion JSON-server (default port = 19444)
/// @param printJson Boolean indicating if the sent and received json is written to stdout
///
JsonConnection(const QString& host, bool printJson, quint16 port = JSON_DEFAULT_PORT);
JsonConnection(const QString& host, bool printJson, quint16 port = JSONAPI_DEFAULT_PORT);
///
/// Destructor

View File

@@ -9,18 +9,34 @@
#include <QCoreApplication>
#include <QLocale>
#include <utils/Logger.h>
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
// hyperion-remote include
#include "JsonConnection.h"
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "jsonapi";
} //End of constants
using namespace commandline;
/// Count the number of true values in a list of booleans
@@ -38,10 +54,10 @@ int count(std::initializer_list<bool> values)
void showHelp(Option & option){
QString shortOption;
QString longOption = QString("--%1").arg(option.names().last());
QString longOption = QString("--%1").arg(option.names().constLast());
if(option.names().size() == 2){
shortOption = QString("-%1").arg(option.names().first());
shortOption = QString("-%1").arg(option.names().constFirst());
}
qWarning() << qPrintable(QString("\t%1\t%2\t%3").arg(shortOption, longOption, option.description()));
@@ -51,7 +67,7 @@ int getInstaneIdbyName(const QJsonObject & reply, const QString & name){
if(reply.contains("instance")){
QJsonArray list = reply.value("instance").toArray();
for (const QJsonValueRef entry : list) {
for ( const auto &entry : qAsConst(list) ) {
const QJsonObject obj = entry.toObject();
if(obj["friendly_name"] == name && obj["running"].toBool())
{
@@ -65,10 +81,6 @@ int getInstaneIdbyName(const QJsonObject & reply, const QString & name){
int main(int argc, char * argv[])
{
#ifndef _WIN32
setenv("AVAHI_COMPAT_NOWARN", "1", 1);
#endif
Logger* log = Logger::getInstance("REMOTE");
Logger::setLogLevel(Logger::INFO);
@@ -204,28 +216,34 @@ int main(int argc, char * argv[])
showHelp(argYAdjust);
return 1;
}
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19444")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_JSONSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ JSON_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ JSONAPI_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// create the connection to the hyperion server
JsonConnection connection(host, parser.isSet(argPrint), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-v4l2)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -28,12 +28,17 @@ target_link_libraries(${PROJECT_NAME}
hyperion-utils
flatbufconnect
flatbuffers
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
if (ENABLE_AMLOGIC)
target_link_libraries(${PROJECT_NAME}
pcre16 dl z

View File

@@ -21,12 +21,25 @@
#include "HyperionConfig.h"
#include <commandline/Parser.h>
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
#include <utils/DefaultSignalHandler.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
int main(int argc, char** argv)
@@ -231,27 +244,35 @@ int main(int argc, char** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("V4L2 Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-x11)
find_package(X11 REQUIRED)
@@ -35,7 +35,6 @@ target_link_libraries(${PROJECT_NAME}
flatbufconnect
flatbuffers
x11-grabber
ssdp
${X11_LIBRARIES}
${X11_Xrandr_LIB}
${X11_Xrender_LIB}
@@ -45,6 +44,12 @@ target_link_libraries(${PROJECT_NAME}
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
install ( TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_x11" )
if(CMAKE_HOST_UNIX)

View File

@@ -9,10 +9,23 @@
#include "X11Wrapper.h"
#include "HyperionConfig.h"
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -111,27 +124,35 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("X11 Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0.0)
cmake_minimum_required(VERSION 3.1.0)
project(hyperion-xcb)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Network Widgets REQUIRED)
@@ -28,12 +28,17 @@ target_link_libraries(${PROJECT_NAME}
flatbufconnect
flatbuffers
xcb-grabber
ssdp
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Widgets
)
if(ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
else()
target_link_libraries(${PROJECT_NAME} ssdp)
endif()
install (TARGETS ${PROJECT_NAME} DESTINATION "share/hyperion/bin" COMPONENT "hyperion_xcb")
if(CMAKE_HOST_UNIX)

View File

@@ -9,10 +9,23 @@
#include "XcbWrapper.h"
#include "HyperionConfig.h"
#ifdef ENABLE_MDNS
// mDNS discover
#include <mdns/MdnsBrowser.h>
#include <mdns/MdnsServiceRegister.h>
#else
// ssdp discover
#include <ssdp/SSDPDiscover.h>
#endif
#include <utils/NetUtils.h>
// Constants
namespace {
const char SERVICE_TYPE[] = "flatbuffer";
} //End of constants
using namespace commandline;
// save the image as screenshot
@@ -111,27 +124,34 @@ int main(int argc, char ** argv)
}
else
{
// server searching by ssdp
QString address = argAddress.value(parser);
if(address == "127.0.0.1" || address == "127.0.0.1:19400")
{
SSDPDiscover discover;
address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty())
{
address = argAddress.value(parser);
}
}
// Resolve hostname and port (or use default port)
QString host;
quint16 port{ FLATBUFFER_DEFAULT_PORT };
QString serviceName{ QHostInfo::localHostName() };
int port{ FLATBUFFER_DEFAULT_PORT };
if (!NetUtils::resolveHostPort(address, host, port))
// Split hostname and port (or use default port)
QString givenAddress = argAddress.value(parser);
if (!NetUtils::resolveHostPort(givenAddress, host, port))
{
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(address).toStdString());
throw std::runtime_error(QString("Wrong address: unable to parse address (%1)").arg(givenAddress).toStdString());
}
// Search available Hyperion services via mDNS, if default/localhost IP is given
if (host == "127.0.0.1" || host == "::1")
{
#ifndef ENABLE_MDNS
SSDPDiscover discover;
host = discover.getFirstService(searchType::STY_FLATBUFSERVER);
#endif
QHostAddress address;
if (!NetUtils::resolveHostToAddress(log, host, address, port))
{
throw std::runtime_error(QString("Address could not be resolved for hostname: %2").arg(QSTRING_CSTR(host)).toStdString());
}
host = address.toString();
}
Info(log, "Connecting to Hyperion host: %s, port: %u using service: %s", QSTRING_CSTR(host), port, QSTRING_CSTR(serviceName));
// Create the Flabuf-connection
FlatBufferConnection flatbuf("XCB Standalone", host, argPriority.getInt(parser), parser.isSet(argSkipReply), port);

View File

@@ -78,10 +78,6 @@ if(ENABLE_PROTOBUF_SERVER)
target_link_libraries(${PROJECT_NAME} protoserver)
endif()
if (ENABLE_AVAHI)
target_link_libraries(${PROJECT_NAME} bonjour)
endif (ENABLE_AVAHI)
if (ENABLE_AMLOGIC)
target_link_libraries(${PROJECT_NAME}
#Qt${QT_VERSION_MAJOR}::Core
@@ -137,18 +133,22 @@ if (ENABLE_CEC)
target_link_libraries(${PROJECT_NAME} cechandler)
endif (ENABLE_CEC)
if (ENABLE_MDNS)
target_link_libraries(${PROJECT_NAME} mdns)
endif()
if (APPLE)
set_target_properties( ${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/cmake/osxbundle/Info.plist.in
MACOSX_BUNDLE_BUNDLE_NAME "Hyperion"
MACOSX_BUNDLE_BUNDLE_VERSION ${HYPERION_VERSION}
MACOSX_BUNDLE_COPYRIGHT "Copyright (c) 2014-2021 Hyperion Project"
MACOSX_BUNDLE_COPYRIGHT "Copyright(c) 2014-2022 Hyperion Project"
MACOSX_BUNDLE_GUI_IDENTIFIER "com.hyperion-project.${PROJECT_NAME}"
MACOSX_BUNDLE_ICON_FILE "Hyperion.icns"
MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} ${HYPERION_VERSION}"
MACOSX_BUNDLE_LONG_VERSION_STRING ${HYPERION_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${HYPERION_VERSION}
MACOSX_BUNDLE_LONG_VERSION_STRING ${HYPERION_VERSION}
)
install ( TARGETS ${PROJECT_NAME} DESTINATION . COMPONENT "Hyperion")
@@ -195,7 +195,7 @@ if (WIN32)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${WINDEPLOYQT_EXECUTABLE} ${WINDEPLOYQT_PARAMS_RUNTIME} "$<TARGET_FILE:${PROJECT_NAME}>")
endif()
find_package(OpenSSL REQUIRED)
find_package(OpenSSL REQUIRED)
if (OPENSSL_FOUND)
string(REGEX MATCHALL "[0-9]+" openssl_versions "${OPENSSL_VERSION}")
list(GET openssl_versions 0 openssl_version_major)

View File

@@ -20,10 +20,12 @@
#include <HyperionConfig.h> // Required to determine the cmake options
// bonjour browser
#ifdef ENABLE_AVAHI
#include <bonjour/bonjourbrowserwrapper.h>
// mDNS
#ifdef ENABLE_MDNS
#include <mdns/MdnsProvider.h>
#include <mdns/MdnsBrowser.h>
#endif
#include <jsonserver/JsonServer.h>
#include <webserver/WebServer.h>
#include "hyperiond.h"
@@ -65,36 +67,36 @@
#include <cec/CECHandler.h>
#endif
HyperionDaemon *HyperionDaemon::daemon = nullptr;
HyperionDaemon* HyperionDaemon::daemon = nullptr;
HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool logLvlOverwrite, bool readonlyMode)
: QObject(parent), _log(Logger::getInstance("DAEMON"))
, _instanceManager(new HyperionIManager(rootPath, this, readonlyMode))
, _authManager(new AuthManager(this, readonlyMode))
#ifdef ENABLE_AVAHI
, _bonjourBrowserWrapper(new BonjourBrowserWrapper())
, _instanceManager(new HyperionIManager(rootPath, this, readonlyMode))
, _authManager(new AuthManager(this, readonlyMode))
#ifdef ENABLE_MDNS
, _mDNSProvider(nullptr)
#endif
, _netOrigin(new NetOrigin(this))
, _netOrigin(new NetOrigin(this))
#if defined(ENABLE_EFFECTENGINE)
, _pyInit(new PythonInit())
, _pyInit(new PythonInit())
#endif
, _webserver(nullptr)
, _sslWebserver(nullptr)
, _jsonServer(nullptr)
, _videoGrabber(nullptr)
, _dispmanx(nullptr)
, _x11Grabber(nullptr)
, _xcbGrabber(nullptr)
, _amlGrabber(nullptr)
, _fbGrabber(nullptr)
, _osxGrabber(nullptr)
, _qtGrabber(nullptr)
, _dxGrabber(nullptr)
, _ssdp(nullptr)
, _webserver(nullptr)
, _sslWebserver(nullptr)
, _jsonServer(nullptr)
, _videoGrabber(nullptr)
, _dispmanx(nullptr)
, _x11Grabber(nullptr)
, _xcbGrabber(nullptr)
, _amlGrabber(nullptr)
, _fbGrabber(nullptr)
, _osxGrabber(nullptr)
, _qtGrabber(nullptr)
, _dxGrabber(nullptr)
, _ssdp(nullptr)
#ifdef ENABLE_CEC
, _cecHandler(nullptr)
, _cecHandler(nullptr)
#endif
, _currVideoMode(VideoMode::VIDEO_2D)
, _currVideoMode(VideoMode::VIDEO_2D)
{
HyperionDaemon::daemon = this;
@@ -117,6 +119,11 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
createCecHandler();
//Create MdnsBrowser singleton in main tread to ensure thread affinity during destruction
#ifdef ENABLE_MDNS
MdnsBrowser::getInstance();
#endif
#if defined(ENABLE_EFFECTENGINE)
// init EffectFileHandler
EffectFileHandler* efh = new EffectFileHandler(rootPath, getSetting(settings::EFFECTS), this);
@@ -135,7 +142,10 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
_instanceManager->startAll();
//Cleaning up Hyperion before quit
connect(parent, SIGNAL(aboutToQuit()), this, SLOT(freeObjects()));
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &HyperionDaemon::freeObjects);
//Handle services dependent on the on first instance's availability
connect(_instanceManager, &HyperionIManager::instanceStateChanged, this, &HyperionDaemon::handleInstanceStateChange);
// pipe settings changes from HyperionIManager to Daemon
connect(_instanceManager, &HyperionIManager::settingsChanged, this, &HyperionDaemon::settingsChanged);
@@ -171,6 +181,62 @@ HyperionDaemon::~HyperionDaemon()
#endif
}
void HyperionDaemon::handleInstanceStateChange(InstanceState state, quint8 instance)
{
switch (state)
{
case InstanceState::H_STARTED:
if (instance == 0)
{
// Start Json server in own thread
_jsonServer = new JsonServer(getSetting(settings::JSONSERVER));
QThread* jsonThread = new QThread(this);
jsonThread->setObjectName("JSONServerThread");
_jsonServer->moveToThread(jsonThread);
connect(jsonThread, &QThread::started, _jsonServer, &JsonServer::initServer);
connect(jsonThread, &QThread::finished, _jsonServer, &JsonServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _jsonServer, &JsonServer::handleSettingsUpdate);
#ifdef ENABLE_MDNS
connect(_jsonServer, &JsonServer::publishService, _mDNSProvider, &MdnsProvider::publishService);
#endif
jsonThread->start();
// Start Webserver in own thread
QThread* wsThread = new QThread(this);
wsThread->setObjectName("WebServerThread");
_webserver->moveToThread(wsThread);
connect(wsThread, &QThread::started, _webserver, &WebServer::initServer);
connect(wsThread, &QThread::finished, _webserver, &WebServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _webserver, &WebServer::handleSettingsUpdate);
#ifdef ENABLE_MDNS
connect(_webserver, &WebServer::publishService, _mDNSProvider, &MdnsProvider::publishService);
#endif
wsThread->start();
// Start SSL Webserver in own thread
_sslWebserver = new WebServer(getSetting(settings::WEBSERVER), true);
QThread* sslWsThread = new QThread(this);
sslWsThread->setObjectName("SSLWebServerThread");
_sslWebserver->moveToThread(sslWsThread);
connect(sslWsThread, &QThread::started, _sslWebserver, &WebServer::initServer);
connect(sslWsThread, &QThread::finished, _sslWebserver, &WebServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _sslWebserver, &WebServer::handleSettingsUpdate);
#ifdef ENABLE_MDNS
connect(_sslWebserver, &WebServer::publishService, _mDNSProvider, &MdnsProvider::publishService);
#endif
sslWsThread->start();
}
break;
case InstanceState::H_STOPPED:
break;
default:
break;
}
}
void HyperionDaemon::setVideoMode(VideoMode mode)
{
if (_currVideoMode != mode)
@@ -189,9 +255,25 @@ void HyperionDaemon::freeObjects()
{
Debug(_log, "Cleaning up Hyperion before quit.");
// destroy network first as a client might want to access hyperion
delete _jsonServer;
_jsonServer = nullptr;
#ifdef ENABLE_MDNS
if (_mDNSProvider != nullptr)
{
auto mDnsThread = _mDNSProvider->thread();
mDnsThread->quit();
mDnsThread->wait();
delete mDnsThread;
_mDNSProvider = nullptr;
}
#endif
if (_jsonServer != nullptr)
{
auto jsonThread = _jsonServer->thread();
jsonThread->quit();
jsonThread->wait();
delete jsonThread;
_jsonServer = nullptr;
}
#if defined(ENABLE_FLATBUF_SERVER)
if (_flatBufferServer != nullptr)
@@ -258,11 +340,6 @@ void HyperionDaemon::freeObjects()
// stop Hyperions (non blocking)
_instanceManager->stopAll();
#ifdef ENABLE_AVAHI
delete _bonjourBrowserWrapper;
_bonjourBrowserWrapper = nullptr;
#endif
delete _amlGrabber;
if (_dispmanx != nullptr)
delete _dispmanx;
@@ -273,19 +350,26 @@ void HyperionDaemon::freeObjects()
delete _videoGrabber;
_videoGrabber = nullptr;
_amlGrabber = nullptr;
_dispmanx = nullptr;
_fbGrabber = nullptr;
_osxGrabber = nullptr;
_qtGrabber = nullptr;
_dxGrabber = nullptr;
_amlGrabber = nullptr;
_dispmanx = nullptr;
_fbGrabber = nullptr;
_osxGrabber = nullptr;
_qtGrabber = nullptr;
_dxGrabber = nullptr;
}
void HyperionDaemon::startNetworkServices()
{
// Create Json server
_jsonServer = new JsonServer(getSetting(settings::JSONSERVER));
connect(this, &HyperionDaemon::settingsChanged, _jsonServer, &JsonServer::handleSettingsUpdate);
// Create mDNS-Provider in thread to allow publishing other services
#ifdef ENABLE_MDNS
_mDNSProvider = new MdnsProvider();
QThread* mDnsThread = new QThread(this);
mDnsThread->setObjectName("mDNSProviderThread");
_mDNSProvider->moveToThread(mDnsThread);
connect(mDnsThread, &QThread::started, _mDNSProvider, &MdnsProvider::init);
connect(mDnsThread, &QThread::finished, _mDNSProvider, &MdnsProvider::deleteLater);
mDnsThread->start();
#endif
#if defined(ENABLE_FLATBUF_SERVER)
// Create FlatBuffer server in thread
@@ -296,6 +380,9 @@ void HyperionDaemon::startNetworkServices()
connect(fbThread, &QThread::started, _flatBufferServer, &FlatBufferServer::initServer);
connect(fbThread, &QThread::finished, _flatBufferServer, &FlatBufferServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _flatBufferServer, &FlatBufferServer::handleSettingsUpdate);
#ifdef ENABLE_MDNS
connect(_flatBufferServer, &FlatBufferServer::publishService, _mDNSProvider, &MdnsProvider::publishService);
#endif
fbThread->start();
#endif
@@ -308,36 +395,22 @@ void HyperionDaemon::startNetworkServices()
connect(pThread, &QThread::started, _protoServer, &ProtoServer::initServer);
connect(pThread, &QThread::finished, _protoServer, &ProtoServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _protoServer, &ProtoServer::handleSettingsUpdate);
#ifdef ENABLE_MDNS
connect(_protoServer, &ProtoServer::publishService, _mDNSProvider, &MdnsProvider::publishService);
#endif
pThread->start();
#endif
// Create Webserver in thread
// Create Webserver
_webserver = new WebServer(getSetting(settings::WEBSERVER), false);
QThread* wsThread = new QThread(this);
wsThread->setObjectName("WebServerThread");
_webserver->moveToThread(wsThread);
connect(wsThread, &QThread::started, _webserver, &WebServer::initServer);
connect(wsThread, &QThread::finished, _webserver, &WebServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _webserver, &WebServer::handleSettingsUpdate);
wsThread->start();
// Create SSL Webserver in thread
_sslWebserver = new WebServer(getSetting(settings::WEBSERVER), true);
QThread* sslWsThread = new QThread(this);
sslWsThread->setObjectName("SSLWebServerThread");
_sslWebserver->moveToThread(sslWsThread);
connect(sslWsThread, &QThread::started, _sslWebserver, &WebServer::initServer);
connect(sslWsThread, &QThread::finished, _sslWebserver, &WebServer::deleteLater);
connect(this, &HyperionDaemon::settingsChanged, _sslWebserver, &WebServer::handleSettingsUpdate);
sslWsThread->start();
// Create SSDP server in thread
// Create SSDP server
_ssdp = new SSDPHandler(_webserver,
getSetting(settings::FLATBUFSERVER).object()["port"].toInt(),
getSetting(settings::PROTOSERVER).object()["port"].toInt(),
getSetting(settings::JSONSERVER).object()["port"].toInt(),
getSetting(settings::WEBSERVER).object()["sslPort"].toInt(),
getSetting(settings::GENERAL).object()["name"].toString());
getSetting(settings::FLATBUFSERVER).object()["port"].toInt(),
getSetting(settings::PROTOSERVER).object()["port"].toInt(),
getSetting(settings::JSONSERVER).object()["port"].toInt(),
getSetting(settings::WEBSERVER).object()["sslPort"].toInt(),
getSetting(settings::GENERAL).object()["name"].toString());
QThread* ssdpThread = new QThread(this);
ssdpThread->setObjectName("SSDPThread");
_ssdp->moveToThread(ssdpThread);
@@ -387,11 +460,11 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
_grabber_cropTop = grabberConfig["cropTop"].toInt(0);
_grabber_cropBottom = grabberConfig["cropBottom"].toInt(0);
#ifdef ENABLE_OSX
#ifdef ENABLE_OSX
QString type = grabberConfig["device"].toString("osx");
#else
#else
QString type = grabberConfig["device"].toString("auto");
#endif
#endif
// auto eval of type
if (type == "auto")
@@ -408,7 +481,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
type = "amlogic";
QString amlDevice ("/dev/amvideocap0");
QString amlDevice("/dev/amvideocap0");
if (!QFile::exists(amlDevice))
{
Error(_log, "grabber device '%s' for type amlogic not found!", QSTRING_CSTR(amlDevice));
@@ -420,13 +493,13 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
QByteArray envDisplay = qgetenv("DISPLAY");
if (!envDisplay.isEmpty())
{
#if defined(ENABLE_X11)
#if defined(ENABLE_X11)
type = "x11";
#elif defined(ENABLE_XCB)
#elif defined(ENABLE_XCB)
type = "xcb";
#else
#else
type = "qt";
#endif
#endif
}
// qt -> if nothing other applies
else
@@ -440,70 +513,70 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
if (_prevType != type)
{
// stop all capture interfaces
#ifdef ENABLE_FB
#ifdef ENABLE_FB
if (_fbGrabber != nullptr)
{
_fbGrabber->stop();
delete _fbGrabber;
_fbGrabber = nullptr;
}
#endif
#ifdef ENABLE_DISPMANX
#endif
#ifdef ENABLE_DISPMANX
if (_dispmanx != nullptr)
{
_dispmanx->stop();
delete _dispmanx;
_dispmanx = nullptr;
}
#endif
#ifdef ENABLE_AMLOGIC
#endif
#ifdef ENABLE_AMLOGIC
if (_amlGrabber != nullptr)
{
_amlGrabber->stop();
delete _amlGrabber;
_amlGrabber = nullptr;
}
#endif
#ifdef ENABLE_OSX
#endif
#ifdef ENABLE_OSX
if (_osxGrabber != nullptr)
{
_osxGrabber->stop();
delete _osxGrabber;
_osxGrabber = nullptr;
}
#endif
#ifdef ENABLE_X11
#endif
#ifdef ENABLE_X11
if (_x11Grabber != nullptr)
{
_x11Grabber->stop();
delete _x11Grabber;
_x11Grabber = nullptr;
}
#endif
#ifdef ENABLE_XCB
#endif
#ifdef ENABLE_XCB
if (_xcbGrabber != nullptr)
{
_xcbGrabber->stop();
delete _xcbGrabber;
_xcbGrabber = nullptr;
}
#endif
#ifdef ENABLE_QT
#endif
#ifdef ENABLE_QT
if (_qtGrabber != nullptr)
{
_qtGrabber->stop();
delete _qtGrabber;
_qtGrabber = nullptr;
}
#endif
#ifdef ENABLE_DX
#endif
#ifdef ENABLE_DX
if (_dxGrabber != nullptr)
{
_dxGrabber->stop();
delete _dxGrabber;
_dxGrabber = nullptr;
}
#endif
#endif
// create/start capture interface
if (type == "framebuffer")
@@ -512,10 +585,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberFramebuffer(grabberConfig);
}
#ifdef ENABLE_FB
_fbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_fbGrabber->tryStart();
#endif
#ifdef ENABLE_FB
_fbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_fbGrabber->tryStart();
#endif
}
else if (type == "dispmanx")
{
@@ -524,13 +597,13 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
createGrabberDispmanx(grabberConfig);
}
#ifdef ENABLE_DISPMANX
#ifdef ENABLE_DISPMANX
if (_dispmanx != nullptr)
{
_dispmanx->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_dispmanx->tryStart();
}
#endif
#endif
}
else if (type == "amlogic")
{
@@ -538,10 +611,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberAmlogic(grabberConfig);
}
#ifdef ENABLE_AMLOGIC
_amlGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_amlGrabber->tryStart();
#endif
#ifdef ENABLE_AMLOGIC
_amlGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_amlGrabber->tryStart();
#endif
}
else if (type == "osx")
{
@@ -549,10 +622,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberOsx(grabberConfig);
}
#ifdef ENABLE_OSX
_osxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_osxGrabber->tryStart();
#endif
#ifdef ENABLE_OSX
_osxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_osxGrabber->tryStart();
#endif
}
else if (type == "x11")
{
@@ -560,10 +633,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberX11(grabberConfig);
}
#ifdef ENABLE_X11
_x11Grabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_x11Grabber->tryStart();
#endif
#ifdef ENABLE_X11
_x11Grabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_x11Grabber->tryStart();
#endif
}
else if (type == "xcb")
{
@@ -571,10 +644,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberXcb(grabberConfig);
}
#ifdef ENABLE_XCB
_xcbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_xcbGrabber->tryStart();
#endif
#ifdef ENABLE_XCB
_xcbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_xcbGrabber->tryStart();
#endif
}
else if (type == "qt")
{
@@ -582,10 +655,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberQt(grabberConfig);
}
#ifdef ENABLE_QT
_qtGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_qtGrabber->tryStart();
#endif
#ifdef ENABLE_QT
_qtGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_qtGrabber->tryStart();
#endif
}
else if (type == "dx")
{
@@ -593,10 +666,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{
createGrabberDx(grabberConfig);
}
#ifdef ENABLE_DX
_dxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_dxGrabber->tryStart();
#endif
#ifdef ENABLE_DX
_dxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_dxGrabber->tryStart();
#endif
}
else
{
@@ -677,7 +750,7 @@ void HyperionDaemon::createGrabberAmlogic(const QJsonObject& /*grabberConfig*/)
_amlGrabber = new AmlogicWrapper(
_grabber_frequency,
_grabber_pixelDecimation
);
);
_amlGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal
@@ -697,7 +770,7 @@ void HyperionDaemon::createGrabberX11(const QJsonObject& /*grabberConfig*/)
_grabber_frequency,
_grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
);
);
_x11Grabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal
@@ -717,7 +790,7 @@ void HyperionDaemon::createGrabberXcb(const QJsonObject& /*grabberConfig*/)
_grabber_frequency,
_grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
);
);
_xcbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal
@@ -738,7 +811,7 @@ void HyperionDaemon::createGrabberQt(const QJsonObject& grabberConfig)
grabberConfig["input"].toInt(0),
_grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
);
);
// connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _qtGrabber, &QtWrapper::setVideoMode);
@@ -758,7 +831,7 @@ void HyperionDaemon::createGrabberDx(const QJsonObject& grabberConfig)
grabberConfig["display"].toInt(0),
_grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
);
);
// connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _dxGrabber, &DirectXWrapper::setVideoMode);
@@ -781,7 +854,7 @@ void HyperionDaemon::createGrabberFramebuffer(const QJsonObject& grabberConfig)
_grabber_frequency,
devicePath,
_grabber_pixelDecimation
);
);
_fbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _fbGrabber, &FramebufferWrapper::setVideoMode);
@@ -793,7 +866,7 @@ void HyperionDaemon::createGrabberFramebuffer(const QJsonObject& grabberConfig)
#endif
}
void HyperionDaemon::createGrabberOsx(const QJsonObject& grabberConfig)
void HyperionDaemon::createGrabberOsx(const QJsonObject& grabberConfig)
{
#ifdef ENABLE_OSX
// Construct and start the osx grabber if the configuration is present
@@ -801,7 +874,7 @@ void HyperionDaemon::createGrabberFramebuffer(const QJsonObject& grabberConfig)
_grabber_frequency,
grabberConfig["input"].toInt(0),
_grabber_pixelDecimation
);
);
_osxGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal
@@ -829,10 +902,11 @@ void HyperionDaemon::createCecHandler()
{
_videoGrabber->handleCecEvent(event);
}
});
});
Info(_log, "CEC handler created");
#else
Debug(_log, "The CEC handler is not supported on this platform");
#endif
}

View File

@@ -4,6 +4,8 @@
#include <QObject>
#include <QJsonObject>
#include <hyperion/HyperionIManager.h>
#ifdef ENABLE_DISPMANX
#include <grabber/DispmanxWrapper.h>
#else
@@ -70,7 +72,9 @@
class HyperionIManager;
class SysTray;
class JsonServer;
class BonjourBrowserWrapper;
#ifdef ENABLE_MDNS
class MdnsProvider;
#endif
class WebServer;
class SettingsManager;
#if defined(ENABLE_EFFECTENGINE)
@@ -154,6 +158,12 @@ private slots:
///
void setVideoMode(VideoMode mode);
/// @brief Handle whenever the state of a instance (HyperionIManager) changes according to enum instanceState
/// @param instaneState A state from enum
/// @param instance The index of instance
///
void handleInstanceStateChange(InstanceState state, quint8 instance);
private:
void createGrabberDispmanx(const QJsonObject & grabberConfig);
void createGrabberAmlogic(const QJsonObject & grabberConfig);
@@ -168,7 +178,9 @@ private:
Logger* _log;
HyperionIManager* _instanceManager;
AuthManager* _authManager;
BonjourBrowserWrapper* _bonjourBrowserWrapper;
#ifdef ENABLE_MDNS
MdnsProvider* _mDNSProvider;
#endif
NetOrigin* _netOrigin;
#if defined(ENABLE_EFFECTENGINE)
PythonInit* _pyInit;

View File

@@ -130,9 +130,6 @@ QCoreApplication* createApplication(int &argc, char *argv[])
int main(int argc, char** argv)
{
#ifndef _WIN32
setenv("AVAHI_COMPAT_NOWARN", "1", 1);
#endif
// initialize main logger and set global log level
Logger *log = Logger::getInstance("MAIN");
Logger::setLogLevel(Logger::WARNING);

View File

@@ -1,5 +1,9 @@
#pragma once
#ifdef Status
#undef Status
#endif
#include <QSystemTrayIcon>
#include <QMenu>
#include <QWidget>