File indexing completed on 2024-06-23 05:24:05

0001 // SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleix.pol_gonzalez@mercedes-benz.com>
0002 //
0003 // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0004 
0005 #include "AbstractSession.h"
0006 #include <PipeWireEncodedStream>
0007 #include <PipeWireSourceStream>
0008 #include <QSet>
0009 
0010 namespace KRdp
0011 {
0012 
0013 class KRDP_NO_EXPORT AbstractSession::Private
0014 {
0015 public:
0016     Server *server = nullptr;
0017 
0018     std::unique_ptr<PipeWireEncodedStream> encodedStream;
0019 
0020     std::optional<int> activeStream;
0021     bool started = false;
0022     bool enabled = false;
0023     QSize size;
0024     QSize logicalSize;
0025     std::optional<quint32> frameRate = 60;
0026     std::optional<quint8> quality;
0027     QSet<QObject *> enableRequests;
0028 };
0029 
0030 AbstractSession::AbstractSession(Server *server)
0031     : QObject()
0032     , d(std::make_unique<Private>())
0033 {
0034     d->server = server;
0035 }
0036 
0037 AbstractSession::~AbstractSession()
0038 {
0039     if (d->encodedStream) {
0040         d->encodedStream->setActive(false);
0041     }
0042 }
0043 
0044 QSize AbstractSession::logicalSize() const
0045 {
0046     return d->logicalSize;
0047 }
0048 
0049 int AbstractSession::activeStream() const
0050 {
0051     return d->activeStream.value_or(-1);
0052 }
0053 
0054 void AbstractSession::setActiveStream(int stream)
0055 {
0056     d->activeStream = stream;
0057 }
0058 
0059 void AbstractSession::setVideoQuality(quint8 quality)
0060 {
0061     d->quality = quality;
0062     if (d->encodedStream) {
0063         d->encodedStream->setQuality(quality);
0064     }
0065 }
0066 
0067 bool AbstractSession::streamingEnabled() const
0068 {
0069     if (d->encodedStream) {
0070         return d->encodedStream->isActive();
0071     }
0072     return false;
0073 }
0074 
0075 void AbstractSession::setStreamingEnabled(bool enable)
0076 {
0077     d->enabled = enable;
0078     if (d->encodedStream) {
0079         d->encodedStream->setActive(enable);
0080     }
0081 }
0082 
0083 void AbstractSession::setVideoFrameRate(quint32 framerate)
0084 {
0085     d->frameRate = framerate;
0086     if (d->encodedStream) {
0087         d->encodedStream->setMaxFramerate({framerate, 1});
0088     }
0089 }
0090 
0091 void AbstractSession::setSize(const QSize &size)
0092 {
0093     d->size = size;
0094 }
0095 
0096 void AbstractSession::setLogicalSize(const QSize &size)
0097 {
0098     d->logicalSize = size;
0099 }
0100 
0101 QSize AbstractSession::size() const
0102 {
0103     return d->size;
0104 }
0105 
0106 PipeWireEncodedStream *AbstractSession::stream()
0107 {
0108     if (!d->encodedStream) {
0109         d->encodedStream = std::make_unique<PipeWireEncodedStream>();
0110         if (d->frameRate) {
0111             d->encodedStream->setMaxFramerate({d->frameRate.value(), 1});
0112         }
0113         if (d->quality) {
0114             d->encodedStream->setQuality(d->quality.value());
0115         }
0116     }
0117     return d->encodedStream.get();
0118 }
0119 
0120 void AbstractSession::setStarted(bool s)
0121 {
0122     d->started = s;
0123     if (s) {
0124         Q_EMIT started();
0125         d->encodedStream->setActive(d->enabled);
0126     }
0127 }
0128 
0129 void AbstractSession::requestStreamingEnable(QObject *requester)
0130 {
0131     d->enableRequests.insert(requester);
0132     connect(requester, &QObject::destroyed, this, &AbstractSession::requestStreamingDisable);
0133     if (d->enableRequests.size() > 0) {
0134         d->enabled = true;
0135         if (d->encodedStream) {
0136             d->encodedStream->setActive(true);
0137         }
0138     }
0139 }
0140 
0141 void AbstractSession::requestStreamingDisable(QObject *requester)
0142 {
0143     if (!d->enableRequests.contains(requester)) {
0144         return;
0145     }
0146     disconnect(requester, &QObject::destroyed, this, &AbstractSession::requestStreamingDisable);
0147     d->enableRequests.remove(requester);
0148     if (d->enableRequests.size() == 0) {
0149         d->enabled = false;
0150         if (d->encodedStream) {
0151             d->encodedStream->setActive(false);
0152         }
0153     }
0154 }
0155 
0156 }
0157 
0158 #include "AbstractSession.moc"