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 {