From 8f3bbf3cfafa8101d0b615275535f33d62ad1ff8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C3=ABl=20Carr=C3=A9?=
 <rafael.carre@savoirfairelinux.com>
Date: Wed, 21 Sep 2011 17:33:22 -0400
Subject: [PATCH] Fix crash with noise suppressor

---
 .../audio/audiortp/AudioRtpRecordHandler.cpp  | 19 ++++++++++---------
 daemon/src/dbus/configurationmanager.cpp      |  2 +-
 daemon/src/managerimpl.cpp                    |  4 ++--
 daemon/src/managerimpl.h                      |  2 +-
 4 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/daemon/src/audio/audiortp/AudioRtpRecordHandler.cpp b/daemon/src/audio/audiortp/AudioRtpRecordHandler.cpp
index 08cd50a8ca..8e783314b7 100644
--- a/daemon/src/audio/audiortp/AudioRtpRecordHandler.cpp
+++ b/daemon/src/audio/audiortp/AudioRtpRecordHandler.cpp
@@ -103,7 +103,7 @@ void AudioRtpRecordHandler::initNoiseSuppress()
 
     delete _audioRtpRecord._noiseSuppress;
 
-    _audioRtpRecord._noiseSuppress = new NoiseSuppress (getCodecFrameSize(), getCodecSampleRate());
+    _audioRtpRecord._noiseSuppress = new NoiseSuppress(getCodecFrameSize(), getCodecSampleRate());
 
     _audioRtpRecord.audioProcessMutex.leave();
 }
@@ -146,14 +146,9 @@ int AudioRtpRecordHandler::processDataEncode (void)
 
     fadeIn (micData, samples, &_audioRtpRecord._micAmplFactor);
 
-    if(Manager::instance().getEchoCancelState() == "enabled")
+    if(Manager::instance().getEchoCancelState())
         echoCanceller.getData(micData);
 
-	_audioRtpRecord.audioProcessMutex.enter();
-	if (Manager::instance().audioPreference.getNoiseReduce())
-		_audioRtpRecord._noiseSuppress->process(micData, samples);
-	_audioRtpRecord.audioProcessMutex.leave();
-
 #ifdef DUMP_PROCESS_DATA_ENCODE
         teststream.write(reinterpret_cast<char *>(micData), bytesToGet);
 #endif
@@ -164,8 +159,14 @@ int AudioRtpRecordHandler::processDataEncode (void)
         _audioRtpRecord._converter->resample (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, samplesToGet);
     }
 
+	if (Manager::instance().audioPreference.getNoiseReduce()) {
+		_audioRtpRecord.audioProcessMutex.enter();
+		_audioRtpRecord._noiseSuppress->process(micData, getCodecFrameSize());
+		_audioRtpRecord.audioProcessMutex.leave();
+	}
+
 	_audioRtpRecord.audioCodecMutex.enter();
-	int compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, out, DEC_BUFFER_SIZE);
+	int compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, out, getCodecFrameSize());
 	_audioRtpRecord.audioCodecMutex.leave();
 
     return compSize;
@@ -205,7 +206,7 @@ void AudioRtpRecordHandler::processDataDecode (unsigned char *spkrData, unsigned
         out = spkrDataConverted;
     }
 
-	if(Manager::instance().getEchoCancelState() == "enabled")
+	if(Manager::instance().getEchoCancelState())
 	    echoCanceller.putData(out, outSamples);
     Manager::instance().getMainBuffer()->putData (out, outSamples * sizeof (SFLDataFormat), id_);
 }
diff --git a/daemon/src/dbus/configurationmanager.cpp b/daemon/src/dbus/configurationmanager.cpp
index 25c7a683e2..0d926bf9ec 100644
--- a/daemon/src/dbus/configurationmanager.cpp
+++ b/daemon/src/dbus/configurationmanager.cpp
@@ -288,7 +288,7 @@ void ConfigurationManager::setNoiseSuppressState (const std::string& state)
 
 std::string ConfigurationManager::getEchoCancelState(void)
 {
-	return Manager::instance().getEchoCancelState();
+	return Manager::instance().getEchoCancelState() ? "enabled" : "disabled";
 }
 
 void ConfigurationManager::setEchoCancelState(const std::string& state)
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 222da33d09..c918912d44 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -2246,9 +2246,9 @@ void ManagerImpl::setNoiseSuppressState (const std::string &state)
     audioPreference.setNoiseReduce (state == "enabled");
 }
 
-std::string ManagerImpl::getEchoCancelState() const
+bool ManagerImpl::getEchoCancelState() const
 {
-	return audioPreference.getEchoCancel() ? "enabled" : "disabled";
+	return audioPreference.getEchoCancel();
 }
 
 void ManagerImpl::setEchoCancelState(const std::string &state)
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index 024ec8992d..44a046d83f 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -567,7 +567,7 @@ class ManagerImpl
          * Get the echo canceller engin state from
          * the current audio layer
          */
-        std::string getEchoCancelState(void) const;
+        bool getEchoCancelState(void) const;
 
         /**
          * Set the echo canceller engin state
-- 
GitLab