diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
index 6a0143087cd453fdb3560c7d3d31e14c85acf67c..2282f6cdac4c7ae57601e861b51c8483c48504ad 100644
--- a/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
+++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.cpp
@@ -29,6 +29,7 @@
 
 #include "audio_rtp_record_handler.h"
 #include <fstream>
+#include <algorithm>
 
 #include "logger.h"
 #include "sip/sipcall.h"
@@ -52,7 +53,7 @@ AudioRtpRecord::AudioRtpRecord() :
     , codecFrameSize_(0)
     , converterSamplingRate_(0)
     , dtmfQueue_()
-    , micAmplFactor_(INIT_FADE_IN_FACTOR)
+    , fadeFactor_(INIT_FADE_IN_FACTOR)
     , noiseSuppress_(0)
     , audioProcessMutex_()
     , callId_("")
@@ -138,7 +139,7 @@ int AudioRtpRecordHandler::processDataEncode()
 
     int samples = bytesToGet / sizeof(SFLDataFormat);
 
-    fadeIn(micData, samples, &audioRtpRecord_.micAmplFactor_);
+    audioRtpRecord_.fadeInDecodedData(samples);
 
     if (Manager::instance().getEchoCancelState())
         echoCanceller.getData(micData);
@@ -169,10 +170,6 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
     if (getCodecPayloadType() != payloadType)
         return;
 
-    int codecSampleRate = getCodecSampleRate();
-
-    int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
-
     int inSamples = 0;
     SFLDataFormat *spkrDataDecoded = audioRtpRecord_.decData_.data();
     {
@@ -181,7 +178,7 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
         inSamples = audioRtpRecord_.audioCodec_->decode(spkrDataDecoded, spkrData, size);
     }
 
-    fadeIn(spkrDataDecoded, inSamples, &audioRtpRecord_.micAmplFactor_);
+    audioRtpRecord_.fadeInDecodedData(inSamples);
 
     // Normalize incomming signal
     gainController.process(spkrDataDecoded, inSamples);
@@ -189,6 +186,9 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
     SFLDataFormat *out = spkrDataDecoded;
     int outSamples = inSamples;
 
+    int codecSampleRate = getCodecSampleRate();
+    int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
+
     // test if resampling is required
     if (codecSampleRate != mainBufferSampleRate) {
         out = audioRtpRecord_.resampledData_.data();
@@ -203,15 +203,17 @@ void AudioRtpRecordHandler::processDataDecode(unsigned char *spkrData, size_t si
     Manager::instance().getMainBuffer()->putData(out, outSamples * sizeof(SFLDataFormat), id_);
 }
 
-void AudioRtpRecordHandler::fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor)
+void AudioRtpRecord::fadeInDecodedData(size_t size)
 {
     // if factor reaches 0, this function should have no effect
-    if (!audio or !factor or *factor <= 0)
+    if (fadeFactor_ <= 0 or size > decData_.size())
         return;
 
-    while (size > 0)
-        audio[--size] /= *factor;
+    std::transform(decData_.begin(), decData_.begin() + size, decData_.begin(),
+            std::bind1st(std::divides<double>(), fadeFactor_));
 
-    *factor /= FADEIN_STEP_SIZE;
+    // Factor used to increase volume in fade in
+    const SFLDataFormat FADEIN_STEP_SIZE = 4;
+    fadeFactor_ /= FADEIN_STEP_SIZE;
 }
 }
diff --git a/daemon/src/audio/audiortp/audio_rtp_record_handler.h b/daemon/src/audio/audiortp/audio_rtp_record_handler.h
index f54d3680f56d9c7754c79548109d4ecb0139ac2d..bca8e09887d64cd9b0ceebcd342055e8d091fded 100644
--- a/daemon/src/audio/audiortp/audio_rtp_record_handler.h
+++ b/daemon/src/audio/audiortp/audio_rtp_record_handler.h
@@ -51,9 +51,6 @@ namespace sfl {
 // Frequency (in packet number)
 #define RTP_TIMESTAMP_RESET_FREQ 100
 
-// Factor use to increase volume in fade in
-#define FADEIN_STEP_SIZE 4;
-
 static const int schedulingTimeout = 4000;
 static const int expireTimeout = 1000000;
 
@@ -92,12 +89,18 @@ class AudioRtpRecord {
         int codecFrameSize_;
         int converterSamplingRate_;
         std::list<int> dtmfQueue_;
-        SFLDataFormat micAmplFactor_;
+        SFLDataFormat fadeFactor_;
         NoiseSuppress *noiseSuppress_;
         ost::Mutex audioProcessMutex_;
         std::string callId_;
         unsigned int dtmfPayloadType_;
+
     private:
+        friend class AudioRtpRecordHandler;
+        /**
+        * Ramp In audio data to avoid audio click from peer
+        */
+        void fadeInDecodedData(size_t size);
         NON_COPYABLE(AudioRtpRecord);
 };
 
@@ -154,11 +157,6 @@ class AudioRtpRecordHandler {
          */
         void processDataDecode(unsigned char * spkrData, size_t size, int payloadType);
 
-        /**
-        * Ramp In audio data to avoid audio click from peer
-        */
-        void fadeIn(SFLDataFormat *audio, size_t size, SFLDataFormat *factor);
-
         void setDtmfPayloadType(unsigned int payloadType) {
             audioRtpRecord_.dtmfPayloadType_ = payloadType;
         }