From 077791ba2ff3a7bb5ecfd0a3225b09ec93c9bb00 Mon Sep 17 00:00:00 2001 From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> Date: Fri, 18 Oct 2019 11:02:48 -0400 Subject: [PATCH] video: allow force reconnection to frame update/stop signals Change-Id: Ic792b5e159cc1aba72b1a84b580b35c8ec4e006f --- rendermanager.cpp | 47 +++++++++++++++++++++++++++-------------------- rendermanager.h | 9 ++++++++- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/rendermanager.cpp b/rendermanager.cpp index cfaee9b..474b91c 100644 --- a/rendermanager.cpp +++ b/rendermanager.cpp @@ -38,7 +38,7 @@ FrameWrapper::~FrameWrapper() } void -FrameWrapper::connectRendering() +FrameWrapper::connectStartRendering() { QObject::disconnect(renderConnections_.started); renderConnections_.started = QObject::connect( @@ -48,6 +48,27 @@ FrameWrapper::connectRendering() &FrameWrapper::slotRenderingStarted); } +void +FrameWrapper::startRendering() +{ + renderer_ = const_cast<video::Renderer*>(&avModel_.getRenderer(id_)); + + QObject::disconnect(renderConnections_.updated); + QObject::disconnect(renderConnections_.stopped); + + renderConnections_.updated = QObject::connect( + &avModel_, + &AVModel::frameUpdated, + this, + &FrameWrapper::slotFrameUpdated); + + renderConnections_.stopped = QObject::connect( + &avModel_, + &AVModel::rendererStopped, + this, + &FrameWrapper::slotRenderingStopped); +} + QImage* FrameWrapper::getFrame() { @@ -67,22 +88,7 @@ FrameWrapper::slotRenderingStarted(const std::string& id) return; } - QObject::disconnect(renderConnections_.updated); - QObject::disconnect(renderConnections_.stopped); - - renderer_ = const_cast<video::Renderer*>(&avModel_.getRenderer(id_)); - - renderConnections_.updated = QObject::connect( - &avModel_, - &AVModel::frameUpdated, - this, - &FrameWrapper::slotFrameUpdated); - - renderConnections_.stopped = QObject::connect( - &avModel_, - &AVModel::rendererStopped, - this, - &FrameWrapper::slotRenderingStopped); + startRendering(); isRendering_ = true; @@ -123,6 +129,7 @@ FrameWrapper::slotFrameUpdated(const std::string& id) ); } } + emit frameUpdated(id); } @@ -177,7 +184,7 @@ RenderManager::RenderManager(AVModel& avModel) emit previewRenderingStopped(); }); - previewFrameWrapper_->connectRendering(); + previewFrameWrapper_->connectStartRendering(); } RenderManager::~RenderManager() @@ -243,7 +250,7 @@ RenderManager::addDistantRenderer(const std::string& id) // check if a FrameWrapper with this id exists auto dfwIt = distantFrameWrapperMap_.find(id); if ( dfwIt != distantFrameWrapperMap_.end()) { - dfwIt->second->connectRendering(); + dfwIt->second->startRendering(); } else { auto dfw = std::make_unique<FrameWrapper>(avModel_, id); @@ -265,7 +272,7 @@ RenderManager::addDistantRenderer(const std::string& id) }); // connect FrameWrapper to avmodel - dfw->connectRendering(); + dfw->connectStartRendering(); // add to map distantFrameWrapperMap_.insert(std::make_pair(id, std::move(dfw))); diff --git a/rendermanager.h b/rendermanager.h index 4e7c9b3..2ab26ff 100644 --- a/rendermanager.h +++ b/rendermanager.h @@ -51,7 +51,14 @@ public: /** * Reconnect the started rendering connection for this object. */ - void connectRendering(); + void connectStartRendering(); + + /** + * Get a pointer to the renderer and reconnect the update/stopped + * rendering connections for this object. + */ + void startRendering(); + /** * Get the most recently rendered frame as a QImage. * @return the rendered image of this object's id -- GitLab