Start SmartPointers (#1679)

* Refactor to fix #1671

* Add GUI/NonGUI mode to info page

* Do not show lock config, if in non-UI mode

* Updae Changelog

* Correct includes

* Ensure key member initialization - RGB Channels

* Ensure key member initialization - WebServer

* Update RGBChannels

* Fix initialization order

* Fix key when inserting new logger in LoggerMap,
Prepare logBuffer-JSON snapshot view in LoggerManager,
Increase buffered loglines to 500

* Fix Memory leak in GrabberWrapper

* Fix Memory leak in BlackBorderProcessor

* Fix Memory leak in BlackBorderProcessor

* use ninja generator under macos

* Fix BGEffectHandler destruction

* Fix Mdns code

* Clear list after applying qDeleteAll

* Fix deletion of CecHandler

* Fix memory leak caused by wrong buffer allocation

* Remove extra pixel consistently

* Change mDNS to Qt SmartPointers

* Correct removal

* Fix usage of _width/_height (they are the output resolution, not the screen resolution)
That avoids unnecessary resizing of the output image with every transferFrame call

* Move main non Thread Objects to Smart Pointers

* Refactor Hyperion Daemon unsing smartpointers

* Correction

* Correct typos/ align text

* Fix startGrabberDispmanx

* Fix startGrabberDispmanx

* Address CodeQL finding

* Create Screen grabbers via Template

* Fix typo

* Change way of logging

* Revert change

* Address deprecation warning

* Correct auto screen grabber evaluation

---------

Co-authored-by: Paulchen-Panther <16664240+Paulchen-Panther@users.noreply.github.com>
This commit is contained in:
LordGrey
2024-02-25 17:35:39 +01:00
committed by GitHub
parent bb40778a3d
commit 31df065c0f
65 changed files with 818 additions and 927 deletions

View File

@@ -2,13 +2,13 @@
#include "FramebufferWrapper.h"
FramebufferWrapper::FramebufferWrapper( int updateRate_Hz,
const QString & device,
int deviceIdx,
int pixelDecimation,
int cropLeft, int cropRight,
int cropTop, int cropBottom
) :
_timer(this),
_grabber(device)
_grabber(deviceIdx)
{
_grabber.setFramerate(updateRate_Hz);
_grabber.setCropping(cropLeft, cropRight, cropTop, cropBottom);

View File

@@ -12,7 +12,7 @@ class FramebufferWrapper : public QObject
public:
FramebufferWrapper( int updateRate_Hz=GrabberWrapper::DEFAULT_RATE_HZ,
const QString & device = "/dev/fb0",
int deviceIdx = 0,
int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION,
int cropLeft=0, int cropRight=0,
int cropTop=0, int cropBottom=0

View File

@@ -50,7 +50,7 @@ int main(int argc, char ** argv)
// create the option parser and initialize all parameters
Parser parser("FrameBuffer capture application for Hyperion. Will automatically search a Hyperion server if -a option isn't used. Please note that if you have more than one server running it's more or less random which one will be used.");
Option & argDevice = parser.add<Option> ('d', "device", "Set the framebuffer device [default: %1]", "/dev/fb0");
IntOption & argDeviceIdx = parser.add<IntOption> ('d', "deviceIdx", "Set the framebuffer device index [default: %1]", 0);
IntOption & argFps = parser.add<IntOption> ('f', "framerate", QString("Capture frame rate. Range %1-%2fps").arg(GrabberWrapper::DEFAULT_MIN_GRAB_RATE_HZ).arg(GrabberWrapper::DEFAULT_MAX_GRAB_RATE_HZ), QString::number(GrabberWrapper::DEFAULT_RATE_HZ), GrabberWrapper::DEFAULT_MIN_GRAB_RATE_HZ, GrabberWrapper::DEFAULT_MAX_GRAB_RATE_HZ);
IntOption & argSizeDecimation = parser.add<IntOption> ('s', "size-decimator", "Decimation factor for the output image size [default=%1]", QString::number(GrabberWrapper::DEFAULT_PIXELDECIMATION), 1);
@@ -88,7 +88,7 @@ int main(int argc, char ** argv)
FramebufferWrapper fbWrapper(
argFps.getInt(parser),
argDevice.value(parser),
argDeviceIdx.getInt(parser),
argSizeDecimation.getInt(parser),
argCropLeft.getInt(parser),
argCropRight.getInt(parser),

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,12 @@
#pragma once
#ifndef HYPERIOND_H
#define HYPERIOND_H
#include <memory>
#include <QApplication>
#include <QObject>
#include <QJsonObject>
#include <QScopedPointer>
#include <hyperion/HyperionIManager.h>
@@ -110,7 +114,7 @@ public:
///
/// @brief Get webserver pointer (systray)
///
WebServer *getWebServerInstance() { return _webserver; }
WebServer *getWebServerInstance() { return _webserver.data(); }
///
/// @brief Get the current videoMode
@@ -122,14 +126,11 @@ public:
///
QJsonDocument getSetting(settings::type type) const;
void startNetworkServices();
void startEventServices();
static HyperionDaemon* getInstance() { return daemon; }
static HyperionDaemon* daemon;
public slots:
void freeObjects();
void stoppServices();
signals:
///////////////////////////////////////
@@ -176,67 +177,100 @@ private slots:
void handleInstanceStateChange(InstanceState state, quint8 instance);
private:
void createGrabberDispmanx(const QJsonObject & grabberConfig);
void createGrabberAmlogic(const QJsonObject & grabberConfig);
void createGrabberFramebuffer(const QJsonObject & grabberConfig);
void createGrabberOsx(const QJsonObject & grabberConfig);
void createGrabberX11(const QJsonObject & grabberConfig);
void createGrabberXcb(const QJsonObject & grabberConfig);
void createGrabberQt(const QJsonObject & grabberConfig);
void createGrabberDx(const QJsonObject & grabberConfig);
void createGrabberAudio(const QJsonObject & grabberConfig);
void startCecHandler();
void stopCecHandler();
void createNetworkServices();
void startNetworkServices();
void stopNetworkServices();
void startEventServices();
void stopEventServices();
void startGrabberServices();
void stopGrabberServices();
void updateScreenGrabbers(const QJsonDocument& grabberConfig);
void updateVideoGrabbers(const QJsonObject& grabberConfig);
void updateAudioGrabbers(const QJsonObject& grabberConfig);
QString evalScreenGrabberType();
template<typename GrabberType>
void startGrabber(QScopedPointer<GrabberWrapper>& sharedGrabber, const QJsonDocument& grabberConfig, bool enableGrabber = true) {
QString typeName = GrabberType::GRABBERTYPE;
if (!enableGrabber)
{
Debug(_log, "The %s grabber is not enabled on this platform", QSTRING_CSTR(typeName));
sharedGrabber.reset();
return;
}
std::unique_ptr<GrabberType> grabber = std::make_unique<GrabberType>(grabberConfig);
if (!grabber)
{
Error(_log, "Failed to cast grabber type %s to GrabberWrapper", QSTRING_CSTR(typeName));
}
else
{
if (!grabber->isAvailable())
{
Debug(_log, "The %s grabber is not available on this platform", QSTRING_CSTR(typeName));
return;
}
connect(this, &HyperionDaemon::videoMode, grabber.get(), &GrabberType::setVideoMode);
connect(this, &HyperionDaemon::settingsChanged, grabber.get(), &GrabberType::handleSettingsUpdate);
Info(_log, "%s grabber created", QSTRING_CSTR(typeName));
grabber->tryStart();
// Transfer ownership to sharedGrabber
sharedGrabber.reset(grabber.release());
}
}
Logger* _log;
/// Core services
QScopedPointer<HyperionIManager> _instanceManager;
QScopedPointer<SettingsManager> _settingsManager;
Logger* _log;
HyperionIManager* _instanceManager;
AuthManager* _authManager;
#ifdef ENABLE_MDNS
MdnsProvider* _mDNSProvider;
#endif
NetOrigin* _netOrigin;
#if defined(ENABLE_EFFECTENGINE)
PythonInit* _pyInit;
#endif
WebServer* _webserver;
WebServer* _sslWebserver;
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;
/// Network services
QScopedPointer<AuthManager> _authManager;
QScopedPointer<NetOrigin> _netOrigin;
QScopedPointer<JsonServer, QScopedPointerDeleteLater> _jsonServer;
QScopedPointer<WebServer, QScopedPointerDeleteLater> _webserver;
QScopedPointer<WebServer, QScopedPointerDeleteLater> _sslWebserver;
QScopedPointer<SSDPHandler, QScopedPointerDeleteLater> _ssdp;
#ifdef ENABLE_MDNS
QScopedPointer<MdnsProvider, QScopedPointerDeleteLater> _mDNSProvider;
#endif
#if defined(ENABLE_FLATBUF_SERVER)
QScopedPointer<FlatBufferServer, QScopedPointerDeleteLater> _flatBufferServer;
#endif
#if defined(ENABLE_PROTOBUF_SERVER)
QScopedPointer<ProtoServer, QScopedPointerDeleteLater> _protoServer;
#endif
#if defined(ENABLE_FLATBUF_SERVER)
FlatBufferServer* _flatBufferServer;
#endif
#if defined(ENABLE_PROTOBUF_SERVER)
ProtoServer* _protoServer;
#endif
int _grabber_width;
int _grabber_height;
int _grabber_pixelDecimation;
int _grabber_frequency;
int _grabber_cropLeft;
int _grabber_cropRight;
int _grabber_cropTop;
int _grabber_cropBottom;
/// Event services
QScopedPointer<EventHandler> _eventHandler;
QScopedPointer<OsEventHandler> _osEventHandler;
QScopedPointer<EventScheduler> _eventScheduler;
#ifdef ENABLE_CEC
QScopedPointer<CECHandler> _cecHandler;
#endif
/// Grabber services
QScopedPointer<GrabberWrapper> _screenGrabber;
QScopedPointer<VideoWrapper> _videoGrabber;
QScopedPointer<AudioWrapper> _audioGrabber;
QString _prevType;
VideoMode _currVideoMode;
SettingsManager* _settingsManager;
};
#endif // HYPERIOND_H

View File

@@ -389,9 +389,6 @@ int main(int argc, char** argv)
Error(log, "Hyperion aborted: %s", e.what());
}
// delete components
Logger::deleteInstance();
#ifdef _WIN32
if (parser.isSet(consoleOption))
{

View File

@@ -45,7 +45,7 @@ SysTray::SysTray(HyperionDaemon *hyperiond)
// instance changes
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()