From 1c0fb599c0034ba0146d3cff4fd929ea781574cc Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Thu, 18 Mar 2021 22:32:20 +0100 Subject: [PATCH] - Fix freeze/crash on fullscreen : Reset renderer before getting a new one - Fix crash when getting a Contactthat have not the key "contact-model" - Fix crash on startup by a delay on core creation --- linphone-app/src/components/camera/Camera.cpp | 11 +++++++---- linphone-app/src/components/camera/CameraPreview.cpp | 1 + linphone-app/src/components/core/CoreHandlers.cpp | 2 +- linphone-app/src/components/core/CoreManager.cpp | 9 +++++++-- linphone-app/src/components/core/CoreManager.hpp | 9 +++------ 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/linphone-app/src/components/camera/Camera.cpp b/linphone-app/src/components/camera/Camera.cpp index 497ac5b61..008c7bac6 100644 --- a/linphone-app/src/components/camera/Camera.cpp +++ b/linphone-app/src/components/camera/Camera.cpp @@ -58,15 +58,18 @@ Camera::Camera (QQuickItem *parent) : QQuickFramebufferObject(parent) { QQuickFramebufferObject::Renderer *Camera::createRenderer () const { QQuickFramebufferObject::Renderer * renderer = NULL; if(mIsPreview){ + CoreManager::getInstance()->getCore()->setNativePreviewWindowId(NULL);// Reset renderer=(QQuickFramebufferObject::Renderer *)CoreManager::getInstance()->getCore()->getNativePreviewWindowId(); return renderer; }else{ auto call = mCallModel->getCall(); - if(call) renderer= (QQuickFramebufferObject::Renderer *) call->getNativeVideoWindowId(); - if(!call || !renderer){ + if(call){ + call->setNativeVideoWindowId(NULL);// Reset + return (QQuickFramebufferObject::Renderer *) call->getNativeVideoWindowId(); + }else{ + CoreManager::getInstance()->getCore()->setNativeVideoWindowId(NULL); return (QQuickFramebufferObject::Renderer *) CoreManager::getInstance()->getCore()->getNativeVideoWindowId(); - }else - return renderer; + } } } diff --git a/linphone-app/src/components/camera/CameraPreview.cpp b/linphone-app/src/components/camera/CameraPreview.cpp index c9d769995..a9789e2ff 100644 --- a/linphone-app/src/components/camera/CameraPreview.cpp +++ b/linphone-app/src/components/camera/CameraPreview.cpp @@ -84,6 +84,7 @@ public: QQuickFramebufferObject::Renderer *CameraPreview::createRenderer () const { QQuickFramebufferObject::Renderer * renderer; + CoreManager::getInstance()->getCore()->setNativePreviewWindowId(NULL);// Reset renderer=(QQuickFramebufferObject::Renderer *)CoreManager::getInstance()->getCore()->getNativePreviewWindowId(); if(renderer) return renderer; diff --git a/linphone-app/src/components/core/CoreHandlers.cpp b/linphone-app/src/components/core/CoreHandlers.cpp index 08e3e5a7d..bf41cdca7 100644 --- a/linphone-app/src/components/core/CoreHandlers.cpp +++ b/linphone-app/src/components/core/CoreHandlers.cpp @@ -217,7 +217,7 @@ void CoreHandlers::onNotifyPresenceReceived ( const shared_ptr &linphoneFriend ) { // Ignore friend without vcard because the `contact-model` data doesn't exist. - if (linphoneFriend->getVcard()) + if (linphoneFriend->getVcard() && linphoneFriend->dataExists("contact-model")) linphoneFriend->getData("contact-model").refreshPresence(); } diff --git a/linphone-app/src/components/core/CoreManager.cpp b/linphone-app/src/components/core/CoreManager.cpp index 23d710a28..c0ae54dcf 100644 --- a/linphone-app/src/components/core/CoreManager.cpp +++ b/linphone-app/src/components/core/CoreManager.cpp @@ -71,7 +71,7 @@ namespace { // ----------------------------------------------------------------------------- -CoreManager *CoreManager::mInstance; +CoreManager *CoreManager::mInstance=nullptr; CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject(parent), mHandlers(make_shared(this)) { @@ -83,7 +83,9 @@ CoreManager::CoreManager (QObject *parent, const QString &configPath) : QObject::connect(coreHandlers, &CoreHandlers::coreStarted, this, &CoreManager::initCoreManager, Qt::QueuedConnection); QObject::connect(coreHandlers, &CoreHandlers::coreStopped, this, &CoreManager::stopIterate, Qt::QueuedConnection); QObject::connect(coreHandlers, &CoreHandlers::logsUploadStateChanged, this, &CoreManager::handleLogsUploadStateChanged); - createLinphoneCore(configPath); + QTimer::singleShot(10, [this, configPath](){// Delay the creation in order to have the CoreManager instance set before + createLinphoneCore(configPath); + }); } CoreManager::~CoreManager(){ @@ -109,6 +111,9 @@ void CoreManager::initCoreManager(){ qInfo() << QStringLiteral("CoreManager initialized"); emit coreManagerInitialized(); } +CoreManager *CoreManager::getInstance (){ + return mInstance; + } shared_ptr CoreManager::getChatModel (const QString &peerAddress, const QString &localAddress) { if (peerAddress.isEmpty() || localAddress.isEmpty()) diff --git a/linphone-app/src/components/core/CoreManager.hpp b/linphone-app/src/components/core/CoreManager.hpp index 2e063e27a..6b08e1d61 100644 --- a/linphone-app/src/components/core/CoreManager.hpp +++ b/linphone-app/src/components/core/CoreManager.hpp @@ -117,10 +117,7 @@ public: return mAccountSettingsModel; } - static CoreManager *getInstance () { - Q_CHECK_PTR(mInstance); - return mInstance; - } + static CoreManager *getInstance (); // --------------------------------------------------------------------------- // Initialization. @@ -151,7 +148,8 @@ public slots: void initCoreManager(); void startIterate(); void stopIterate(); - void setLastRemoteProvisioningState(const linphone::ConfiguringState& state); + void setLastRemoteProvisioningState(const linphone::ConfiguringState& state); + void createLinphoneCore (const QString &configPath);// In order to delay creation signals: void coreManagerInitialized (); @@ -171,7 +169,6 @@ private: void setOtherPaths (); void setResourcesPaths (); - void createLinphoneCore (const QString &configPath); void migrate (); QString getVersion () const;