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"