From 5a592647587cd20b9692a347df6939b6d371b3bb Mon Sep 17 00:00:00 2001 From: Vaxry Date: Thu, 25 Jan 2024 01:23:05 +0000 Subject: [PATCH] screencast: remove frame callbacks on every stream state change --- src/portals/Screencopy.cpp | 31 +++++++++++++++++++++++-------- src/portals/Screencopy.hpp | 10 ++++------ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/portals/Screencopy.cpp b/src/portals/Screencopy.cpp index 844f83f..d47df47 100644 --- a/src/portals/Screencopy.cpp +++ b/src/portals/Screencopy.cpp @@ -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); @@ -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) { diff --git a/src/portals/Screencopy.hpp b/src/portals/Screencopy.hpp index 78d49e3..da3bb6c 100644 --- a/src/portals/Screencopy.hpp +++ b/src/portals/Screencopy.hpp @@ -7,22 +7,19 @@ #include #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, @@ -152,6 +149,7 @@ class CPipewireConnection { std::unique_ptr 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);