From 26cc5cecd566d85dabbfd70b3468e98c808fd7f4 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Tue, 8 Nov 2022 13:40:25 -0500
Subject: [PATCH] videosettings: restart the camera at the selected resolution

Change-Id: I6c7942bda27377c6b83946c855a43c1a09f900ff
GitLab: #872
---
 src/app/commoncomponents/LocalVideo.qml           |  6 +++---
 src/app/settingsview/components/VideoSettings.qml |  2 +-
 src/app/videodevices.cpp                          | 10 ++++++++--
 src/app/videodevices.h                            |  2 +-
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/app/commoncomponents/LocalVideo.qml b/src/app/commoncomponents/LocalVideo.qml
index 435ff9930..178ccf771 100644
--- a/src/app/commoncomponents/LocalVideo.qml
+++ b/src/app/commoncomponents/LocalVideo.qml
@@ -27,13 +27,13 @@ VideoView {
 
     crop: true
 
-    function startWithId(id) {
+    function startWithId(id, force = false) {
         if (id.length === 0) {
             VideoDevices.stopDevice(rendererId)
             rendererId = id
         } else {
-            if (rendererId !== id)
-                rendererId = VideoDevices.startDevice(id)
+            const forceRestart = rendererId === id
+            rendererId = VideoDevices.startDevice(id, forceRestart)
         }
     }
 }
diff --git a/src/app/settingsview/components/VideoSettings.qml b/src/app/settingsview/components/VideoSettings.qml
index fee9be760..26aaa6189 100644
--- a/src/app/settingsview/components/VideoSettings.qml
+++ b/src/app/settingsview/components/VideoSettings.qml
@@ -40,7 +40,7 @@ ColumnLayout {
         if (!visible) {
             return
         }
-        previewWidget.startWithId(VideoDevices.getDefaultDevice())
+        previewWidget.startWithId(VideoDevices.getDefaultDevice(), force)
     }
 
     onVisibleChanged: {
diff --git a/src/app/videodevices.cpp b/src/app/videodevices.cpp
index f872cc87a..42b3d648c 100644
--- a/src/app/videodevices.cpp
+++ b/src/app/videodevices.cpp
@@ -236,13 +236,19 @@ VideoDevices::getDefaultDevice()
 }
 
 QString
-VideoDevices::startDevice(const QString& id)
+VideoDevices::startDevice(const QString& id, bool force)
 {
     if (id.isEmpty())
         return {};
     auto& avModel = lrcInstance_->avModel();
     if (avModel.hasRenderer(id)) {
-        return id;
+        // If the device is already started AND we're NOT trying to
+        // force a format change, we can do nothing and return the
+        // renderer id.
+        if (!force) {
+            return id;
+        }
+        avModel.stopPreview(id);
     }
     deviceOpen_ = true;
     return avModel.startPreview(id);
diff --git a/src/app/videodevices.h b/src/app/videodevices.h
index 0ab4d5afe..84cccfefd 100644
--- a/src/app/videodevices.h
+++ b/src/app/videodevices.h
@@ -135,7 +135,7 @@ public:
 
     Q_INVOKABLE void setDefaultDevice(int index);
     Q_INVOKABLE const QString getDefaultDevice();
-    Q_INVOKABLE QString startDevice(const QString& deviceId);
+    Q_INVOKABLE QString startDevice(const QString& deviceId, bool force = false);
     Q_INVOKABLE void stopDevice(const QString& deviceId);
     Q_INVOKABLE void setDefaultDeviceRes(int index);
     Q_INVOKABLE void setDefaultDeviceFps(int index);
-- 
GitLab