From 3bed65a5d09bad7f6cb6a88f8467981d54fe3348 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Tue, 13 Nov 2018 09:21:58 -0500
Subject: [PATCH] avmodel: get renderers at startup

Daemon 7.1.0 introduces getRenderer to allow the client to restart
renderers if there is a call when starting the client.

Change-Id: I7b1d685d9492780c5ffce5297c8c4214bfd27441
Reviewed-by: Philippe Gorley <philippe.gorley@savoirfairelinux.com>
---
 src/avmodel.cpp                   | 21 ++++++++++++++++++++-
 src/qtwrapper/videomanager_wrap.h |  5 +++++
 test/mocks/videomanager_mock.h    |  7 +++++++
 3 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/avmodel.cpp b/src/avmodel.cpp
index 98c0bedd..100e267e 100644
--- a/src/avmodel.cpp
+++ b/src/avmodel.cpp
@@ -489,6 +489,26 @@ AVModelPimpl::init()
             this, &AVModelPimpl::slotCallStateChanged);
     connect(&*renderers_[video::PREVIEW_RENDERER_ID], &api::video::Renderer::frameUpdated,
         this, &AVModelPimpl::slotFrameUpdated);
+
+    auto startedPreview = false;
+    auto restartRenderers = [&](const QStringList& callList) {
+        for (const auto& callId : callList)
+        {
+            MapStringString rendererInfos = VideoManager::instance().
+                getRenderer(callId);
+            auto shmPath = rendererInfos[DRing::Media::Details::SHM_PATH].toStdString();
+            auto width = rendererInfos[DRing::Media::Details::WIDTH].toInt();
+            auto height = rendererInfos[DRing::Media::Details::HEIGHT].toInt();
+            if (width > 0 && height > 0) {
+                startedPreview = true;
+                startedDecoding(callId.toStdString(), shmPath, width, height);
+            }
+        }
+    };
+    restartRenderers(CallManager::instance().getCallList());
+    restartRenderers(CallManager::instance().getConferenceList());
+    if (startedPreview)
+        restartRenderers({"local"});
 }
 
 std::string
@@ -517,7 +537,6 @@ void
 AVModelPimpl::startedDecoding(const std::string& id, const std::string& shmPath, int width, int height)
 {
     const std::string res = std::to_string(width) + "x" + std::to_string(height);
-    qDebug() << "startedDecoding for sink id: " << id.c_str();
     {
         std::lock_guard<std::mutex> lk(renderers_mtx_);
         auto search = renderers_.find(id);
diff --git a/src/qtwrapper/videomanager_wrap.h b/src/qtwrapper/videomanager_wrap.h
index 211e9da6..57f92f68 100644
--- a/src/qtwrapper/videomanager_wrap.h
+++ b/src/qtwrapper/videomanager_wrap.h
@@ -230,6 +230,11 @@ public Q_SLOTS: // METHODS
         return QString::fromStdString(DRing::startLocalRecorder(audioOnly, path.toStdString()));
     }
 
+    MapStringString getRenderer(const QString& id)
+    {
+        return convertMap(DRing::getRenderer(id.toStdString()));
+    }
+
 Q_SIGNALS: // SIGNALS
     void deviceEvent();
     void startedDecoding(const QString &id, const QString &shmPath, int width, int height, bool isMixer);
diff --git a/test/mocks/videomanager_mock.h b/test/mocks/videomanager_mock.h
index 530db103..558c0b61 100644
--- a/test/mocks/videomanager_mock.h
+++ b/test/mocks/videomanager_mock.h
@@ -190,6 +190,13 @@ public Q_SLOTS: // METHODS
         return "/tmp/foobar";
     }
 
+    MapStringString getRenderer(const QString& id)
+    {
+        Q_UNUSED(id)
+        return {};
+    }
+
+
 Q_SIGNALS: // SIGNALS
     void deviceEvent();
     void startedDecoding(const QString &id, const QString &shmPath, int width, int height, bool isMixer);
-- 
GitLab