diff --git a/sflphone-common/src/audio/alsa/alsalayer.cpp b/sflphone-common/src/audio/alsa/alsalayer.cpp
index 84dac7b974c20456da7975d6d82abf3975fbd8c3..3114c6da5428889ede94132be1e70ad74cf552e0 100644
--- a/sflphone-common/src/audio/alsa/alsalayer.cpp
+++ b/sflphone-common/src/audio/alsa/alsalayer.cpp
@@ -830,7 +830,6 @@ void AlsaLayer::audioCallback (void)
     AudioLoop *file_tone;
 
     SFLDataFormat *out = NULL;
-    SFLDataFormat *rsmpl_out = NULL;
 
     notifyincomingCall();
 
@@ -934,20 +933,12 @@ void AlsaLayer::audioCallback (void)
                         out[i] = out[i] * spkrVolume / 100;
 
                 if (_mainBufferSampleRate && ( (int) _audioSampleRate != _mainBufferSampleRate)) {
+                    SFLDataFormat *rsmpl_out = (SFLDataFormat*) malloc (playbackAvailBytes);
+					memset (out, 0, playbackAvailBytes);
 
-                    // Do sample rate conversion
-                    int nb_sample_down = toGet / sizeof (SFLDataFormat);
-
-                    if (rsmpl_out) {
-                        rsmpl_out = (SFLDataFormat*) malloc (playbackAvailBytes);
-                        memset (out, 0, playbackAvailBytes);
-
-                        int nbSample = _converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_down);
-                        write (rsmpl_out, nbSample*sizeof (SFLDataFormat), _PlaybackHandle);
-                        free (rsmpl_out);
-                    }
-
-                    rsmpl_out = 0;
+					_converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toGet / sizeof (SFLDataFormat));
+					write (rsmpl_out, toGet, _PlaybackHandle);
+					free (rsmpl_out);
 
                 } else {
 
@@ -1035,14 +1026,11 @@ void AlsaLayer::audioCallback (void)
 
         SFLDataFormat* rsmpl_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat));
 
-        int nbSample = toPut / sizeof (SFLDataFormat);
-        int nb_sample_up = nbSample;
-
-        nbSample = _converter->downsampleData ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up);
+        _converter->downsampleData ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, toPut / sizeof (SFLDataFormat));
 
-        _audiofilter->processAudio (rsmpl_out, nbSample*sizeof (SFLDataFormat));
+        _audiofilter->processAudio (rsmpl_out, toPut);
 
