Skip to content

Commit b8aeebc

Browse files
committed
Restart Pipewire grabber only when it's needed
1 parent d991455 commit b8aeebc

File tree

5 files changed

+34
-11
lines changed

5 files changed

+34
-11
lines changed

include/grabber/linux/pipewire/PipewireHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class PipewireHandler : public QObject
9696
void startSession(QString restorationToken, uint32_t requestedFPS, bool enableEGL, int targetMaxSize);
9797
void closeSession();
9898
bool hasError();
99+
bool isRestartNeeded();
99100

100101
int getVersion();
101102
QString getToken();

include/grabber/linux/pipewire/smartPipewire.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ extern "C" void initPipewireDisplay(const char* restorationToken, uint32_t reque
1717
extern "C" void uninitPipewireDisplay();
1818
extern "C" PipewireImage getFramePipewire();
1919
extern "C" void releaseFramePipewire();
20+
extern "C" bool isRestartNeeded();
2021

sources/grabber/linux/pipewire/PipewireGrabber.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ namespace
5858
PipewireImage(*_getFramePipewire)() = nullptr;
5959
void (*_releaseFramePipewire)() = nullptr;
6060
const char* (*_getPipewireToken)() = nullptr;
61+
bool (*_isRestartNeeded)() = nullptr;
6162
}
6263

6364
PipewireGrabber::PipewireGrabber(const QString& device, const QString& configurationPath)
@@ -91,11 +92,13 @@ PipewireGrabber::PipewireGrabber(const QString& device, const QString& configura
9192
_uninitPipewireDisplay = (void (*)()) dlsym(_library, "uninitPipewireDisplay");
9293
_getFramePipewire = (PipewireImage (*)()) dlsym(_library, "getFramePipewire");
9394
_releaseFramePipewire = (void (*)()) dlsym(_library, "releaseFramePipewire");
95+
_isRestartNeeded = (bool (*)()) dlsym(_library, "isRestartNeeded");
9496
}
9597
else
9698
Warning(_log, "Could not load Pipewire proxy library. Error: {:s}", dlerror());
9799

98-
if (_library && (_getPipewireToken == nullptr || _hasPipewire == nullptr || _releaseFramePipewire == nullptr || _initPipewireDisplay == nullptr || _uninitPipewireDisplay == nullptr || _getFramePipewire == nullptr))
100+
if (_library && (_getPipewireToken == nullptr || _hasPipewire == nullptr || _releaseFramePipewire == nullptr ||
101+
_initPipewireDisplay == nullptr || _uninitPipewireDisplay == nullptr || _getFramePipewire == nullptr || _isRestartNeeded == nullptr))
99102
{
100103
Error(_log, "Could not load Pipewire proxy library definition. Error: {:s}", dlerror());
101104

@@ -115,14 +118,21 @@ void PipewireGrabber::restart()
115118
{
116119
if (!_isActive)
117120
{
118-
Info(_log, "Restarting the grabber");
119-
uninit();
120-
QTimer::singleShot(1000, this, [this]() {
121-
if (_retryTimer->isActive())
122-
{
123-
this->start();
124-
}
125-
});
121+
if (_isRestartNeeded())
122+
{
123+
Info(_log, "Restarting the grabber");
124+
uninit();
125+
QTimer::singleShot(1000, this, [this]() {
126+
if (_retryTimer->isActive())
127+
{
128+
this->start();
129+
}
130+
});
131+
}
132+
else
133+
{
134+
Info(_log, "The grabber restart is not needed.");
135+
}
126136
_retryTimer->start();
127137
}
128138
else

sources/grabber/linux/pipewire/PipewireHandler.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,11 @@ bool PipewireHandler::hasError()
310310
return _isError;
311311
}
312312

313+
bool PipewireHandler::isRestartNeeded()
314+
{
315+
return _isError || _replySessionPath.isEmpty() || (_startReplyPath.isEmpty() && !_portalStatus);
316+
}
317+
313318
int PipewireHandler::getVersion()
314319
{
315320
return _version;
@@ -494,9 +499,11 @@ void PipewireHandler::selectSourcesResponse(uint response)
494499
{
495500
auto responseSignalHandler = [this] (uint32_t resultCode, std::map<std::string, sdbus::Variant> results)
496501
{
502+
_startReplyPath = "";
503+
497504
if (resultCode != 0)
498505
{
499-
qWarning().nospace() << "Start session returned an error code: " << ((resultCode == 1) ? "cancelled" : "other");
506+
reportError(QString("Start session returned an error code: %1").arg(((resultCode == 1) ? "cancelled" : "other")));
500507
return;
501508
}
502509

@@ -516,7 +523,7 @@ void PipewireHandler::selectSourcesResponse(uint response)
516523
auto streamsIter = results.find("streams");
517524
if (streamsIter == results.end())
518525
{
519-
qCritical().nospace() << "Start session didnt return streams";
526+
reportError("Start session didnt return streams");
520527
}
521528
else
522529
{

sources/grabber/linux/pipewire/smartPipewire.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,7 @@ PipewireImage getFramePipewire()
131131
return retVal;
132132
}
133133

134+
bool isRestartNeeded()
135+
{
136+
return pipewireHandler.isRestartNeeded();
137+
}

0 commit comments

Comments
 (0)