mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
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:
@@ -13,10 +13,9 @@ class EventHandler : public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
EventHandler();
|
||||
~EventHandler() override;
|
||||
|
||||
static EventHandler* getInstance();
|
||||
static QScopedPointer<EventHandler>& getInstance();
|
||||
|
||||
public slots:
|
||||
|
||||
@@ -40,6 +39,12 @@ protected:
|
||||
Logger * _log {};
|
||||
|
||||
private:
|
||||
EventHandler();
|
||||
EventHandler(const EventHandler&) = delete;
|
||||
EventHandler& operator=(const EventHandler&) = delete;
|
||||
|
||||
static QScopedPointer<EventHandler> instance;
|
||||
|
||||
bool _isSuspended;
|
||||
bool _isIdle;
|
||||
};
|
||||
|
@@ -12,6 +12,9 @@ class AmlogicWrapper : public GrabberWrapper
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "Amlogic";
|
||||
|
||||
///
|
||||
/// Constructs the Amlogic frame grabber
|
||||
///
|
||||
@@ -22,6 +25,12 @@ public:
|
||||
AmlogicWrapper(int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION,
|
||||
int updateRate_Hz=GrabberWrapper::DEFAULT_RATE_HZ);
|
||||
|
||||
///
|
||||
/// Constructs the Amlogic frame grabber from configuration settings
|
||||
///
|
||||
AmlogicWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
|
||||
public slots:
|
||||
///
|
||||
/// Performs a single frame grab and computes the led-colors
|
||||
|
@@ -6,6 +6,8 @@
|
||||
class DirectXWrapper: public GrabberWrapper
|
||||
{
|
||||
public:
|
||||
static constexpr const char* GRABBERTYPE = "DirectX";
|
||||
|
||||
///
|
||||
/// Constructs the DirectX grabber with a specified grab size and update rate.
|
||||
///
|
||||
@@ -25,6 +27,11 @@ public:
|
||||
int cropTop=0, int cropBottom=0
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the QT frame grabber from configuration settings
|
||||
///
|
||||
DirectXWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
///
|
||||
/// Destructor of this DirectX grabber. Releases any claimed resources.
|
||||
///
|
||||
|
@@ -36,9 +36,9 @@ public:
|
||||
///
|
||||
/// @brief Determine if the bcm library is available.
|
||||
///
|
||||
/// @return Zero, on success (i.e. library is present), else negative
|
||||
/// @return true, on success (i.e. library is present), else false
|
||||
///
|
||||
bool isAvailable();
|
||||
bool isAvailable() override;
|
||||
|
||||
///
|
||||
/// @brief Opens the input device.
|
||||
|
@@ -13,6 +13,9 @@ class DispmanxWrapper: public GrabberWrapper
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "DispmanX";
|
||||
|
||||
///
|
||||
/// Constructs the dispmanx frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
@@ -23,9 +26,12 @@ public:
|
||||
int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION
|
||||
);
|
||||
|
||||
bool screenInit();
|
||||
///
|
||||
/// Constructs the QT frame grabber from configuration settings
|
||||
///
|
||||
DispmanxWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
bool available = false;
|
||||
bool screenInit();
|
||||
|
||||
///
|
||||
/// Starts the grabber which produces led values with the specified update rate
|
||||
|
@@ -17,7 +17,7 @@ public:
|
||||
///
|
||||
/// @param[in] device The framebuffer device name/path
|
||||
///
|
||||
FramebufferFrameGrabber(const QString & device="/dev/fb0");
|
||||
FramebufferFrameGrabber(int deviceIdx = 0);
|
||||
|
||||
~FramebufferFrameGrabber() override;
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
///@brief Set new width and height for framegrabber, overwrite Grabber.h implementation
|
||||
bool setWidthHeight(int width, int height) override;
|
||||
|
||||
QString getPath() const {return _fbDevice;}
|
||||
QString getPath() const {return QString("/dev/fb%1").arg(_input);}
|
||||
|
||||
///
|
||||
/// @brief Discover Framebuffer screens available (for configuration).
|
||||
@@ -62,7 +62,7 @@ private:
|
||||
bool closeDevice();
|
||||
bool getScreenInfo();
|
||||
|
||||
/// Framebuffer device e.g. /dev/fb0
|
||||
// /// Framebuffer device e.g. /dev/fb0
|
||||
QString _fbDevice;
|
||||
|
||||
int _fbfd;
|
||||
|
@@ -12,18 +12,26 @@ class FramebufferWrapper: public GrabberWrapper
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "FB";
|
||||
|
||||
///
|
||||
/// Constructs the framebuffer frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
/// @param[in] updateRate_Hz The image grab rate [Hz]
|
||||
/// @param[in] device Framebuffer device name/path
|
||||
/// @param[in] deviceIdx Framebuffer device index
|
||||
/// @param[in] pixelDecimation Decimation factor for image [pixels]
|
||||
///
|
||||
FramebufferWrapper( int updateRate_Hz=GrabberWrapper::DEFAULT_RATE_HZ,
|
||||
const QString & device = "/dev/fb0",
|
||||
int deviceIdx = 0,
|
||||
int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the QT frame grabber from configuration settings
|
||||
///
|
||||
FramebufferWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
public slots:
|
||||
///
|
||||
/// Performs a single frame grab and computes the led-colors
|
||||
|
@@ -11,6 +11,8 @@ class OsxWrapper: public GrabberWrapper
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "OSX";
|
||||
///
|
||||
/// Constructs the osx frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
@@ -23,6 +25,12 @@ public:
|
||||
int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the QT frame grabber from configuration settings
|
||||
///
|
||||
OsxWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
|
||||
public slots:
|
||||
///
|
||||
/// Performs a single frame grab and computes the led-colors
|
||||
|
@@ -1,5 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <QJsonObject>
|
||||
#include <QStringLiteral>
|
||||
|
||||
#include <hyperion/GrabberWrapper.h>
|
||||
#include <grabber/qt/QtGrabber.h>
|
||||
|
||||
@@ -8,7 +11,10 @@
|
||||
///
|
||||
class QtWrapper: public GrabberWrapper
|
||||
{
|
||||
|
||||
public:
|
||||
static constexpr const char* GRABBERTYPE = "Qt";
|
||||
|
||||
///
|
||||
/// Constructs the QT frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
@@ -19,7 +25,6 @@ public:
|
||||
/// @param[in] cropRight Remove from right [pixels]
|
||||
/// @param[in] cropTop Remove from top [pixels]
|
||||
/// @param[in] cropBottom Remove from bottom [pixels]
|
||||
|
||||
///
|
||||
QtWrapper( int updateRate_Hz=GrabberWrapper::DEFAULT_RATE_HZ,
|
||||
int display=0,
|
||||
@@ -28,6 +33,11 @@ public:
|
||||
int cropTop=0, int cropBottom=0
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the QT frame grabber from configuration settings
|
||||
///
|
||||
QtWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
///
|
||||
/// Starts the grabber which produces led values with the specified update rate
|
||||
///
|
||||
|
@@ -7,7 +7,6 @@
|
||||
#undef None
|
||||
#endif
|
||||
|
||||
|
||||
///
|
||||
/// The X11Wrapper uses an instance of the X11Grabber to obtain ImageRgb's from the displayed content.
|
||||
/// This ImageRgb is processed to a ColorRgb for each led and committed to the attached Hyperion.
|
||||
@@ -15,6 +14,8 @@
|
||||
class X11Wrapper: public GrabberWrapper
|
||||
{
|
||||
public:
|
||||
static constexpr const char* GRABBERTYPE = "X11";
|
||||
|
||||
///
|
||||
/// Constructs the X11 frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
@@ -27,6 +28,11 @@ public:
|
||||
int cropTop=0, int cropBottom=0
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the X11 frame grabber from configuration settings
|
||||
///
|
||||
X11Wrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
///
|
||||
/// Destructor of this frame grabber. Releases any claimed resources.
|
||||
///
|
||||
|
@@ -11,12 +11,30 @@
|
||||
class XcbWrapper: public GrabberWrapper
|
||||
{
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "XCB";
|
||||
|
||||
///
|
||||
/// Constructs the XCB frame grabber with a specified grab size and update rate.
|
||||
///
|
||||
/// @param[in] updateRate_Hz The image grab rate [Hz]
|
||||
/// @param[in] pixelDecimation Decimation factor for image [pixels]
|
||||
/// @param[in] cropLeft Remove from left [pixels]
|
||||
/// @param[in] cropRight Remove from right [pixels]
|
||||
/// @param[in] cropTop Remove from top [pixels]
|
||||
/// @param[in] cropBottom Remove from bottom [pixels]
|
||||
///
|
||||
XcbWrapper( int updateRate_Hz=GrabberWrapper::DEFAULT_RATE_HZ,
|
||||
int pixelDecimation=GrabberWrapper::DEFAULT_PIXELDECIMATION,
|
||||
int cropLeft=0, int cropRight=0,
|
||||
int cropTop=0, int cropBottom=0
|
||||
);
|
||||
|
||||
///
|
||||
/// Constructs the XCB frame grabber from configuration settings
|
||||
///
|
||||
XcbWrapper(const QJsonDocument& grabberConfig = QJsonDocument());
|
||||
|
||||
~XcbWrapper() override;
|
||||
|
||||
public slots:
|
||||
|
@@ -113,6 +113,13 @@ public:
|
||||
|
||||
QString getGrabberName() const { return _grabberName; }
|
||||
|
||||
///
|
||||
/// @brief Determine if the grabber is available.
|
||||
///
|
||||
/// @return true, on success (i.e. library is present), else false
|
||||
///
|
||||
virtual bool isAvailable() { return _isAvailable; }
|
||||
|
||||
public slots:
|
||||
|
||||
virtual void handleEvent(Event event) {}
|
||||
@@ -168,10 +175,15 @@ protected:
|
||||
|
||||
// Device states
|
||||
|
||||
/// Is the device available?
|
||||
bool _isAvailable;
|
||||
|
||||
/// Is the device enabled?
|
||||
bool _isEnabled;
|
||||
|
||||
/// Is the device in error state and stopped?
|
||||
bool _isDeviceInError;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
@@ -32,6 +32,14 @@ class GrabberWrapper : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
static constexpr const char* GRABBERTYPE = "Base";
|
||||
|
||||
template<typename GrabberType>
|
||||
static QSharedPointer<GrabberType> create(const QJsonDocument& config) {
|
||||
return QSharedPointer<GrabberType>::create(config);
|
||||
}
|
||||
|
||||
GrabberWrapper(const QString& grabberName, Grabber * ggrabber,int updateRate_Hz = DEFAULT_RATE_HZ);
|
||||
|
||||
~GrabberWrapper() override;
|
||||
@@ -71,6 +79,11 @@ public:
|
||||
///
|
||||
virtual bool isActive() const;
|
||||
|
||||
virtual bool isAvailable() { return _isAvailable; }
|
||||
|
||||
|
||||
QString getName() { return _grabberName; }
|
||||
|
||||
///
|
||||
/// @brief Get active grabber name
|
||||
/// @param hyperionInd The instance index
|
||||
@@ -195,4 +208,6 @@ protected:
|
||||
|
||||
/// The image used for grabbing frames
|
||||
Image<ColorRgb> _image;
|
||||
|
||||
bool _isAvailable;
|
||||
};
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#include <QByteArray>
|
||||
#include <QMap>
|
||||
#include <QJsonArray>
|
||||
#include <QScopedPointer>
|
||||
#include <QSharedPointer>
|
||||
|
||||
// Utility includes
|
||||
@@ -39,21 +40,17 @@ private:
|
||||
///
|
||||
// Run MdnsBrowser as singleton
|
||||
MdnsBrowser(QObject* parent = nullptr);
|
||||
~MdnsBrowser() override;
|
||||
|
||||
public:
|
||||
|
||||
static MdnsBrowser& getInstance()
|
||||
{
|
||||
static MdnsBrowser* instance = new MdnsBrowser();
|
||||
return *instance;
|
||||
}
|
||||
|
||||
MdnsBrowser(const MdnsBrowser&) = delete;
|
||||
MdnsBrowser(MdnsBrowser&&) = delete;
|
||||
MdnsBrowser& operator=(const MdnsBrowser&) = delete;
|
||||
MdnsBrowser& operator=(MdnsBrowser&&) = delete;
|
||||
|
||||
static QScopedPointer<MdnsBrowser> instance;
|
||||
|
||||
public:
|
||||
~MdnsBrowser() override;
|
||||
static QScopedPointer<MdnsBrowser>& getInstance();
|
||||
|
||||
QMdnsEngine::Service getFirstService(const QByteArray& serviceType, const QString& filter = ".*", const std::chrono::milliseconds waitTime = DEFAULT_DISCOVER_TIMEOUT) const;
|
||||
QJsonArray getServicesDiscoveredJson(const QByteArray& serviceType, const QString& filter = ".*", const std::chrono::milliseconds waitTime = std::chrono::milliseconds{ 0 }) const;
|
||||
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include <QAtomicInteger>
|
||||
#include <QList>
|
||||
#include <QJsonArray>
|
||||
#include <QScopedPointer>
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
||||
#include <QRecursiveMutex>
|
||||
@@ -106,8 +107,19 @@ class LoggerManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
// Run LoggerManager as singleton
|
||||
LoggerManager();
|
||||
LoggerManager(const LoggerManager&) = delete;
|
||||
LoggerManager(LoggerManager&&) = delete;
|
||||
LoggerManager& operator=(const LoggerManager&) = delete;
|
||||
LoggerManager& operator=(LoggerManager&&) = delete;
|
||||
|
||||
static QScopedPointer<LoggerManager> instance;
|
||||
|
||||
public:
|
||||
static LoggerManager* getInstance();
|
||||
~LoggerManager() override;
|
||||
static QScopedPointer<LoggerManager>& getInstance();
|
||||
|
||||
public slots:
|
||||
void handleNewLogMessage(const Logger::T_LOG_MESSAGE&);
|
||||
@@ -117,7 +129,6 @@ signals:
|
||||
void newLogMessage(const Logger::T_LOG_MESSAGE&);
|
||||
|
||||
private:
|
||||
LoggerManager();
|
||||
|
||||
QList<Logger::T_LOG_MESSAGE> _logMessageBuffer;
|
||||
const int _loggerMaxMsgBufferSize;
|
||||
|
@@ -111,7 +111,7 @@ namespace NetUtils {
|
||||
if (hostname.endsWith(".local") || hostname.endsWith(".local."))
|
||||
{
|
||||
QHostAddress resolvedAddress;
|
||||
QMetaObject::invokeMethod(&MdnsBrowser::getInstance(), "resolveAddress",
|
||||
QMetaObject::invokeMethod(MdnsBrowser::getInstance().data(), "resolveAddress",
|
||||
Qt::BlockingQueuedConnection,
|
||||
Q_RETURN_ARG(bool, isHostAddressOK),
|
||||
Q_ARG(Logger*, log), Q_ARG(QString, hostname), Q_ARG(QHostAddress&, resolvedAddress));
|
||||
@@ -163,7 +163,7 @@ namespace NetUtils {
|
||||
if (hostname.endsWith("._tcp.local"))
|
||||
{
|
||||
//Treat hostname as service instance name that requires to be resolved into an mDNS-Hostname first
|
||||
QMdnsEngine::Record service = MdnsBrowser::getInstance().getServiceInstanceRecord(hostname.toUtf8());
|
||||
QMdnsEngine::Record service = MdnsBrowser::getInstance().data()->getServiceInstanceRecord(hostname.toUtf8());
|
||||
if (!service.target().isEmpty())
|
||||
{
|
||||
Info(log, "Resolved service [%s] to mDNS hostname [%s], service port [%d]", QSTRING_CSTR(hostname), service.target().constData(), service.port());
|
||||
|
@@ -4,6 +4,7 @@
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QJsonDocument>
|
||||
#include <QScopedPointer>
|
||||
|
||||
// hyperion / utils
|
||||
#include <utils/Logger.h>
|
||||
@@ -64,7 +65,7 @@ public slots:
|
||||
|
||||
void onServerStopped ();
|
||||
void onServerStarted (quint16 port);
|
||||
void onServerError (QString msg);
|
||||
void onServerError (const QString& msg);
|
||||
|
||||
///
|
||||
/// @brief Handle settings update from Hyperion Settingsmanager emit or this constructor
|
||||
@@ -90,7 +91,7 @@ private:
|
||||
QString _baseUrl;
|
||||
quint16 _port;
|
||||
StaticFileServing* _staticFileServing;
|
||||
QtHttpServer* _server;
|
||||
QScopedPointer<QtHttpServer> _server;
|
||||
bool _inited = false;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user