Move main non Thread Objects to Smart Pointers

This commit is contained in:
LordGrey
2024-01-01 18:37:49 +01:00
parent 6df45507bf
commit 26102ca963
12 changed files with 166 additions and 243 deletions

View File

@@ -126,6 +126,7 @@ To allow segment streaming, enable "Realtime - Use main segment only" in WLED's
- hyperion-remote: Extracting reply for a configGet request correctly (#1555) - hyperion-remote: Extracting reply for a configGet request correctly (#1555)
- Grabber fps setting was not applied correctly - Grabber fps setting was not applied correctly
- Smoothing: No empty updates - Smoothing: No empty updates
- Addressed serious (#1425) and some smaller memory leaks
### Technical ### Technical
- Add CodeQL for GitHub code scanning - Add CodeQL for GitHub code scanning

View File

@@ -13,10 +13,9 @@ class EventHandler : public QObject
Q_OBJECT Q_OBJECT
public: public:
EventHandler();
~EventHandler() override; ~EventHandler() override;
static EventHandler* getInstance(); static QScopedPointer<EventHandler>& getInstance();
public slots: public slots:
@@ -40,6 +39,12 @@ protected:
Logger * _log {}; Logger * _log {};
private: private:
EventHandler();
EventHandler(const EventHandler&) = delete;
EventHandler& operator=(const EventHandler&) = delete;
static QScopedPointer<EventHandler> instance;
bool _isSuspended; bool _isSuspended;
bool _isIdle; bool _isIdle;
}; };

View File

