From 4fd0c33450b26dd6c326fa6a7e7d05adbd02a140 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Wed, 30 Sep 2020 14:54:25 -0400
Subject: [PATCH] avsettings: use a more declarative approach for the level
 meter

- prevents a slurry of calls to stop/startAudioMeter

Gitlab: #120
Gitlab: #124
Change-Id: I6118baab1a3f3e08e72a60a35682ce753e05e2eb
---
 src/accountadapter.cpp                        | 12 -----
 src/accountadapter.h                          |  3 +-
 src/avadapter.cpp                             | 12 +++++
 src/avadapter.h                               |  3 ++
 src/settingsview/SettingsView.qml             | 22 +--------
 src/settingsview/components/AudioSettings.qml | 49 +++----------------
 src/settingsview/components/AvSettingPage.qml |  1 -
 src/settingsview/components/LevelMeter.qml    | 32 +++++++-----
 8 files changed, 46 insertions(+), 88 deletions(-)

diff --git a/src/accountadapter.cpp b/src/accountadapter.cpp
index 693f1da2b..11007e0da 100644
--- a/src/accountadapter.cpp
+++ b/src/accountadapter.cpp
@@ -247,18 +247,6 @@ AccountAdapter::savePassword(const QString& accountId,
     return LRCInstance::accountModel().changeAccountPassword(accountId, oldPassword, newPassword);
 }
 
-void
-AccountAdapter::startAudioMeter(bool async)
-{
-    LRCInstance::startAudioMeter(async);
-}
-
-void
-AccountAdapter::stopAudioMeter(bool async)
-{
-    LRCInstance::stopAudioMeter(async);
-}
-
 void
 AccountAdapter::startPreviewing(bool force, bool async)
 {
diff --git a/src/accountadapter.h b/src/accountadapter.h
index 0f7ff21e1..33840a704 100644
--- a/src/accountadapter.h
+++ b/src/accountadapter.h
@@ -97,8 +97,7 @@ public:
     Q_INVOKABLE bool savePassword(const QString& accountId,
                                   const QString& oldPassword,
                                   const QString& newPassword);
-    Q_INVOKABLE void startAudioMeter(bool async);
-    Q_INVOKABLE void stopAudioMeter(bool async);
+
     Q_INVOKABLE void startPreviewing(bool force = false, bool async = true);
     Q_INVOKABLE void stopPreviewing(bool async = true);
     Q_INVOKABLE bool hasVideoCall();
diff --git a/src/avadapter.cpp b/src/avadapter.cpp
index 2633ea0c6..91cd9e2a4 100644
--- a/src/avadapter.cpp
+++ b/src/avadapter.cpp
@@ -126,3 +126,15 @@ AvAdapter::shareScreenArea(int screenNumber, int x, int y, int width, int height
                                       width < 128 ? 128 : width,
                                       height < 128 ? 128 : height);
 }
+
+void
+AvAdapter::startAudioMeter(bool async)
+{
+    LRCInstance::startAudioMeter(async);
+}
+
+void
+AvAdapter::stopAudioMeter(bool async)
+{
+    LRCInstance::stopAudioMeter(async);
+}
diff --git a/src/avadapter.h b/src/avadapter.h
index 111a5b473..cd30f7a74 100644
--- a/src/avadapter.h
+++ b/src/avadapter.h
@@ -64,4 +64,7 @@ protected:
      * Select screen area to display.
      */
     Q_INVOKABLE void shareScreenArea(int screenNumber, int x, int y, int width, int height);
+
+    Q_INVOKABLE void startAudioMeter(bool async);
+    Q_INVOKABLE void stopAudioMeter(bool async);
 };
