diff --git a/sflphone-common/src/audio/alsa/alsalayer.cpp b/sflphone-common/src/audio/alsa/alsalayer.cpp
index 3114c6da5428889ede94132be1e70ad74cf552e0..9291dc1f27b9760bb7fedf7d756597ef6830064a 100644
--- a/sflphone-common/src/audio/alsa/alsalayer.cpp
+++ b/sflphone-common/src/audio/alsa/alsalayer.cpp
@@ -936,7 +936,7 @@ void AlsaLayer::audioCallback (void)
                     SFLDataFormat *rsmpl_out = (SFLDataFormat*) malloc (playbackAvailBytes);
 					memset (out, 0, playbackAvailBytes);
 
-					_converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toGet / sizeof (SFLDataFormat));
+					_converter->resample ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toGet / sizeof (SFLDataFormat));
 					write (rsmpl_out, toGet, _PlaybackHandle);
 					free (rsmpl_out);
 
@@ -1026,7 +1026,7 @@ void AlsaLayer::audioCallback (void)
 
         SFLDataFormat* rsmpl_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat));
 
-        _converter->downsampleData ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toPut / sizeof (SFLDataFormat));
+        _converter->resample ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toPut / sizeof (SFLDataFormat));
 
         _audiofilter->processAudio (rsmpl_out, toPut);
 
diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
index b72ccbb64a13f5a8602ab5d6fd8b1ad97ddf21f2..e4c741de1bdfd6360105f28e30a0f96afd204d1c 100644
--- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
+++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
@@ -287,7 +287,7 @@ int AudioRtpRecordHandler::processDataEncode (void)
 
     // test if resampling is required
     if (codecSampleRate != mainBufferSampleRate) {
-        _audioRtpRecord._converter->downsampleData (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, bytes / sizeof(SFLDataFormat));
+        _audioRtpRecord._converter->resample (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, bytes / sizeof(SFLDataFormat));
 
         _audioRtpRecord.audioProcessMutex.enter();
 
@@ -359,7 +359,7 @@ void AudioRtpRecordHandler::processDataDecode (unsigned char *spkrData, unsigned
     // test if resampling is required
     if (codecSampleRate != mainBufferSampleRate) {
         // Do sample rate conversion
-        _audioRtpRecord._converter->upsampleData (spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, nbSample);
+        _audioRtpRecord._converter->resample (spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, nbSample);
 
         if(Manager::instance().getEchoCancelState() == "enabled") {
             echoCanceller.putData(spkrDataConverted, expandedSize);
diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
index 59fa25b631b1575ef96a97de442b686df32e37c5..e7f081197628f83dd6e412e475c9fefe582e221a 100644
--- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
+++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
@@ -806,7 +806,7 @@ void PulseLayer::writeToSpeaker (void)
                 SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (writeableSize);
                 memset (out, 0, writeableSize);
 
-                _converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, byteToGet / sizeof (SFLDataFormat));
+                _converter->resample ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, byteToGet / sizeof (SFLDataFormat));
 
                 if ( byteToGet > (unsigned int) writeableSize)
                     _warn ("Audio: Error: nbsbyte exceed buffer length");
@@ -868,7 +868,7 @@ void PulseLayer::readFromMic (void)
             SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (readableSize);
             memset (rsmpl_out, 0, readableSize);
 
-            _converter->downsampleData ( (SFLDataFormat *) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, r / sizeof (SFLDataFormat));
+            _converter->resample ( (SFLDataFormat *) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, r / sizeof (SFLDataFormat));
 
             // remove dc offset
             _audiofilter->processAudio (rsmpl_out, r);
diff --git a/sflphone-common/src/audio/samplerateconverter.cpp b/sflphone-common/src/audio/samplerateconverter.cpp
index 585217a4596baec7b54361235f29bcfc87fe7cf8..2ea2e275c966c479baef7bb584466f9e89fcc954 100644
--- a/sflphone-common/src/audio/samplerateconverter.cpp
+++ b/sflphone-common/src/audio/samplerateconverter.cpp
@@ -31,35 +31,23 @@
 #include "samplerateconverter.h"
 #include "manager.h"
 
-SamplerateConverter::SamplerateConverter (int freq , int fs) :
-    _floatBufferDownMic (NULL)
-    , _floatBufferUpMic (NULL)
-    , _src_state_mic (NULL)
-    , _floatBufferDownSpkr (NULL)
-    , _floatBufferUpSpkr (NULL)
-    , _src_state_spkr (NULL)
+SamplerateConverter::SamplerateConverter (int freq , int fs)
 {
     int err;
-    _src_state_mic  = src_new (SRC_LINEAR, 1, &err);
-    _src_state_spkr = src_new (SRC_LINEAR, 1, &err);
+    _src_state = src_new (SRC_LINEAR, 1, &err);
 
     int nbSamplesMax = (int) ( (freq * fs) / 1000);
 
-    _floatBufferDownMic  = new float32[nbSamplesMax];
-    _floatBufferUpMic = new float32[nbSamplesMax];
-    _floatBufferDownSpkr  = new float32[nbSamplesMax];
-    _floatBufferUpSpkr = new float32[nbSamplesMax];
+    _floatBufferIn = new float32[nbSamplesMax];
+    _floatBufferOut = new float32[nbSamplesMax];
 }
 
 SamplerateConverter::~SamplerateConverter (void)
 {
-	delete [] _floatBufferUpMic;
-	delete [] _floatBufferDownMic;
-	delete [] _floatBufferUpSpkr;
-	delete [] _floatBufferDownSpkr;
+	delete [] _floatBufferIn;
+	delete [] _floatBufferOut;
 
-	src_delete (_src_state_mic);
-	src_delete (_src_state_spkr);
+	src_delete (_src_state);
 }
 
 void
@@ -72,50 +60,30 @@ SamplerateConverter::Short2FloatArray (const short *in, float *out, int len)
         out[len] = (float) in[len] * .000030517578125f;
 }
 
-
-//TODO Add ifdef for int16 or float32 type
-void SamplerateConverter::upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut, int samplerate1 , int samplerate2 , int nbSamples)
-{
-    double upsampleFactor = (double) samplerate2 / samplerate1 ;
-
-    if (upsampleFactor == 1)
-    	return;
-
-    SRC_DATA src_data;
-	src_data.data_in = _floatBufferDownSpkr;
-	src_data.data_out = _floatBufferUpSpkr;
-	src_data.input_frames = nbSamples;
-	src_data.output_frames = nbSamples;
-	src_data.src_ratio = upsampleFactor;
-	src_data.end_of_input = 0; // More data will come
-
-	Short2FloatArray (dataIn , _floatBufferDownSpkr, nbSamples);
-	src_process (_src_state_spkr, &src_data);
-
-	assert(nbSamples == src_data.output_frames_gen);
-	src_float_to_short_array (_floatBufferUpSpkr, dataOut, nbSamples);
-}
-
 //TODO Add ifdef for int16 or float32 type
