Skip to content

Commit

Permalink
screencast: remove frame callbacks on every stream state change
Browse files Browse the repository at this point in the history
  • Loading branch information
vaxerski committed Jan 25, 2024
1 parent 4fc83e6 commit 5a59264
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 14 deletions.
31 changes: 23 additions & 8 deletions src/portals/Screencopy.cpp
Expand Up @@ -730,6 +730,20 @@ CPipewireConnection::CPipewireConnection() {
Debug::log(LOG, "[pipewire] connected");
}

void CPipewireConnection::removeSessionFrameCallbacks(CScreencopyPortal::SSession* pSession) {
Debug::log(TRACE, "[pipewire] removeSessionFrameCallbacks called");

if (pSession->sharingData.frameCallback)
zwlr_screencopy_frame_v1_destroy(pSession->sharingData.frameCallback);
if (pSession->sharingData.windowFrameCallback)
hyprland_toplevel_export_frame_v1_destroy(pSession->sharingData.windowFrameCallback);

pSession->sharingData.windowFrameCallback = nullptr;
pSession->sharingData.frameCallback = nullptr;

pSession->sharingData.status = FRAME_NONE;
}

CPipewireConnection::~CPipewireConnection() {
if (m_pCore)
pw_core_disconnect(m_pCore);
Expand All @@ -753,20 +767,21 @@ static void pwStreamStateChange(void* data, pw_stream_state old, pw_stream_state
if (PSTREAM->pSession->sharingData.status == FRAME_NONE)
g_pPortalManager->m_sPortals.screencopy->startFrameCopy(PSTREAM->pSession);
else {
if (PSTREAM->pSession->sharingData.frameCallback)
zwlr_screencopy_frame_v1_destroy(PSTREAM->pSession->sharingData.frameCallback);
if (PSTREAM->pSession->sharingData.windowFrameCallback)
hyprland_toplevel_export_frame_v1_destroy(PSTREAM->pSession->sharingData.windowFrameCallback);
PSTREAM->pSession->sharingData.windowFrameCallback = nullptr;
PSTREAM->pSession->sharingData.frameCallback = nullptr;
g_pPortalManager->m_sPortals.screencopy->m_pPipewire->removeSessionFrameCallbacks(PSTREAM->pSession);
g_pPortalManager->m_sPortals.screencopy->startFrameCopy(PSTREAM->pSession);
}
break;
default: PSTREAM->streamState = false; break;
default: {
PSTREAM->streamState = false;
g_pPortalManager->m_sPortals.screencopy->m_pPipewire->removeSessionFrameCallbacks(PSTREAM->pSession);
break;
}
}

if (state == PW_STREAM_STATE_UNCONNECTED)
if (state == PW_STREAM_STATE_UNCONNECTED) {
g_pPortalManager->m_sPortals.screencopy->m_pPipewire->removeSessionFrameCallbacks(PSTREAM->pSession);
g_pPortalManager->m_sPortals.screencopy->m_pPipewire->destroyStream(PSTREAM->pSession);
}
}

static void pwStreamParamChanged(void* data, uint32_t id, const spa_pod* param) {
Expand Down
10 changes: 4 additions & 6 deletions src/portals/Screencopy.hpp
Expand Up @@ -7,22 +7,19 @@
#include <gbm.h>
#include "../shared/Session.hpp"

enum cursorModes
{
enum cursorModes {
HIDDEN = 1,
EMBEDDED = 2,
METADATA = 4,
};

enum sourceTypes
{
enum sourceTypes {
MONITOR = 1,
WINDOW = 2,
VIRTUAL = 4,
};

enum frameStatus
{
enum frameStatus {
FRAME_NONE = 0,
FRAME_QUEUED,
FRAME_READY,
Expand Down Expand Up @@ -152,6 +149,7 @@ class CPipewireConnection {

std::unique_ptr<SBuffer> createBuffer(SPWStream* pStream, bool dmabuf);
SPWStream* streamFromSession(CScreencopyPortal::SSession* pSession);
void removeSessionFrameCallbacks(CScreencopyPortal::SSession* pSession);
uint32_t buildFormatsFor(spa_pod_builder* b[2], const spa_pod* params[2], SPWStream* stream);
void updateStreamParam(SPWStream* pStream);

Expand Down

0 comments on commit 5a59264

Please sign in to comment.