-        getMainBuffer()->putData (rsmpl_out, nbSample * sizeof (SFLDataFormat));
+        getMainBuffer()->putData (rsmpl_out, toPut);
 
         free (rsmpl_out);
     } else {
diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
index 7b9b0c83dd27bd4bc6e08751305bde2d86bc53eb..b72ccbb64a13f5a8602ab5d6fd8b1ad97ddf21f2 100644
--- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
+++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.cpp
@@ -188,7 +188,9 @@ void AudioRtpRecordHandler::initBuffers()
 
     // initialize SampleRate converter using AudioLayer's sampling rate
     // (internal buffers initialized with maximal sampling rate and frame size)
-    _audioRtpRecord._converter = new SamplerateConverter ();
+    int rate = getCodecSampleRate();
+    int fs = getCodecFrameSize();
+    _audioRtpRecord._converter = new SamplerateConverter (rate, fs);
 
     int nbSamplesMax = (int) ( (getCodecSampleRate() * getCodecFrameSize() / 1000));
     _audioRtpRecord._micData = new SFLDataFormat[nbSamplesMax];
@@ -262,47 +264,35 @@ int AudioRtpRecordHandler::processDataEncode (void)
     unsigned char *micDataEncoded = _audioRtpRecord._micDataEncoded;
     SFLDataFormat *micDataConverted = _audioRtpRecord._micDataConverted;
 
-    int codecFrameSize = getCodecFrameSize();
     int codecSampleRate = getCodecSampleRate();
-
     int mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
 
     // compute codec framesize in ms
-    float fixedCodecFramesize = computeCodecFrameSize (codecFrameSize, codecSampleRate);
-
+    float fixedCodecFramesize = ((float)getCodecFrameSize() * 1000.0) / (float)codecSampleRate;
     // compute nb of byte to get coresponding to 20 ms at audio layer frame size (44.1 khz)
-    int bytesToGet = computeNbByteAudioLayer (mainBufferSampleRate, fixedCodecFramesize);
-
-    // available bytes inside ringbuffer
-    int availBytesFromMic = Manager::instance().getMainBuffer()->availForGet (_id);
+    int bytesToGet = (int) ( ( (float) mainBufferSampleRate * fixedCodecFramesize * sizeof (SFLDataFormat)) / 1000.0);
 
-    if (availBytesFromMic < bytesToGet)
+    if (Manager::instance().getMainBuffer()->availForGet (_id) < bytesToGet)
         return 0;
 
-    // Get bytes from micRingBuffer to data_from_mic
-    int nbSample = Manager::instance().getMainBuffer()->getData (micData, bytesToGet, _id) / sizeof (SFLDataFormat);
+    int bytes = Manager::instance().getMainBuffer()->getData (micData, bytesToGet, _id);
+    if (bytes == 0)
+        return 0;
 
-    // process mic fade in
     if (!_audioRtpRecord._micFadeInComplete)
-        _audioRtpRecord._micFadeInComplete = fadeIn (micData, nbSample, &_audioRtpRecord._micAmplFactor);
-
-    if (nbSample == 0)
-        return nbSample;
+        _audioRtpRecord._micFadeInComplete = fadeIn (micData, bytes / sizeof(SFLDataFormat), &_audioRtpRecord._micAmplFactor);
 
     // nb bytes to be sent over RTP
-    int compSize = 0;
+    int compSize;
 
     // test if resampling is required
     if (codecSampleRate != mainBufferSampleRate) {
-
-        int nbSampleUp = nbSample;
-
-        nbSample = _audioRtpRecord._converter->downsampleData (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, nbSampleUp);
+        _audioRtpRecord._converter->downsampleData (micData, micDataConverted, codecSampleRate, mainBufferSampleRate, bytes / sizeof(SFLDataFormat));
 
         _audioRtpRecord.audioProcessMutex.enter();
 
         if (Manager::instance().audioPreference.getNoiseReduce()) {
-            _audioRtpRecord._audioProcess->processAudio (micDataConverted, nbSample * sizeof (SFLDataFormat));
+            _audioRtpRecord._audioProcess->processAudio (micDataConverted, bytes);
         }
 
         if(Manager::instance().getEchoCancelState() == "enabled") {
@@ -313,22 +303,18 @@ int AudioRtpRecordHandler::processDataEncode (void)
 
         _audioRtpRecord.audioCodecMutex.enter();
 
-        compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, micData, nbSample * sizeof (SFLDataFormat));
+        compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, micData, bytes);
 
         _audioRtpRecord.audioCodecMutex.leave();
 
-    } else {
-
+    } else {        // no resampling required
         _audioRtpRecord.audioProcessMutex.enter();
 
-        if (Manager::instance().audioPreference.getNoiseReduce()) {
-            _audioRtpRecord._audioProcess->processAudio (micData, nbSample * sizeof (SFLDataFormat));
-        }
+        if (Manager::instance().audioPreference.getNoiseReduce())
+            _audioRtpRecord._audioProcess->processAudio (micData, bytes);
 
-        if(Manager::instance().getEchoCancelState() == "enabled") {
+        if(Manager::instance().getEchoCancelState() == "enabled")
             echoCanceller.getData(micData);
-        }
-
 	
 #ifdef DUMP_PROCESS_DATA_ENCODE
         teststream.write(reinterpret_cast<char *>(micData), nbSample * sizeof(SFLDataFormat));
@@ -337,10 +323,7 @@ int AudioRtpRecordHandler::processDataEncode (void)
         _audioRtpRecord.audioProcessMutex.leave();
 
         _audioRtpRecord.audioCodecMutex.enter();
-
-        // no resampling required
-        compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, micData, nbSample * sizeof (SFLDataFormat));
-
+        compSize = _audioRtpRecord._audioCodec->encode (micDataEncoded, micData, bytes);
         _audioRtpRecord.audioCodecMutex.leave();
     }
 
