From cf5d18dfd8a4aafa135dd515b17961667afba948 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Tue, 2 Feb 2016 15:51:11 -0500
Subject: [PATCH] audio: allow to mute ringtone device

On Android, if the device is in silent or ringtone mode,
the ringtone device should be muted, while keeping the possibility
to hear the peer during a call.

Tuleap: #262
Change-Id: Ie64da9cb3a940b4749bb163f169474ca237c4b37
---
 bin/dbus/configurationmanager-introspec.xml | 16 ++++++++++++++++
 bin/dbus/dbusconfigurationmanager.cpp       | 12 ++++++++++++
 bin/dbus/dbusconfigurationmanager.h         |  2 ++
 src/client/configurationmanager.cpp         | 20 ++++++++++++++++++++
 src/dring/configurationmanager_interface.h  |  2 ++
 src/media/audio/audiolayer.cpp              |  2 +-
 src/media/audio/audiolayer.h                | 12 ++++++++++++
 7 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml
index c5fe0b7150..fc055d5267 100644
--- a/bin/dbus/configurationmanager-introspec.xml
+++ b/bin/dbus/configurationmanager-introspec.xml
@@ -362,6 +362,22 @@
            </arg>
        </method>
 
+       <method name="muteRingtone" tp:name-for-bindings="muteRingtone">
+           <arg type="b" name="mute" direction="in">
+               <tp:docstring>
+                   True to mute ringtone, false otherwise.
+               </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="isRingtoneMuted" tp:name-for-bindings="isRingtoneMuted">
+           <arg type="b" name="muted" direction="out">
+               <tp:docstring>
+                   Returns true if ringtone is muted, false otherwise.
+               </tp:docstring>
+           </arg>
+       </method>
+
        <method name="getAudioManager" tp:name-for-bindings="getAudioManager">
            <arg type="s" name="api" direction="out">
            </arg>
diff --git a/bin/dbus/dbusconfigurationmanager.cpp b/bin/dbus/dbusconfigurationmanager.cpp
index c0618ad43c..74f95bd439 100644
--- a/bin/dbus/dbusconfigurationmanager.cpp
+++ b/bin/dbus/dbusconfigurationmanager.cpp
@@ -272,6 +272,18 @@ DBusConfigurationManager::mutePlayback(const bool& mute)
     DRing::mutePlayback(mute);
 }
 
+auto
+DBusConfigurationManager::isRingtoneMuted() -> decltype(DRing::isRingtoneMuted())
+{
+    return DRing::isRingtoneMuted();
+}
+
+void
+DBusConfigurationManager::muteRingtone(const bool& mute)
+{
+    DRing::muteRingtone(mute);
+}
+
 auto
 DBusConfigurationManager::getAudioManager() -> decltype(DRing::getAudioManager())
 {
diff --git a/bin/dbus/dbusconfigurationmanager.h b/bin/dbus/dbusconfigurationmanager.h
index 1d05047318..8d66d37fe6 100644
--- a/bin/dbus/dbusconfigurationmanager.h
+++ b/bin/dbus/dbusconfigurationmanager.h
@@ -96,6 +96,8 @@ class DBusConfigurationManager :
         void muteCapture(const bool& mute);
         bool isPlaybackMuted();
         void mutePlayback(const bool& mute);
+        bool isRingtoneMuted();
+        void muteRingtone(const bool& mute);
         std::string getAudioManager();
         bool setAudioManager(const std::string& api);
         std::vector<std::string> getSupportedAudioManagers();
diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp
index 9791c5060c..a4ae58ee5d 100644
--- a/src/client/configurationmanager.cpp
+++ b/src/client/configurationmanager.cpp
@@ -716,6 +716,26 @@ mutePlayback(bool mute)
     return;
 }
 
+bool
+isRingtoneMuted()
+{
+    if (auto audiolayer = ring::Manager::instance().getAudioDriver())
+        return audiolayer->isRingtoneMuted();
+
+    RING_ERR("Audio layer not valid");
+    return false;
+}
+
+void
+muteRingtone(bool mute)
+{
+    if (auto audiolayer = ring::Manager::instance().getAudioDriver())
+        return audiolayer->muteRingtone(mute);
+
+    RING_ERR("Audio layer not valid");
+    return;
+}
+
 std::map<std::string, std::string>
 getHookSettings()
 {
diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h
index 2d2f9c81d5..a5422a5fbf 100644
--- a/src/dring/configurationmanager_interface.h
+++ b/src/dring/configurationmanager_interface.h
@@ -86,6 +86,8 @@ bool isCaptureMuted();
 void muteCapture(bool mute);
 bool isPlaybackMuted();
 void mutePlayback(bool mute);
+bool isRingtoneMuted();
+void muteRingtone(bool mute);
 
 std::string getAudioManager();
 bool setAudioManager(const std::string& api);
diff --git a/src/media/audio/audiolayer.cpp b/src/media/audio/audiolayer.cpp
index f43663ddfe..8c63d3acf5 100644
--- a/src/media/audio/audiolayer.cpp
+++ b/src/media/audio/audiolayer.cpp
@@ -130,7 +130,7 @@ const AudioBuffer& AudioLayer::getToRing(AudioFormat format, size_t writableSamp
 
         ringtoneBuffer_.setFormat(fileformat);
         ringtoneBuffer_.resize(readableSamples);
-        fileToPlay->getNext(ringtoneBuffer_, 1.0);
+        fileToPlay->getNext(ringtoneBuffer_, isRingtoneMuted_ ? 0. : 1.);
         ringtoneBuffer_.setChannelNum(format.nb_channels, true);
         AudioBuffer* out;
         if (resample) {
diff --git a/src/media/audio/audiolayer.h b/src/media/audio/audiolayer.h
index 88192681c4..c101a0a8a5 100644
--- a/src/media/audio/audiolayer.h
+++ b/src/media/audio/audiolayer.h
@@ -155,6 +155,13 @@ class AudioLayer {
             isPlaybackMuted_ = muted;
         }
 
+        bool isRingtoneMuted() const {
+            return isRingtoneMuted_;
+        }
+        void muteRingtone(bool muted) {
+            isRingtoneMuted_ = muted;
+        }
+
         /**
          * Set capture stream gain (microphone)
          * Range should be [-1.0, 1.0]
@@ -235,6 +242,11 @@ class AudioLayer {
          */
         bool isPlaybackMuted_;
 
+        /**
+         * True if ringtone should be muted
+         */
+        bool isRingtoneMuted_ {false};
+
         /**
          * Gain applied to mic signal
          */
-- 
GitLab