-void SamplerateConverter::downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples)
+void SamplerateConverter::resample (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples)
 {
-    double downsampleFactor = (double) samplerate1 / samplerate2;
+    double sampleFactor;
+    if (samplerate1 > samplerate2)
+		sampleFactor = (double) samplerate1 / samplerate2;
+    else
+		sampleFactor = (double) samplerate2 / samplerate1;
 
-    if (downsampleFactor == 1)
+    if (sampleFactor == 1)
 		return;
 
 	SRC_DATA src_data;
-	src_data.data_in = _floatBufferUpMic;
-	src_data.data_out = _floatBufferDownMic;
+	src_data.data_in = _floatBufferIn;
+	src_data.data_out = _floatBufferOut;
 	src_data.input_frames = nbSamples;
 	src_data.output_frames = nbSamples;
-	src_data.src_ratio = downsampleFactor;
+	src_data.src_ratio = sampleFactor;
 	src_data.end_of_input = 0; // More data will come
 
-	Short2FloatArray (dataIn , _floatBufferUpMic, nbSamples);
-	src_process (_src_state_mic, &src_data);
+	Short2FloatArray (dataIn , _floatBufferIn, nbSamples);
+	src_process (_src_state, &src_data);
 
 	assert(nbSamples == src_data.output_frames_gen);
 
-	src_float_to_short_array (_floatBufferDownMic , dataOut , nbSamples);
+	src_float_to_short_array (_floatBufferOut, dataOut , nbSamples);
 }
diff --git a/sflphone-common/src/audio/samplerateconverter.h b/sflphone-common/src/audio/samplerateconverter.h
index 21204ebd7d5e42c6b3db172c4d8fce298cea285d..18f095d735283364790dc46ca904c83d4bb8ad8f 100644
--- a/sflphone-common/src/audio/samplerateconverter.h
+++ b/sflphone-common/src/audio/samplerateconverter.h
@@ -53,22 +53,13 @@ class SamplerateConverter
         ~SamplerateConverter (void);
 
         /**
-         * Upsample from the samplerate1 to the samplerate2
+         * resample from the samplerate1 to the samplerate2
          * @param data  The data buffer
-         * @param SamplerateConverter1 The lower sample rate
-         * @param SamplerateConverter2 The higher sample rate
+         * @param SamplerateConverter1 The original sample rate
+         * @param SamplerateConverter2 The desired sample rate
          * @param nbSamples	  The number of samples to process
          */