@@ -376,15 +359,14 @@ void AudioRtpRecordHandler::processDataDecode (unsigned char *spkrData, unsigned
     // test if resampling is required
     if (codecSampleRate != mainBufferSampleRate) {
         // Do sample rate conversion
-        nbSample = _audioRtpRecord._converter->upsampleData (spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, nbSample);
+        _audioRtpRecord._converter->upsampleData (spkrDataDecoded, spkrDataConverted, codecSampleRate, mainBufferSampleRate, nbSample);
 
         if(Manager::instance().getEchoCancelState() == "enabled") {
-            echoCanceller.putData(spkrDataConverted, nbSample * sizeof(SFLDataFormat));
+            echoCanceller.putData(spkrDataConverted, expandedSize);
         }
 
         // put data in audio layer, size in byte
-        Manager::instance().getMainBuffer()->putData (spkrDataConverted, nbSample * sizeof (SFLDataFormat), _id);
-
+        Manager::instance().getMainBuffer()->putData (spkrDataConverted, expandedSize, _id);
 
     } else {
     	if(Manager::instance().getEchoCancelState() == "enabled") {
diff --git a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h
index 07ed3df713b7537c1eec0533ecfd7bdc4cb9ec60..21a4e8a08177220cd592b47d6f8bfbb5a4070b69 100644
--- a/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h
+++ b/sflphone-common/src/audio/audiortp/AudioRtpRecordHandler.h
@@ -174,14 +174,6 @@ class AudioRtpRecordHandler
             return _audioRtpRecord._micDataEncoded;
         }
 
-        float computeCodecFrameSize (int codecSamplePerFrame, int codecClockRate) const {
-            return ( (float) codecSamplePerFrame * 1000.0) / (float) codecClockRate;
-        }
-
-        int computeNbByteAudioLayer (int mainBufferSamplingRate, float codecFrameSize) const {
-            return (int) ( ( (float) mainBufferSamplingRate * codecFrameSize * sizeof (SFLDataFormat)) / 1000.0);
-        }
-
         void init (void);
 
         /**
diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
index b4d38ba09eccaf25c432f7b1966bbc8c95015faa..59fa25b631b1575ef96a97de442b686df32e37c5 100644
--- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
+++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
@@ -768,7 +768,6 @@ void PulseLayer::writeToSpeaker (void)
                 pa_stream_write (playback->pulseStream(), out, copied * sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
 
                 pa_xfree (out);
- 
         }
     }
     else {
@@ -794,11 +793,8 @@ void PulseLayer::writeToSpeaker (void)
         byteToGet = (normalAvailBytes < (int) (maxNbBytesToGet)) ? normalAvailBytes : maxNbBytesToGet;
 
         if (byteToGet) {
-
             // Sending an odd number of byte breaks the audio!
-            if ( (byteToGet%2) != 0) {
-                byteToGet = byteToGet-1;
-	    }
+        	byteToGet &= ~1;
 
             out = (SFLDataFormat*) pa_xmalloc (maxNbBytesToGet);
             memset (out, 0, maxNbBytesToGet);
@@ -807,29 +803,22 @@ void PulseLayer::writeToSpeaker (void)
 
             // test if resampling is required
             if (_mainBufferSampleRate && ( (int) _audioSampleRate != _mainBufferSampleRate)) {
-
                 SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (writeableSize);
                 memset (out, 0, writeableSize);
 
-                // Do sample rate conversion
-                int nb_sample_down = byteToGet / sizeof (SFLDataFormat);
+                _converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, byteToGet / sizeof (SFLDataFormat));
 
-                int nbSample = _converter->upsampleData ( (SFLDataFormat*) out, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_down);
-
-                if ( (nbSample*sizeof (SFLDataFormat)) > (unsigned int) writeableSize) {
+                if ( byteToGet > (unsigned int) writeableSize)
                     _warn ("Audio: Error: nbsbyte exceed buffer length");
-		}
 
-	 	// write resample data
-                pa_stream_write (playback->pulseStream(), rsmpl_out, nbSample*sizeof (SFLDataFormat), NULL, 0, PA_SEEK_RELATIVE);
+                pa_stream_write (playback->pulseStream(), rsmpl_out, byteToGet, NULL, 0, PA_SEEK_RELATIVE);
 
-	        // free resampling buffer
                 pa_xfree (rsmpl_out);
 
             } else {
 		// write origin data
                 pa_stream_write (playback->pulseStream(), out, byteToGet, NULL, 0, PA_SEEK_RELATIVE);
-	    }
+            }
 
 	    // free audio buffer used to get data from 
             pa_xfree (out);
@@ -855,7 +844,6 @@ void PulseLayer::writeToSpeaker (void)
 	_urgentRingBuffer.Discard (byteToGet);
 
     }
-
 }
 
 void PulseLayer::readFromMic (void)
@@ -880,16 +868,12 @@ void PulseLayer::readFromMic (void)
             SFLDataFormat* rsmpl_out = (SFLDataFormat*) pa_xmalloc (readableSize);
             memset (rsmpl_out, 0, readableSize);
 
-            int nbSample = r / sizeof (SFLDataFormat);
-
-            int nb_sample_up = nbSample;
-
-            nbSample = _converter->downsampleData ( (SFLDataFormat *) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up);
+            _converter->downsampleData ( (SFLDataFormat *) data, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, r / sizeof (SFLDataFormat));
 
             // remove dc offset
-            _audiofilter->processAudio (rsmpl_out, nbSample*sizeof (SFLDataFormat));
+            _audiofilter->processAudio (rsmpl_out, r);
 
-            getMainBuffer()->putData (rsmpl_out, nbSample*sizeof (SFLDataFormat));
+            getMainBuffer()->putData (rsmpl_out, r);
 
             pa_xfree (rsmpl_out);
 
diff --git a/sflphone-common/src/audio/samplerateconverter.cpp b/sflphone-common/src/audio/samplerateconverter.cpp
index e9a75b21fdd315646571070f9f165958095685d3..585217a4596baec7b54361235f29bcfc87fe7cf8 100644
--- a/sflphone-common/src/audio/samplerateconverter.cpp
+++ b/sflphone-common/src/audio/samplerateconverter.cpp
@@ -31,67 +31,19 @@
 #include "samplerateconverter.h"
 #include "manager.h"
 
-SamplerateConverter::SamplerateConverter (int freq , int fs)
-    : _frequence (freq)
-    , _framesize (fs)
-    , _floatBufferDownMic (NULL)
+SamplerateConverter::SamplerateConverter (int freq , int fs) :
+    _floatBufferDownMic (NULL)
     , _floatBufferUpMic (NULL)
     , _src_state_mic (NULL)
     , _floatBufferDownSpkr (NULL)
     , _floatBufferUpSpkr (NULL)
     , _src_state_spkr (NULL)
-    , _src_err (0)
 {
-    init();
-}
-
-SamplerateConverter::~SamplerateConverter (void)
-{
-
-    if (_floatBufferUpMic) {
-        delete [] _floatBufferUpMic;
-        _floatBufferUpMic = NULL;
-    }
-
-    if (_floatBufferDownMic) {
-        delete [] _floatBufferDownMic;
-        _floatBufferDownMic = NULL;
-    }
-
-    if (_floatBufferUpSpkr) {
-        delete [] _floatBufferUpSpkr;
-        _floatBufferUpSpkr = NULL;
-    }
-
-    if (_floatBufferDownSpkr) {
-        delete [] _floatBufferDownSpkr;
-        _floatBufferDownSpkr = NULL;
-    }
-
-    // libSamplerateConverter-related
-    if (_src_state_mic) {
-        _src_state_mic  = src_delete (_src_state_mic);
-        _src_state_mic = NULL;
-    }
-
-    if (_src_state_spkr) {
-        _src_state_spkr = src_delete (_src_state_spkr);
-        _src_state_spkr = NULL;
-    }
-}
+    int err;
+    _src_state_mic  = src_new (SRC_LINEAR, 1, &err);
+    _src_state_spkr = src_new (SRC_LINEAR, 1, &err);
 
-void SamplerateConverter::init (void)
-{
-
-    // libSamplerateConverter-related
-    // Set the converter type for the upsampling and the downsampling
-    // interpolator SRC_SINC_BEST_QUALITY
-    // interpolator SRC_SINC_FASTEST
-    // interpolator SRC_LINEAR
-    _src_state_mic  = src_new (SRC_LINEAR, 1, &_src_err);
-    _src_state_spkr = src_new (SRC_LINEAR, 1, &_src_err);
-
-    int nbSamplesMax = (int) ( (_frequence * _framesize) / 1000);
+    int nbSamplesMax = (int) ( (freq * fs) / 1000);
 
     _floatBufferDownMic  = new float32[nbSamplesMax];
     _floatBufferUpMic = new float32[nbSamplesMax];
@@ -99,78 +51,71 @@ void SamplerateConverter::init (void)
     _floatBufferUpSpkr = new float32[nbSamplesMax];
 }
 
+SamplerateConverter::~SamplerateConverter (void)
+{
+	delete [] _floatBufferUpMic;
+	delete [] _floatBufferDownMic;
+	delete [] _floatBufferUpSpkr;
+	delete [] _floatBufferDownSpkr;
+
+	src_delete (_src_state_mic);
+	src_delete (_src_state_spkr);
+}
+
 void
 SamplerateConverter::Short2FloatArray (const short *in, float *out, int len)
 {
     // factor is 1/(2^15), used to rescale the short int range to the
     // [-1.0 - 1.0] float range.
-#define S2F_FACTOR .000030517578125f;
 
-    while (len) {
-        len--;
-        out[len] = (float) in[len] * S2F_FACTOR;
-    }
+    while (len--)
+        out[len] = (float) in[len] * .000030517578125f;
 }
 
 
 //TODO Add ifdef for int16 or float32 type
-int SamplerateConverter::upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut, int samplerate1 , int samplerate2 , int nbSamples)
+void SamplerateConverter::upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut, int samplerate1 , int samplerate2 , int nbSamples)
 {
-
     double upsampleFactor = (double) samplerate2 / samplerate1 ;
 
-    int nbSamplesMax = (int) (samplerate2 * _framesize / 1000);
-
-    if (upsampleFactor != 1 && dataIn != NULL) {
-        SRC_DATA src_data;
-        src_data.data_in = _floatBufferDownSpkr;
-        src_data.data_out = _floatBufferUpSpkr;
-        src_data.input_frames = nbSamples;
-        src_data.output_frames = (int) floor (upsampleFactor * nbSamples);
-        src_data.src_ratio = upsampleFactor;
-        src_data.end_of_input = 0; // More data will come
-        // _debug("    upsample %d %d %f %d" , src_data.input_frames , src_data.output_frames, src_data.src_ratio , nbSamples);
-        // Override libsamplerate conversion function
-        Short2FloatArray (dataIn , _floatBufferDownSpkr, nbSamples);
-        //src_short_to_float_array (dataIn , _floatBufferDownSpkr, nbSamples);
-        //_debug("upsample %d %f %d" ,  src_data.output_frames, src_data.src_ratio , nbSamples);
-        src_process (_src_state_spkr, &src_data);
-        // _debug("    upsample %d %d %d" , samplerate1, samplerate2 , nbSamples);
-        nbSamples  = (src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen;
-        src_float_to_short_array (_floatBufferUpSpkr, dataOut, nbSamples);
-        //_debug("upsample %d %d %d" , samplerate1, samplerate2 , nbSamples);
-    }
-
-    return nbSamples;
+    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
-int SamplerateConverter::downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples)
+void SamplerateConverter::downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples)
 {
-
     double downsampleFactor = (double) samplerate1 / samplerate2;
 
-    int nbSamplesMax = (int) (samplerate1 * _framesize / 1000);
-
-    if (downsampleFactor != 1) {
-        SRC_DATA src_data;
-        src_data.data_in = _floatBufferUpMic;
-        src_data.data_out = _floatBufferDownMic;
-        src_data.input_frames = nbSamples;
-        src_data.output_frames = (int) floor (downsampleFactor * nbSamples);
-        src_data.src_ratio = downsampleFactor;
-        src_data.end_of_input = 0; // More data will come
-        //_debug("downsample %d %f %d" ,  src_data.output_frames, src_data.src_ratio , nbSamples);
-        // Override libsamplerate conversion function
-        Short2FloatArray (dataIn , _floatBufferUpMic, nbSamples);
-        //src_short_to_float_array (dataIn, _floatBufferUpMic, nbSamples);
-        //_debug("downsample %d %f %d" ,  src_data.output_frames, src_data.src_ratio , nbSamples);
-        src_process (_src_state_mic, &src_data);
-        //_debug("downsample %d %f %d" ,  src_data.output_frames, src_data.src_ratio , nbSamples);
-        nbSamples  = (src_data.output_frames_gen > nbSamplesMax) ? nbSamplesMax : src_data.output_frames_gen;
-        //_debug("downsample %d %f %d" ,  src_data.output_frames, src_data.src_ratio , nbSamples);
-        src_float_to_short_array (_floatBufferDownMic , dataOut , nbSamples);
-    }
-
-    return nbSamples;
+    if (downsampleFactor == 1)
+		return;
+
+	SRC_DATA src_data;
+	src_data.data_in = _floatBufferUpMic;
+	src_data.data_out = _floatBufferDownMic;
+	src_data.input_frames = nbSamples;
+	src_data.output_frames = nbSamples;
+	src_data.src_ratio = downsampleFactor;
+	src_data.end_of_input = 0; // More data will come
+
+	Short2FloatArray (dataIn , _floatBufferUpMic, nbSamples);
+	src_process (_src_state_mic, &src_data);
+
+	assert(nbSamples == src_data.output_frames_gen);
+
+	src_float_to_short_array (_floatBufferDownMic , dataOut , nbSamples);
 }
diff --git a/sflphone-common/src/audio/samplerateconverter.h b/sflphone-common/src/audio/samplerateconverter.h
index a6c3b50ef7c08ef7212ce90e4ff45b5c868155ad..21204ebd7d5e42c6b3db172c4d8fce298cea285d 100644
--- a/sflphone-common/src/audio/samplerateconverter.h
+++ b/sflphone-common/src/audio/samplerateconverter.h
@@ -47,7 +47,7 @@ class SamplerateConverter
         * internal buffer size. Converter must be reinitialized
         * every time these parameters change
         */
-        SamplerateConverter (int freq=44100, int frameSize=20);
+        SamplerateConverter (int freq, int frameSize);
 
         /** Destructor */
         ~SamplerateConverter (void);
@@ -58,9 +58,8 @@ class SamplerateConverter
          * @param SamplerateConverter1 The lower sample rate
          * @param SamplerateConverter2 The higher sample rate
          * @param nbSamples	  The number of samples to process
-         * @return int The number of samples after the operation
          */
-        int upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
+        void upsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
 
         /**
          * Downsample from the samplerate1 to the samplerate2
@@ -68,9 +67,8 @@ class SamplerateConverter
          * @param SamplerateConverter1 The lower sample rate
          * @param SamplerateConverter2 The higher sample rate
          * @param nbSamples	  The number of samples to process
-         * @return int The number of samples after the operation
          */
-        int downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
+        void downsampleData (SFLDataFormat* dataIn , SFLDataFormat* dataOut , int samplerate1 , int samplerate2 , int nbSamples);
 
         /**
          * Convert short table to floats for audio processing
@@ -88,12 +86,6 @@ class SamplerateConverter
         // Assignment Operator
         SamplerateConverter& operator= (const SamplerateConverter& rh);
 
-        void init (void);
-
-        /** Audio layer caracteristics */
-        int _frequence;
-        int _framesize;
-
         /** Downsampled/Upsampled float buffers for the mic data processing */
         float32* _floatBufferDownMic;
         float32* _floatBufferUpMic;
@@ -105,10 +97,6 @@ class SamplerateConverter
         float32* _floatBufferUpSpkr;
         /** libSamplerateConverter converter for incoming voice */
         SRC_STATE*    _src_state_spkr;
-        /** libSamplerateConverter error */
-        int _src_err;
-
-
 };
 
 #endif //_SAMPLE_RATE_H
diff --git a/sflphone-common/src/audio/sound/audiofile.cpp b/sflphone-common/src/audio/sound/audiofile.cpp
index 311e0ee914f6f04b8ea574c89ccc3eb64e859401..5214504beac6059c39a9a80d2ac9a1bb70d48f44 100644
--- a/sflphone-common/src/audio/sound/audiofile.cpp
+++ b/sflphone-common/src/audio/sound/audiofile.cpp
@@ -397,20 +397,19 @@ void WaveFile::openExistingWaveFile (const std::string& fileName, int audioSampl
         while (remainingSamples > 0) {
 
             int toProcess = remainingSamples > nbSampleMax ? nbSampleMax : remainingSamples;
-            int nbSamplesConverted = 0;
 
             if (srate < audioSamplingRate) {
-                nbSamplesConverted = _converter.upsampleData (in, out, srate, audioSamplingRate, toProcess);
+                _converter.upsampleData (in, out, srate, audioSamplingRate, toProcess);
             } else if (srate > audioSamplingRate) {
-                nbSamplesConverted = _converter.downsampleData (in, out, audioSamplingRate, srate, toProcess);
+                _converter.downsampleData (in, out, audioSamplingRate, srate, toProcess);
             }
 
             // nbSamplesConverted = nbSamplesConverted*2;
 
             in += toProcess;
-            out += nbSamplesConverted;
+            out += toProcess;
             remainingSamples -= toProcess;
-            totalprocessed += nbSamplesConverted;
+            totalprocessed += toProcess;
         }
     }
 
diff --git a/sflphone-common/src/iax/iaxvoiplink.cpp b/sflphone-common/src/iax/iaxvoiplink.cpp
index 84838945edb0eb302819ce79d25dbd926984f1f3..6ec4923767b3708e804e3ce964bd91f6a7b409d9 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
-			bytes = converter->downsampleData (micData , micDataConverted , (int) audioCodec->getClockRate(), _mainBufferSampleRate, bytes);
+			converter->downsampleData (micData , micDataConverted , (int) audioCodec->getClockRate(), _mainBufferSampleRate, bytes);
 			compSize = audioCodec->encode (micDataEncoded, micDataConverted , bytes);
 		} else {
 			compSize = audioCodec->encode (micDataEncoded, micData, bytes);
@@ -928,67 +928,47 @@ IAXVoIPLink::iaxHandleVoiceEvent (iax_event* event, IAXCall* call)
         return;
 
     if (audiolayer) {
+        _debug ("IAX: incoming audio, but no sound card open");
+        return;
+    }
 
-        Manager::instance().getMainBuffer ()->setInternalSamplingRate (audioCodec->getClockRate ());
-
-        // If we receive datalen == 0, some things of the jitter buffer in libiax2/iax.c
-        // were triggered
-
-        int _mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
-
-        // On-the-fly codec changing (normally, when we receive a full packet)
-        // as per http://tools.ietf.org/id/draft-guy-iax-03.txt
-        // - subclass holds the voiceformat property.
-
-        if (event->subclass && event->subclass != call->getFormat()) {
-            _debug ("iaxHandleVoiceEvent: no format found in call setting it to %i", event->subclass);
-            call->setFormat (event->subclass);
-        }
-
-        data = (unsigned char*) event->data;
-
-        size   = event->datalen;
-
-        // Decode data with relevant codec
-        max = (int) (audioCodec->getClockRate() * audiolayer->getFrameSize() / 1000);
-
-        if (size > max) {
-            _debug ("The size %d is bigger than expected %d. Packet cropped. Ouch!", size, max);
-            size = max;
-        }
-
-        expandedSize = audioCodec->decode (spkrDataDecoded , data , size);
-
-        nbInt16      = expandedSize/sizeof (int16);
+	Manager::instance().getMainBuffer ()->setInternalSamplingRate (audioCodec->getClockRate ());
 
-        if (nbInt16 > max) {
-            _debug ("We have decoded an IAX VOICE packet larger than expected: %i VS %i. Cropping.", nbInt16, max);
-            nbInt16 = max;
-        }
+	// If we receive datalen == 0, some things of the jitter buffer in libiax2/iax.c
+	// were triggered
 
-        nbSample_ = nbInt16;
+	int _mainBufferSampleRate = Manager::instance().getMainBuffer()->getInternalSamplingRate();
 
-        // test if resampling is required
+	// On-the-fly codec changing (normally, when we receive a full packet)
+	// as per http://tools.ietf.org/id/draft-guy-iax-03.txt
+	// - subclass holds the voiceformat property.
 
-        if (audioCodec->getClockRate() && ((int) audioCodec->getClockRate() != _mainBufferSampleRate)) {
+	if (event->subclass && event->subclass != call->getFormat()) {
+		_debug ("iaxHandleVoiceEvent: no format found in call setting it to %i", event->subclass);
+		call->setFormat (event->subclass);
+	}
 
-            // resample
-            nbInt16 = converter->upsampleData (spkrDataDecoded, spkrDataConverted, audioCodec->getClockRate(), _mainBufferSampleRate, nbSample_);
+	data = (unsigned char*) event->data;
 
-            /* Write the data to the mic ring buffer */
-            audiolayer->getMainBuffer()->putData (spkrDataConverted, nbInt16 * sizeof (SFLDataFormat), call->getCallId());
+	size   = event->datalen;
 
-        } else {
+	// Decode data with relevant codec
+	max = (int) (audioCodec->getClockRate() * audiolayer->getFrameSize() / 1000);
 
-            /* Write the data to the mic ring buffer */
-            audiolayer->getMainBuffer()->putData (spkrDataDecoded, nbInt16 * sizeof (SFLDataFormat), call->getCallId());
+	if (size > max) {
+		_debug ("The size %d is bigger than expected %d. Packet cropped. Ouch!", size, max);
+		size = max;
+	}
 
-        }
+	expandedSize = audioCodec->decode (spkrDataDecoded , data , size);
 
-    } else {
-        _debug ("IAX: incoming audio, but no sound card open");
-    }
+	if (audioCodec->getClockRate() && ((int) audioCodec->getClockRate() != _mainBufferSampleRate)) {
+		converter->upsampleData (spkrDataDecoded, spkrDataConverted, audioCodec->getClockRate(), _mainBufferSampleRate, expandedSize);
+		audiolayer->getMainBuffer()->putData (spkrDataConverted, expandedSize, call->getCallId());
 
+	} else {
+		audiolayer->getMainBuffer()->putData (spkrDataDecoded, expandedSize, call->getCallId());
+	}
 }
 
 /**