diff --git a/bin/dbus/configurationmanager-introspec.xml b/bin/dbus/configurationmanager-introspec.xml index c5fe0b71500603a165b356c52f5b3a2f7cfdda17..fc055d5267867b15574a251b6ad8b6bd52664045 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 c0618ad43c6a1c9423ded04858c7bfe976abc2e8..74f95bd439e1e27febfd036895ab92e8e19fb584 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 1d05047318c384492c1b127f69279e87f57355c4..8d66d37fe64a8e10bb8e40c73e96df951d0700d7 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 9791c5060cd0d15998f4564e352f467f637a5c10..a4ae58ee5d05e2f853c1d682d9858f22048bc868 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 2d2f9c81d5d7d6d38c9d6db1c81e86cc941b6de0..a5422a5fbf541b732939e0c1509b9aca3b3e6de7 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 f43663ddfe4dde2f152e5e584b3e44c895090975..8c63d3acf58093384e06ace89ce4ee8f63f6133d 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 88192681c4283230d60ec8b68d9443e527d70dc3..c101a0a8a506408b6fc4966bf95fd282d5d72c2d 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 */