diff --git a/src/settingsview/SettingsView.qml b/src/settingsview/SettingsView.qml
index 1e5b95b54..da9ca9648 100644
--- a/src/settingsview/SettingsView.qml
+++ b/src/settingsview/SettingsView.qml
@@ -51,40 +51,25 @@ Rectangle {
         switch(sel) {
             case SettingsView.Account:
                 pageIdCurrentAccountSettings.connectCurrentAccount()
-
-                settingsViewRect.stopAudioMeter()
                 settingsViewRect.stopPreviewing()
-
                 selectedMenu = sel
-
                 if(pageIdCurrentAccountSettings.isPhotoBoothOpened())
                 {
                     settingsViewRect.setAvatar()
                 }
-
                 pageIdCurrentAccountSettings.updateAccountInfoDisplayed()
                 break
             case SettingsView.General:
-                try{
-                    settingsViewRect.stopAudioMeter()
-                    settingsViewRect.stopPreviewing()
-                } catch(erro) {}
-
+                settingsViewRect.stopPreviewing()
                 selectedMenu = sel
                 break
             case SettingsView.Media:
                 selectedMenu = sel
-
                 settingsViewRect.stopPreviewing()
                 avSettings.populateAVSettings()
-                settingsViewRect.startAudioMeter()
                 break
             case SettingsView.Plugin:
-                try{
-                    settingsViewRect.stopAudioMeter()
-                    settingsViewRect.stopPreviewing()
-                } catch(erro) {}
-
+                settingsViewRect.stopPreviewing()
                 selectedMenu = sel
                 pluginSettings.populatePluginSettings()
                 break
@@ -102,7 +87,6 @@ Rectangle {
 
     // slots
     function leaveSettingsSlot(showMainView) {
-        settingsViewRect.stopAudioMeter()
         settingsViewRect.stopPreviewing()
         settingsViewRect.stopBooth()
         if (showMainView)
@@ -137,8 +121,6 @@ Rectangle {
 
         anchors.fill: root
 
-        signal stopAudioMeter
-        signal startAudioMeter
         signal stopPreviewing
         signal stopBooth
         signal setAvatar
diff --git a/src/settingsview/components/AudioSettings.qml b/src/settingsview/components/AudioSettings.qml
index 9ac0b1f0d..c20b5b216 100644
--- a/src/settingsview/components/AudioSettings.qml
+++ b/src/settingsview/components/AudioSettings.qml
@@ -41,29 +41,6 @@ ColumnLayout {
         AUDIOMANAGER
     }
 
-    Connections {
-        target: settingsViewRect
-
-        function onStopAudioMeter() {
-            stopAudioMeter()
-        }
-
-        function onStartAudioMeter() {
-            startAudioMeter()
-        }
-    }
-
-    Connections{
-        target: AVModel
-        enabled: root.visible
-
-        function onAudioMeter(id, level) {
-            if (id === "audiolayer_id") {
-                audioInputMeter.setLevel(level)
-            }
-        }
-    }
-
     function populateAudioSettings() {
         inputComboBoxSetting.comboModel.reset()
         audioOutputDeviceModel.reset()
@@ -79,16 +56,6 @@ ColumnLayout {
         audioManagerComboBoxSetting.visible = (audioManagerComboBoxSetting.comboModel.rowCount() > 0)
     }
 
-    function stopAudioMeter(async = true){
-        audioInputMeter.stop()
-        AccountAdapter.stopAudioMeter(async)
-    }
-
-    function startAudioMeter(async = true){
-        audioInputMeter.start()
-        AccountAdapter.startAudioMeter(async)
-    }
-
     AudioOutputDeviceModel{
         id: audioOutputDeviceModel
     }
@@ -117,12 +84,12 @@ ColumnLayout {
         role: "ID_UTF8"
 
         onIndexChanged: {
-            stopAudioMeter(false)
+            AvAdapter.stopAudioMeter(false)
             var selectedInputDeviceName = comboModel.data(
                         comboModel.index(modelIndex, 0),
                         AudioInputDeviceModel.Device_ID)
             AVModel.setInputDevice(selectedInputDeviceName)
-            startAudioMeter(false)
+            AvAdapter.startAudioMeter(false)
         }
     }
 
@@ -154,12 +121,12 @@ ColumnLayout {
         role: "ID_UTF8"
 
         onIndexChanged: {
-            stopAudioMeter(false)
+            AvAdapter.stopAudioMeter(false)
             var selectedOutputDeviceName = audioOutputDeviceModel.data(
                         audioOutputDeviceModel.index(modelIndex, 0),
                         AudioOutputDeviceModel.Device_ID)
             AVModel.setOutputDevice(selectedOutputDeviceName)
-            startAudioMeter(false)
+            AvAdapter.startAudioMeter(false)
         }
     }
 
@@ -178,12 +145,12 @@ ColumnLayout {
         role: "ID_UTF8"
 
         onIndexChanged: {
-            stopAudioMeter(false)
+            AvAdapter.stopAudioMeter(false)
             var selectedRingtoneDeviceName = audioOutputDeviceModel.data(
                         audioOutputDeviceModel.index(modelIndex, 0),
                         AudioOutputDeviceModel.Device_ID)
             AVModel.setRingtoneDevice(selectedRingtoneDeviceName)
-            startAudioMeter(false)
+            AvAdapter.startAudioMeter(false)
         }
     }
 
@@ -201,11 +168,11 @@ ColumnLayout {
         role: "ID_UTF8"
 
         onIndexChanged: {
-            stopAudioMeter(false)
+            AvAdapter.stopAudioMeter(false)
             var selectedAudioManager = comboModel.data(
                         comboModel.index(modelIndex, 0), AudioManagerListModel.AudioManagerID)
             AVModel.setAudioManager(selectedAudioManager)
-            startAudioMeter(false)
+            AvAdapter.startAudioMeter(false)
             populateAudioSettings()
         }
     }
diff --git a/src/settingsview/components/AvSettingPage.qml b/src/settingsview/components/AvSettingPage.qml
index 19fb86bd2..200d6bbc6 100644
--- a/src/settingsview/components/AvSettingPage.qml
+++ b/src/settingsview/components/AvSettingPage.qml
@@ -38,7 +38,6 @@ Rectangle {
     onVisibleChanged: {
         if (!visible) {
             videoSettings.stopPreviewing()
-            audioSettings.stopAudioMeter()
         }
     }
 
diff --git a/src/settingsview/components/LevelMeter.qml b/src/settingsview/components/LevelMeter.qml
index d8cf9eeef..d5b984cea 100644
--- a/src/settingsview/components/LevelMeter.qml
+++ b/src/settingsview/components/LevelMeter.qml
@@ -18,30 +18,38 @@
 
 import QtQuick 2.15
 import QtQuick.Controls 2.15
+import net.jami.Models 1.0
+import net.jami.Adapters 1.0
 
 ProgressBar {
     id: root
 
+    property real rmsLevel: 0
+
     value: {
         return clamp(rmsLevel * 300.0, 0.0, 100.0)
     }
 
-    property real rmsLevel: 0
-
-    function clamp(num,a,b) {
-        return Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b))
+    onVisibleChanged: {
+        if (visible) {
+            rmsLevel = 0
+            AvAdapter.startAudioMeter(true)
+        } else
+            AvAdapter.stopAudioMeter(true)
     }
 
-    function start() {
-        rmsLevel = 0
+    function clamp(num, a, b) {
+        return Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b))
     }
 
-    function stop() {
-
-    }
+    Connections{
+        target: AVModel
+        enabled: root.visible
 
-    function setLevel(rmsLevelIn) {
-        rmsLevel = rmsLevelIn
+        function onAudioMeter(id, level) {
+            if (id === "audiolayer_id") {
+                rmsLevel = level
+            }
+        }
     }
-
 }
-- 
GitLab