@@ -6,6 +6,7 @@
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QMultiMap> #include <QMultiMap>
#include <QScopedPointer>
#include <utils/Logger.h> #include <utils/Logger.h>
#include <utils/Components.h> #include <utils/Components.h>
@@ -91,8 +92,8 @@ public:
template <typename Grabber_T> template <typename Grabber_T>
bool transferFrame(Grabber_T &grabber) bool transferFrame(Grabber_T &grabber)
{ {
unsigned w = grabber.getImageWidth(); int w = grabber.getImageWidth();
unsigned h = grabber.getImageHeight(); int h = grabber.getImageHeight();
if ( _image.width() != w || _image.height() != h) if ( _image.width() != w || _image.height() != h)
{ {
_image.resize(w, h); _image.resize(w, h);
@@ -185,7 +186,7 @@ protected:
Logger * _log; Logger * _log;
/// The timer for generating events with the specified update rate /// The timer for generating events with the specified update rate
QTimer* _timer; QScopedPointer<QTimer> _timer;
/// The calculated update rate [ms] /// The calculated update rate [ms]
int _updateInterval_ms; int _updateInterval_ms;

View File

@@ -142,7 +142,7 @@ void JsonAPI::initialize()
} }
//notify eventhadler on suspend/resume/idle requests //notify eventhadler on suspend/resume/idle requests
connect(this, &JsonAPI::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); connect(this, &JsonAPI::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
connect(_ledStreamTimer, &QTimer::timeout, this, &JsonAPI::streamLedColorsUpdate, Qt::UniqueConnection); connect(_ledStreamTimer, &QTimer::timeout, this, &JsonAPI::streamLedColorsUpdate, Qt::UniqueConnection);
} }

View File

@@ -165,7 +165,7 @@ bool CECHandler::enable()
else else
{ {
_isOpen=true; _isOpen=true;
QObject::connect(this, &CECHandler::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::connect(this, &CECHandler::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
#ifdef VERBOSE_CEC #ifdef VERBOSE_CEC
std::cout << "Found Devices: " << scan().toStdString() << std::endl; std::cout << "Found Devices: " << scan().toStdString() << std::endl;
#endif #endif
@@ -188,7 +188,7 @@ void CECHandler::disable()
{ {
if (_isInitialised) if (_isInitialised)
{ {
QObject::disconnect(this, &CECHandler::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::disconnect(this, &CECHandler::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
_cecAdapter->Close(); _cecAdapter->Close();
_isOpen=false; _isOpen=false;
Info(_logger, "CEC handler disabled"); Info(_logger, "CEC handler disabled");

View File

@@ -7,6 +7,8 @@
#include <utils/Process.h> #include <utils/Process.h>
#include <hyperion/HyperionIManager.h> #include <hyperion/HyperionIManager.h>
QScopedPointer<EventHandler> EventHandler::instance;
EventHandler::EventHandler() EventHandler::EventHandler()
: _isSuspended(false) : _isSuspended(false)
, _isIdle(false) , _isIdle(false)
@@ -22,10 +24,14 @@ EventHandler::~EventHandler()
QObject::disconnect(this, &EventHandler::signalEvent, HyperionIManager::getInstance(), &HyperionIManager::handleEvent); QObject::disconnect(this, &EventHandler::signalEvent, HyperionIManager::getInstance(), &HyperionIManager::handleEvent);
} }
EventHandler* EventHandler::getInstance() QScopedPointer<EventHandler>& EventHandler::getInstance()
{ {
static EventHandler instance; if (!instance)
return &instance; {
instance.reset(new EventHandler());
}
return instance;
} }
void EventHandler::suspend() void EventHandler::suspend()

View File

@@ -15,12 +15,12 @@ EventScheduler::EventScheduler()
qRegisterMetaType<Event>("Event"); qRegisterMetaType<Event>("Event");
_log = Logger::getInstance("EVENTS-SCHED"); _log = Logger::getInstance("EVENTS-SCHED");
QObject::connect(this, &EventScheduler::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::connect(this, &EventScheduler::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
} }
EventScheduler::~EventScheduler() EventScheduler::~EventScheduler()
{ {
QObject::disconnect(this, &EventScheduler::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::disconnect(this, &EventScheduler::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
clearTimers(); clearTimers();
Info(_log, "Event scheduler stopped"); Info(_log, "Event scheduler stopped");
} }

View File

@@ -39,12 +39,12 @@ OsEventHandlerBase::OsEventHandlerBase()
{ {
_isService = true; _isService = true;
} }
QObject::connect(this, &OsEventHandlerBase::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::connect(this, &OsEventHandlerBase::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
} }
OsEventHandlerBase::~OsEventHandlerBase() OsEventHandlerBase::~OsEventHandlerBase()
{ {
QObject::disconnect(this, &OsEventHandlerBase::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); QObject::disconnect(this, &OsEventHandlerBase::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
OsEventHandlerBase::unregisterLockHandler(); OsEventHandlerBase::unregisterLockHandler();
OsEventHandlerBase::unregisterOsEventHandler(); OsEventHandlerBase::unregisterOsEventHandler();

View File

@@ -27,36 +27,43 @@ bool GrabberWrapper::GLOBAL_GRABBER_AUDIO_ENABLE = false;
GrabberWrapper::GrabberWrapper(const QString& grabberName, Grabber * ggrabber, int updateRate_Hz) GrabberWrapper::GrabberWrapper(const QString& grabberName, Grabber * ggrabber, int updateRate_Hz)
: _grabberName(grabberName) : _grabberName(grabberName)
, _log(Logger::getInstance(grabberName.toUpper())) , _log(Logger::getInstance(grabberName.toUpper()))
, _timer(new QTimer(this)) , _timer(nullptr)
, _updateInterval_ms(1000/updateRate_Hz) , _updateInterval_ms(1000/updateRate_Hz)
, _ggrabber(ggrabber) , _ggrabber(ggrabber)
{ {
GrabberWrapper::instance = this; GrabberWrapper::instance = this;
_timer.reset(new QTimer(this));
// Configure the timer to generate events every n milliseconds // Configure the timer to generate events every n milliseconds
_timer->setTimerType(Qt::PreciseTimer); _timer->setTimerType(Qt::PreciseTimer);
_timer->setInterval(_updateInterval_ms); _timer->setInterval(_updateInterval_ms);
connect(_timer, &QTimer::timeout, this, &GrabberWrapper::action); connect(_timer.get(), &QTimer::timeout, this, &GrabberWrapper::action);
// connect the image forwarding // connect the image forwarding
if (_grabberName.startsWith("V4L")) if (_grabberName.startsWith("V4L"))
{
connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setV4lImage); connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setV4lImage);
}
else if (_grabberName.startsWith("Audio")) else if (_grabberName.startsWith("Audio"))
{
connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setAudioImage); connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setAudioImage);
}
else else
{
connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setSystemImage); connect(this, &GrabberWrapper::systemImage, GlobalSignals::getInstance(), &GlobalSignals::setSystemImage);
}
// listen for source requests // listen for source requests
connect(GlobalSignals::getInstance(), &GlobalSignals::requestSource, this, &GrabberWrapper::handleSourceRequest); connect(GlobalSignals::getInstance(), &GlobalSignals::requestSource, this, &GrabberWrapper::handleSourceRequest);
QObject::connect(EventHandler::getInstance(), &EventHandler::signalEvent, this, &GrabberWrapper::handleEvent); QObject::connect(EventHandler::getInstance().data(), &EventHandler::signalEvent, this, &GrabberWrapper::handleEvent);
} }
GrabberWrapper::~GrabberWrapper() GrabberWrapper::~GrabberWrapper()
{ {
_timer->stop(); _timer->stop();
delete _timer;
GrabberWrapper::instance = nullptr; GrabberWrapper::instance = nullptr;
} }
@@ -104,19 +111,25 @@ QStringList GrabberWrapper::getActive(int inst, GrabberTypeFilter type) const
if (type == GrabberTypeFilter::SCREEN || type == GrabberTypeFilter::ALL) if (type == GrabberTypeFilter::SCREEN || type == GrabberTypeFilter::ALL)
{ {
if (GRABBER_SYS_CLIENTS.contains(inst)) if (GRABBER_SYS_CLIENTS.contains(inst))
{
result << GRABBER_SYS_CLIENTS.value(inst); result << GRABBER_SYS_CLIENTS.value(inst);
}
} }
if (type == GrabberTypeFilter::VIDEO || type == GrabberTypeFilter::ALL) if (type == GrabberTypeFilter::VIDEO || type == GrabberTypeFilter::ALL)
{ {
if (GRABBER_V4L_CLIENTS.contains(inst)) if (GRABBER_V4L_CLIENTS.contains(inst))
{
result << GRABBER_V4L_CLIENTS.value(inst); result << GRABBER_V4L_CLIENTS.value(inst);
}
} }
if (type == GrabberTypeFilter::AUDIO || type == GrabberTypeFilter::ALL) if (type == GrabberTypeFilter::AUDIO || type == GrabberTypeFilter::ALL)
{ {
if (GRABBER_AUDIO_CLIENTS.contains(inst)) if (GRABBER_AUDIO_CLIENTS.contains(inst))
{
result << GRABBER_AUDIO_CLIENTS.value(inst); result << GRABBER_AUDIO_CLIENTS.value(inst);
}
} }
return result; return result;
@@ -208,7 +221,9 @@ void GrabberWrapper::updateTimer(int interval)
_timer->setInterval(_updateInterval_ms); _timer->setInterval(_updateInterval_ms);
if(timerWasActive) if(timerWasActive)
{
_timer->start(); _timer->start();
}
} }
} }
@@ -269,40 +284,64 @@ void GrabberWrapper::handleSourceRequest(hyperion::Components component, int hyp
!_grabberName.startsWith("Audio")) !_grabberName.startsWith("Audio"))
{ {
if (listen) if (listen)
{
GRABBER_SYS_CLIENTS.insert(hyperionInd, _grabberName); GRABBER_SYS_CLIENTS.insert(hyperionInd, _grabberName);
}
else else
{
GRABBER_SYS_CLIENTS.remove(hyperionInd); GRABBER_SYS_CLIENTS.remove(hyperionInd);
}
if (GRABBER_SYS_CLIENTS.empty() || !getSysGrabberState()) if (GRABBER_SYS_CLIENTS.empty() || !getSysGrabberState())
{
stop(); stop();
}
else else
{
start(); start();
}
} }
else if (component == hyperion::Components::COMP_V4L && else if (component == hyperion::Components::COMP_V4L &&
_grabberName.startsWith("V4L")) _grabberName.startsWith("V4L"))
{ {
if (listen) if (listen)
{
GRABBER_V4L_CLIENTS.insert(hyperionInd, _grabberName); GRABBER_V4L_CLIENTS.insert(hyperionInd, _grabberName);
}
else else
{
GRABBER_V4L_CLIENTS.remove(hyperionInd); GRABBER_V4L_CLIENTS.remove(hyperionInd);
}
if (GRABBER_V4L_CLIENTS.empty() || !getV4lGrabberState()) if (GRABBER_V4L_CLIENTS.empty() || !getV4lGrabberState())
{
stop(); stop();
}
else else
{
start(); start();
}
} }
else if (component == hyperion::Components::COMP_AUDIO && else if (component == hyperion::Components::COMP_AUDIO &&
_grabberName.startsWith("Audio")) _grabberName.startsWith("Audio"))
{ {
if (listen) if (listen)
{
GRABBER_AUDIO_CLIENTS.insert(hyperionInd, _grabberName); GRABBER_AUDIO_CLIENTS.insert(hyperionInd, _grabberName);
}
else else
{
GRABBER_AUDIO_CLIENTS.remove(hyperionInd); GRABBER_AUDIO_CLIENTS.remove(hyperionInd);
}
if (GRABBER_AUDIO_CLIENTS.empty() || !getAudioGrabberState()) if (GRABBER_AUDIO_CLIENTS.empty() || !getAudioGrabberState())
{
stop(); stop();
}
else else
{
start(); start();
}
} }
} }

View File

@@ -76,9 +76,13 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
#if defined(ENABLE_EFFECTENGINE) #if defined(ENABLE_EFFECTENGINE)
, _pyInit(new PythonInit()) , _pyInit(new PythonInit())
#endif #endif
, _ssdp(nullptr)
, _webserver(nullptr) , _webserver(nullptr)
, _sslWebserver(nullptr) , _sslWebserver(nullptr)
, _jsonServer(nullptr) , _jsonServer(nullptr)
, _eventHandler(nullptr)
, _osEventHandler(nullptr)
, _eventScheduler(nullptr)
, _videoGrabber(nullptr) , _videoGrabber(nullptr)
, _dispmanx(nullptr) , _dispmanx(nullptr)
, _x11Grabber(nullptr) , _x11Grabber(nullptr)
@@ -89,13 +93,10 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
, _qtGrabber(nullptr) , _qtGrabber(nullptr)
, _dxGrabber(nullptr) , _dxGrabber(nullptr)
, _audioGrabber(nullptr) , _audioGrabber(nullptr)
, _ssdp(nullptr) #ifdef ENABLE_CEC
, _eventHandler(nullptr) , _cecHandler(nullptr)
, _osEventHandler(nullptr) #endif
, _eventScheduler(nullptr) , _settingsManager(new SettingsManager(GLOABL_INSTANCE_ID, this, readonlyMode)) // init settings, this settingsManager accesses global settings which are independent from instances
#ifdef ENABLE_CEC
, _cecHandler(nullptr)
#endif
, _currVideoMode(VideoMode::VIDEO_2D) , _currVideoMode(VideoMode::VIDEO_2D)
{ {
HyperionDaemon::daemon = this; HyperionDaemon::daemon = this;
@@ -108,9 +109,6 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
qRegisterMetaType<QMap<quint8, QJsonObject>>("QMap<quint8,QJsonObject>"); qRegisterMetaType<QMap<quint8, QJsonObject>>("QMap<quint8,QJsonObject>");
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>"); qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
// init settings, this settingsManager accesses global settings which are independent from instances
_settingsManager = new SettingsManager(GLOABL_INSTANCE_ID, this, readonlyMode);
// set inital log lvl if the loglvl wasn't overwritten by arg // set inital log lvl if the loglvl wasn't overwritten by arg
if (!logLvlOverwrite) if (!logLvlOverwrite)
{ {
@@ -130,11 +128,11 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
// connect and apply settings for AuthManager // connect and apply settings for AuthManager
connect(this, &HyperionDaemon::settingsChanged, _authManager, &AuthManager::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _authManager, &AuthManager::handleSettingsUpdate);
_authManager->handleSettingsUpdate(settings::NETWORK, _settingsManager->getSetting(settings::NETWORK)); _authManager->handleSettingsUpdate(settings::NETWORK, _settingsManager.get()->getSetting(settings::NETWORK));
// connect and apply settings for NetOrigin // connect and apply settings for NetOrigin
connect(this, &HyperionDaemon::settingsChanged, _netOrigin, &NetOrigin::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _netOrigin, &NetOrigin::handleSettingsUpdate);
_netOrigin->handleSettingsUpdate(settings::NETWORK, _settingsManager->getSetting(settings::NETWORK)); _netOrigin->handleSettingsUpdate(settings::NETWORK, _settingsManager.get()->getSetting(settings::NETWORK));
// spawn all Hyperion instances (non blocking) // spawn all Hyperion instances (non blocking)
_instanceManager->startAll(); _instanceManager->startAll();
@@ -179,7 +177,6 @@ HyperionDaemon::HyperionDaemon(const QString& rootPath, QObject* parent, bool lo
HyperionDaemon::~HyperionDaemon() HyperionDaemon::~HyperionDaemon()
{ {
delete _settingsManager;
#if defined(ENABLE_EFFECTENGINE) #if defined(ENABLE_EFFECTENGINE)
delete _pyInit; delete _pyInit;
#endif #endif
@@ -265,8 +262,6 @@ void HyperionDaemon::freeObjects()
Debug(_log, "Cleaning up Hyperion before quit."); Debug(_log, "Cleaning up Hyperion before quit.");
stopCecHandler(); stopCecHandler();
delete _eventScheduler;
delete _osEventHandler;
#ifdef ENABLE_MDNS #ifdef ENABLE_MDNS
if (_mDNSProvider != nullptr) if (_mDNSProvider != nullptr)
@@ -333,24 +328,6 @@ void HyperionDaemon::freeObjects()
// stop Hyperions (non blocking) // stop Hyperions (non blocking)
_instanceManager->stopAll(); _instanceManager->stopAll();
delete _amlGrabber;
delete _dispmanx;
delete _fbGrabber;
delete _osxGrabber;
delete _qtGrabber;
delete _dxGrabber;
delete _videoGrabber;
delete _audioGrabber;
_videoGrabber = nullptr;
_amlGrabber = nullptr;
_dispmanx = nullptr;
_fbGrabber = nullptr;
_osxGrabber = nullptr;
_qtGrabber = nullptr;
_dxGrabber = nullptr;
_audioGrabber = nullptr;
} }
void HyperionDaemon::startNetworkServices() void HyperionDaemon::startNetworkServices()
@@ -418,27 +395,18 @@ void HyperionDaemon::startNetworkServices()
void HyperionDaemon::startEventServices() void HyperionDaemon::startEventServices()
{ {
if (_eventHandler == nullptr) _eventHandler->getInstance();
{ Debug(_log, "Hyperion event handler created");
_eventHandler = EventHandler::getInstance();
Debug(_log, "Hyperion event handler created");
}
if (_eventScheduler == nullptr) _eventScheduler.reset(new EventScheduler());
{ _eventScheduler->handleSettingsUpdate(settings::SCHEDEVENTS, getSetting(settings::SCHEDEVENTS));
_eventScheduler = new EventScheduler(); connect(this, &HyperionDaemon::settingsChanged, _eventScheduler.get(), &EventScheduler::handleSettingsUpdate);
_eventScheduler->handleSettingsUpdate(settings::SCHEDEVENTS, getSetting(settings::SCHEDEVENTS)); Debug(_log, "Hyperion event scheduler created");
connect(this, &HyperionDaemon::settingsChanged, _eventScheduler, &EventScheduler::handleSettingsUpdate);
Debug(_log, "Hyperion event scheduler created");
}
if (_osEventHandler == nullptr) _osEventHandler.reset(new OsEventHandler());
{ _osEventHandler->handleSettingsUpdate(settings::OSEVENTS, getSetting(settings::OSEVENTS));
_osEventHandler = new OsEventHandler(); connect(this, &HyperionDaemon::settingsChanged, _osEventHandler.get(), &OsEventHandler::handleSettingsUpdate);
_osEventHandler->handleSettingsUpdate(settings::OSEVENTS, getSetting(settings::OSEVENTS)); Debug(_log, "Operating System event handler created");
connect(this, &HyperionDaemon::settingsChanged, _osEventHandler, &OsEventHandler::handleSettingsUpdate);
Debug(_log, "Operating System event handler created");
}
startCecHandler(); startCecHandler();
} }
@@ -534,79 +502,10 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
if (_prevType != type) if (_prevType != type)
{ {
// stop all capture interfaces
#ifdef ENABLE_FB
if (_fbGrabber != nullptr)
{
_fbGrabber->stop();
delete _fbGrabber;
_fbGrabber = nullptr;
}
#endif
#ifdef ENABLE_DISPMANX
if (_dispmanx != nullptr)
{
_dispmanx->stop();
delete _dispmanx;
_dispmanx = nullptr;
}
#endif
#ifdef ENABLE_AMLOGIC
if (_amlGrabber != nullptr)
{
_amlGrabber->stop();
delete _amlGrabber;
_amlGrabber = nullptr;
}
#endif
#ifdef ENABLE_OSX
if (_osxGrabber != nullptr)
{
_osxGrabber->stop();
delete _osxGrabber;
_osxGrabber = nullptr;
}
#endif
#ifdef ENABLE_X11
if (_x11Grabber != nullptr)
{
_x11Grabber->stop();
delete _x11Grabber;
_x11Grabber = nullptr;
}
#endif
#ifdef ENABLE_XCB
if (_xcbGrabber != nullptr)
{
_xcbGrabber->stop();
delete _xcbGrabber;
_xcbGrabber = nullptr;
}
#endif
#ifdef ENABLE_QT
if (_qtGrabber != nullptr)
{
_qtGrabber->stop();
delete _qtGrabber;
_qtGrabber = nullptr;
}
#endif
#ifdef ENABLE_DX
if (_dxGrabber != nullptr)
{
_dxGrabber->stop();
delete _dxGrabber;
_dxGrabber = nullptr;
}
#endif
// create/start capture interface // create/start capture interface
if (type == "framebuffer") if (type == "framebuffer")
{ {
if (_fbGrabber == nullptr) createGrabberFramebuffer(grabberConfig);
{
createGrabberFramebuffer(grabberConfig);
}
#ifdef ENABLE_FB #ifdef ENABLE_FB
_fbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _fbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_fbGrabber->tryStart(); _fbGrabber->tryStart();
@@ -614,11 +513,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "dispmanx") else if (type == "dispmanx")
{ {
if (_dispmanx == nullptr) createGrabberDispmanx(grabberConfig);
{
createGrabberDispmanx(grabberConfig);
}
#ifdef ENABLE_DISPMANX #ifdef ENABLE_DISPMANX
if (_dispmanx != nullptr) if (_dispmanx != nullptr)
{ {
@@ -629,10 +524,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "amlogic") else if (type == "amlogic")
{ {
if (_amlGrabber == nullptr) createGrabberAmlogic(grabberConfig);
{
createGrabberAmlogic(grabberConfig);
}
#ifdef ENABLE_AMLOGIC #ifdef ENABLE_AMLOGIC
_amlGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _amlGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_amlGrabber->tryStart(); _amlGrabber->tryStart();
@@ -640,10 +532,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "osx") else if (type == "osx")
{ {
if (_osxGrabber == nullptr) createGrabberOsx(grabberConfig);
{
createGrabberOsx(grabberConfig);
}
#ifdef ENABLE_OSX #ifdef ENABLE_OSX
_osxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _osxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_osxGrabber->tryStart(); _osxGrabber->tryStart();
@@ -651,10 +540,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "x11") else if (type == "x11")
{ {
if (_x11Grabber == nullptr) createGrabberX11(grabberConfig);
{
createGrabberX11(grabberConfig);
}
#ifdef ENABLE_X11 #ifdef ENABLE_X11
_x11Grabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _x11Grabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_x11Grabber->tryStart(); _x11Grabber->tryStart();
@@ -662,10 +548,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "xcb") else if (type == "xcb")
{ {
if (_xcbGrabber == nullptr) createGrabberXcb(grabberConfig);
{
createGrabberXcb(grabberConfig);
}
#ifdef ENABLE_XCB #ifdef ENABLE_XCB
_xcbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _xcbGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_xcbGrabber->tryStart(); _xcbGrabber->tryStart();
@@ -673,10 +556,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "qt") else if (type == "qt")
{ {
if (_qtGrabber == nullptr) createGrabberQt(grabberConfig);
{
createGrabberQt(grabberConfig);
}
#ifdef ENABLE_QT #ifdef ENABLE_QT
_qtGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _qtGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_qtGrabber->tryStart(); _qtGrabber->tryStart();
@@ -684,10 +564,7 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
} }
else if (type == "dx") else if (type == "dx")
{ {
if (_dxGrabber == nullptr) createGrabberDx(grabberConfig);
{
createGrabberDx(grabberConfig);
}
#ifdef ENABLE_DX #ifdef ENABLE_DX
_dxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE)); _dxGrabber->handleSettingsUpdate(settings::SYSTEMCAPTURE, getSetting(settings::SYSTEMCAPTURE));
_dxGrabber->tryStart(); _dxGrabber->tryStart();
@@ -704,21 +581,17 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
else if (settingsType == settings::V4L2) else if (settingsType == settings::V4L2)
{ {
#if defined(ENABLE_V4L2) || defined(ENABLE_MF) #if defined(ENABLE_V4L2) || defined(ENABLE_MF)
if (_videoGrabber == nullptr) _videoGrabber.reset(new VideoWrapper());
{ _videoGrabber->handleSettingsUpdate(settings::V4L2, getSetting(settings::V4L2));
_videoGrabber = new VideoWrapper();
_videoGrabber->handleSettingsUpdate(settings::V4L2, getSetting(settings::V4L2));
#if defined(ENABLE_MF) #if defined(ENABLE_MF)
Debug(_log, "Media Foundation grabber created"); Debug(_log, "Media Foundation grabber created");
#elif defined(ENABLE_V4L2) #elif defined(ENABLE_V4L2)
Debug(_log, "V4L2 grabber created"); Debug(_log, "V4L2 grabber created");
#endif #endif
// connect to HyperionDaemon signal
// connect to HyperionDaemon signal connect(this, &HyperionDaemon::videoMode, _videoGrabber.get(), &VideoWrapper::setVideoMode);
connect(this, &HyperionDaemon::videoMode, _videoGrabber, &VideoWrapper::setVideoMode); connect(this, &HyperionDaemon::settingsChanged, _videoGrabber.get(), &VideoWrapper::handleSettingsUpdate);
connect(this, &HyperionDaemon::settingsChanged, _videoGrabber, &VideoWrapper::handleSettingsUpdate);
}
#else #else
Debug(_log, "The v4l2 grabber is not supported on this platform"); Debug(_log, "The v4l2 grabber is not supported on this platform");
#endif #endif
@@ -727,15 +600,12 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
{ {
#ifdef ENABLE_AUDIO #ifdef ENABLE_AUDIO
// Create Audio Grabber // Create Audio Grabber
if (_audioGrabber == nullptr) _audioGrabber.reset(new AudioWrapper());
{ _audioGrabber->handleSettingsUpdate(settings::AUDIO, getSetting(settings::AUDIO));
_audioGrabber = new AudioWrapper();
_audioGrabber->handleSettingsUpdate(settings::AUDIO, getSetting(settings::AUDIO));
connect(this, &HyperionDaemon::settingsChanged, _audioGrabber, &AudioWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _audioGrabber.get(), &AudioWrapper::handleSettingsUpdate);
Debug(_log, "Audio grabber created"); Debug(_log, "Audio grabber created");
}
#else #else
Debug(_log, "Audio capture not supported on this platform"); Debug(_log, "Audio capture not supported on this platform");
#endif #endif
@@ -745,15 +615,13 @@ void HyperionDaemon::handleSettingsUpdate(settings::type settingsType, const QJs
void HyperionDaemon::createGrabberDispmanx(const QJsonObject& /*grabberConfig*/) void HyperionDaemon::createGrabberDispmanx(const QJsonObject& /*grabberConfig*/)
{ {
#ifdef ENABLE_DISPMANX #ifdef ENABLE_DISPMANX
_dispmanx = new DispmanxWrapper( _dispmanx.reset(new DispmanxWrapper(
_grabber_frequency, _grabber_frequency,
_grabber_pixelDecimation _grabber_pixelDecimation
); ));
if (!_dispmanx->available) if (!_dispmanx->available)
{ {
delete _dispmanx;
_dispmanx = nullptr;
Debug(_log, "The dispmanx framegrabber is not supported on this platform"); Debug(_log, "The dispmanx framegrabber is not supported on this platform");
return; return;
} }
@@ -761,8 +629,8 @@ void HyperionDaemon::createGrabberDispmanx(const QJsonObject& /*grabberConfig*/)
_dispmanx->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _dispmanx->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _dispmanx, &DispmanxWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _dispmanx.get(), &DispmanxWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _dispmanx, &DispmanxWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _dispmanx.get(), &DispmanxWrapper::handleSettingsUpdate);
Info(_log, "DISPMANX frame grabber created"); Info(_log, "DISPMANX frame grabber created");
#else #else
@@ -773,15 +641,15 @@ void HyperionDaemon::createGrabberDispmanx(const QJsonObject& /*grabberConfig*/)
void HyperionDaemon::createGrabberAmlogic(const QJsonObject& /*grabberConfig*/) void HyperionDaemon::createGrabberAmlogic(const QJsonObject& /*grabberConfig*/)
{ {
#ifdef ENABLE_AMLOGIC #ifdef ENABLE_AMLOGIC
_amlGrabber = new AmlogicWrapper( _amlGrabber.reset(new AmlogicWrapper(
_grabber_frequency, _grabber_frequency,
_grabber_pixelDecimation _grabber_pixelDecimation
); ));
_amlGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _amlGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _amlGrabber, &AmlogicWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _amlGrabber.get(), &AmlogicWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _amlGrabber, &AmlogicWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _amlGrabber.get(), &AmlogicWrapper::handleSettingsUpdate);
Info(_log, "AMLOGIC grabber created"); Info(_log, "AMLOGIC grabber created");
#else #else
@@ -792,16 +660,17 @@ void HyperionDaemon::createGrabberAmlogic(const QJsonObject& /*grabberConfig*/)
void HyperionDaemon::createGrabberX11(const QJsonObject& /*grabberConfig*/) void HyperionDaemon::createGrabberX11(const QJsonObject& /*grabberConfig*/)
{ {
#ifdef ENABLE_X11 #ifdef ENABLE_X11
_x11Grabber = new X11Wrapper( qDebug() << "createGrabberX11";
_x11Grabber.reset(new X11Wrapper(
_grabber_frequency, _grabber_frequency,
_grabber_pixelDecimation, _grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom _grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
); ));
_x11Grabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _x11Grabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _x11Grabber, &X11Wrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _x11Grabber.get(), &X11Wrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _x11Grabber, &X11Wrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _x11Grabber.get(), &X11Wrapper::handleSettingsUpdate);
Info(_log, "X11 grabber created"); Info(_log, "X11 grabber created");
#else #else
@@ -812,16 +681,16 @@ void HyperionDaemon::createGrabberX11(const QJsonObject& /*grabberConfig*/)
void HyperionDaemon::createGrabberXcb(const QJsonObject& /*grabberConfig*/) void HyperionDaemon::createGrabberXcb(const QJsonObject& /*grabberConfig*/)
{ {
#ifdef ENABLE_XCB #ifdef ENABLE_XCB
_xcbGrabber = new XcbWrapper( _xcbGrabber.reset(new XcbWrapper(
_grabber_frequency, _grabber_frequency,
_grabber_pixelDecimation, _grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom _grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
); ));
_xcbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _xcbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _xcbGrabber, &XcbWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _xcbGrabber.get(), &XcbWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _xcbGrabber, &XcbWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _xcbGrabber.get(), &XcbWrapper::handleSettingsUpdate);
Info(_log, "XCB grabber created"); Info(_log, "XCB grabber created");
#else #else
@@ -832,16 +701,16 @@ void HyperionDaemon::createGrabberXcb(const QJsonObject& /*grabberConfig*/)
void HyperionDaemon::createGrabberQt(const QJsonObject& grabberConfig) void HyperionDaemon::createGrabberQt(const QJsonObject& grabberConfig)
{ {
#ifdef ENABLE_QT #ifdef ENABLE_QT
_qtGrabber = new QtWrapper( _qtGrabber.reset(new QtWrapper(
_grabber_frequency, _grabber_frequency,
grabberConfig["input"].toInt(0), grabberConfig["input"].toInt(0),
_grabber_pixelDecimation, _grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom _grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
); ));
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _qtGrabber, &QtWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _qtGrabber.get(), &QtWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _qtGrabber, &QtWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _qtGrabber.get(), &QtWrapper::handleSettingsUpdate);
Info(_log, "Qt grabber created"); Info(_log, "Qt grabber created");
#else #else
@@ -852,16 +721,16 @@ void HyperionDaemon::createGrabberQt(const QJsonObject& grabberConfig)
void HyperionDaemon::createGrabberDx(const QJsonObject& grabberConfig) void HyperionDaemon::createGrabberDx(const QJsonObject& grabberConfig)
{ {
#ifdef ENABLE_DX #ifdef ENABLE_DX
_dxGrabber = new DirectXWrapper( _dxGrabber.reset(new DirectXWrapper(
_grabber_frequency, _grabber_frequency,
grabberConfig["display"].toInt(0), grabberConfig["display"].toInt(0),
_grabber_pixelDecimation, _grabber_pixelDecimation,
_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom _grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom
); ));
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _dxGrabber, &DirectXWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _dxGrabber.get(), &DirectXWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _dxGrabber, &DirectXWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _dxGrabber.get(), &DirectXWrapper::handleSettingsUpdate);
Info(_log, "DirectX grabber created"); Info(_log, "DirectX grabber created");
#else #else
@@ -876,15 +745,15 @@ void HyperionDaemon::createGrabberFramebuffer(const QJsonObject& grabberConfig)
int fbIdx = grabberConfig["input"].toInt(0); int fbIdx = grabberConfig["input"].toInt(0);
QString devicePath = QString("/dev/fb%1").arg(fbIdx); QString devicePath = QString("/dev/fb%1").arg(fbIdx);
_fbGrabber = new FramebufferWrapper( _fbGrabber.reset(new FramebufferWrapper(
_grabber_frequency, _grabber_frequency,
devicePath, devicePath,
_grabber_pixelDecimation _grabber_pixelDecimation
); ));
_fbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _fbGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _fbGrabber, &FramebufferWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _fbGrabber.get(), &FramebufferWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _fbGrabber, &FramebufferWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _fbGrabber.get(), &FramebufferWrapper::handleSettingsUpdate);
Info(_log, "Framebuffer grabber created"); Info(_log, "Framebuffer grabber created");
#else #else
@@ -896,16 +765,16 @@ void HyperionDaemon::createGrabberOsx(const QJsonObject& grabberConfig)
{ {
#ifdef ENABLE_OSX #ifdef ENABLE_OSX
// Construct and start the osx grabber if the configuration is present // Construct and start the osx grabber if the configuration is present
_osxGrabber = new OsxWrapper( _osxGrabber.reset(new OsxWrapper(
_grabber_frequency, _grabber_frequency,
grabberConfig["input"].toInt(0), grabberConfig["input"].toInt(0),
_grabber_pixelDecimation _grabber_pixelDecimation
); ));
_osxGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom); _osxGrabber->setCropping(_grabber_cropLeft, _grabber_cropRight, _grabber_cropTop, _grabber_cropBottom);
// connect to HyperionDaemon signal // connect to HyperionDaemon signal
connect(this, &HyperionDaemon::videoMode, _osxGrabber, &OsxWrapper::setVideoMode); connect(this, &HyperionDaemon::videoMode, _osxGrabber.get(), &OsxWrapper::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, _osxGrabber, &OsxWrapper::handleSettingsUpdate); connect(this, &HyperionDaemon::settingsChanged, _osxGrabber.get(), &OsxWrapper::handleSettingsUpdate);
Info(_log, "OSX grabber created"); Info(_log, "OSX grabber created");
#else #else

View File

@@ -199,33 +199,36 @@ private:
#if defined(ENABLE_EFFECTENGINE) #if defined(ENABLE_EFFECTENGINE)
PythonInit* _pyInit; PythonInit* _pyInit;
#endif #endif
SSDPHandler* _ssdp;
WebServer* _webserver; WebServer* _webserver;
WebServer* _sslWebserver; WebServer* _sslWebserver;
JsonServer* _jsonServer; JsonServer* _jsonServer;
VideoWrapper* _videoGrabber;
DispmanxWrapper* _dispmanx;
X11Wrapper* _x11Grabber;
XcbWrapper* _xcbGrabber;
AmlogicWrapper* _amlGrabber;
FramebufferWrapper* _fbGrabber;
OsxWrapper* _osxGrabber;
QtWrapper* _qtGrabber;
DirectXWrapper* _dxGrabber;
AudioWrapper* _audioGrabber;
SSDPHandler* _ssdp;
EventHandler* _eventHandler;
OsEventHandler* _osEventHandler;
EventScheduler* _eventScheduler;
#ifdef ENABLE_CEC
CECHandler* _cecHandler;
#endif
QScopedPointer<EventHandler> _eventHandler;
QScopedPointer<OsEventHandler> _osEventHandler;
QScopedPointer<EventScheduler> _eventScheduler;
QScopedPointer<VideoWrapper> _videoGrabber;
QScopedPointer<DispmanxWrapper> _dispmanx;
QScopedPointer<X11Wrapper> _x11Grabber;
QScopedPointer<XcbWrapper> _xcbGrabber;
QScopedPointer<AmlogicWrapper> _amlGrabber;
QScopedPointer<FramebufferWrapper> _fbGrabber;
QScopedPointer<OsxWrapper> _osxGrabber;
QScopedPointer<QtWrapper> _qtGrabber;
QScopedPointer<DirectXWrapper> _dxGrabber;
QScopedPointer<AudioWrapper> _audioGrabber;
#ifdef ENABLE_CEC
CECHandler* _cecHandler;
#endif
#if defined(ENABLE_FLATBUF_SERVER) #if defined(ENABLE_FLATBUF_SERVER)
FlatBufferServer* _flatBufferServer; FlatBufferServer* _flatBufferServer;
#endif #endif
#if defined(ENABLE_PROTOBUF_SERVER) #if defined(ENABLE_PROTOBUF_SERVER)
ProtoServer* _protoServer; ProtoServer* _protoServer;
#endif #endif
int _grabber_width; int _grabber_width;
int _grabber_height; int _grabber_height;
int _grabber_pixelDecimation; int _grabber_pixelDecimation;
@@ -234,9 +237,8 @@ CECHandler* _cecHandler;
int _grabber_cropRight; int _grabber_cropRight;
int _grabber_cropTop; int _grabber_cropTop;
int _grabber_cropBottom; int _grabber_cropBottom;
QString _prevType; QString _prevType;
VideoMode _currVideoMode; VideoMode _currVideoMode;
SettingsManager* _settingsManager;
QScopedPointer<SettingsManager> _settingsManager;
}; };

View File

@@ -45,7 +45,7 @@ SysTray::SysTray(HyperionDaemon *hyperiond)
// instance changes // instance changes
connect(_instanceManager, &HyperionIManager::instanceStateChanged, this, &SysTray::handleInstanceStateChange); connect(_instanceManager, &HyperionIManager::instanceStateChanged, this, &SysTray::handleInstanceStateChange);
connect(this, &SysTray::signalEvent, EventHandler::getInstance(), &EventHandler::handleEvent); connect(this, &SysTray::signalEvent, EventHandler::getInstance().data(), &EventHandler::handleEvent);
} }
SysTray::~SysTray() SysTray::~SysTray()