-        void upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
-
-        /**
-         * Downsample from the samplerate1 to the samplerate2
-         * @param data  The data buffer
-         * @param SamplerateConverter1 The lower sample rate
-         * @param SamplerateConverter2 The higher sample rate
-         * @param nbSamples	  The number of samples to process
-         */
-        void downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
+        void resample (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
 
         /**
          * Convert short table to floats for audio processing
@@ -86,17 +77,10 @@ class SamplerateConverter
         // Assignment Operator
         SamplerateConverter& operator= (const SamplerateConverter& rh);
 
-        /** Downsampled/Upsampled float buffers for the mic data processing */
-        float32* _floatBufferDownMic;
-        float32* _floatBufferUpMic;
-        /** libSamplerateConverter converter for outgoing voice */
-        SRC_STATE*    _src_state_mic;
+        float32* _floatBufferIn;
+        float32* _floatBufferOut;
 
-        /** Downsampled/Upsampled float buffers for the speaker data processing */
-        float32* _floatBufferDownSpkr;
-        float32* _floatBufferUpSpkr;
-        /** libSamplerateConverter converter for incoming voice */
-        SRC_STATE*    _src_state_spkr;
+        SRC_STATE* _src_state;
 };
 
 #endif //_SAMPLE_RATE_H
diff --git a/sflphone-common/src/audio/sound/audiofile.cpp b/sflphone-common/src/audio/sound/audiofile.cpp
index 1c78ab490e5e07bfb32c911279e69dbedd7b9797..69761cdab7e81de9a408d695dbc494f1c5eef8b1 100644
--- a/sflphone-common/src/audio/sound/audiofile.cpp
+++ b/sflphone-common/src/audio/sound/audiofile.cpp
@@ -250,9 +250,9 @@ WaveFile::WaveFile (const std::string& fileName, unsigned int audioSamplingRate)
 	    }
 
 		if (srate < audioSamplingRate)
-			_converter.upsampleData (tempBuffer, _buffer, srate, audioSamplingRate, nbSamples);
+			_converter.resample (tempBuffer, _buffer, srate, audioSamplingRate, nbSamples);
 		else if (srate > audioSamplingRate)
-			_converter.downsampleData (tempBuffer, _buffer, audioSamplingRate, srate, nbSamples);
+			_converter.resample (tempBuffer, _buffer, audioSamplingRate, srate, nbSamples);
 
 		delete[] tempBuffer;
     } else {
diff --git a/sflphone-common/src/iax/iaxvoiplink.cpp b/sflphone-common/src/iax/iaxvoiplink.cpp
index 6ec4923767b3708e804e3ce964bd91f6a7b409d9..e6f6212ce61ab1856395967686c1e658e755fccb 100644
--- a/sflphone-common/src/iax/iaxvoiplink.cpp
+++ b/sflphone-common/src/iax/iaxvoiplink.cpp
@@ -315,7 +315,7 @@ IAXVoIPLink::sendAudioFromMic (void)
 		int compSize;
 		if (audioCodec->getClockRate() && ((int) audioCodec->getClockRate() != _mainBufferSampleRate)) {
 			// resample
-			converter->downsampleData (micData , micDataConverted , (int) audioCodec->getClockRate(), _mainBufferSampleRate, bytes);
+			converter->resample (micData , micDataConverted , (int) audioCodec->getClockRate(), _mainBufferSampleRate, bytes);
 			compSize = audioCodec->encode (micDataEncoded, micDataConverted , bytes);
 		} else {
 			compSize = audioCodec->encode (micDataEncoded, micData, bytes);
@@ -963,7 +963,7 @@ IAXVoIPLink::iaxHandleVoiceEvent (iax_event* event, IAXCall* call)
 	expandedSize = audioCodec->decode (spkrDataDecoded , data , size);
 
 	if (audioCodec->getClockRate() && ((int) audioCodec->getClockRate() != _mainBufferSampleRate)) {
-		converter->upsampleData (spkrDataDecoded, spkrDataConverted, audioCodec->getClockRate(), _mainBufferSampleRate, expandedSize);
+		converter->resample (spkrDataDecoded, spkrDataConverted, audioCodec->getClockRate(), _mainBufferSampleRate, expandedSize);
 		audiolayer->getMainBuffer()->putData (spkrDataConverted, expandedSize, call->getCallId());
 
 	} else {