diff --git a/sflphone-common/src/audio/alsa/alsalayer.cpp b/sflphone-common/src/audio/alsa/alsalayer.cpp index ee5dc273501e0e12738c5f4f44226ba73356981e..2b7fa6ec7d0f1a91a53aaa366a2ceaed9e31be13 100644 --- a/sflphone-common/src/audio/alsa/alsalayer.cpp +++ b/sflphone-common/src/audio/alsa/alsalayer.cpp @@ -1014,55 +1014,53 @@ void AlsaLayer::audioCallback (void) SFLDataFormat* in = NULL; - if (is_capture_running()) { - - micAvailBytes = snd_pcm_avail_update (_CaptureHandle); + if (!is_capture_running()) + return; - if (micAvailBytes > 0) { - micAvailPut = getMainBuffer()->availForPut(); - toPut = (micAvailBytes <= framesPerBufferAlsa) ? micAvailBytes : framesPerBufferAlsa; - in = (SFLDataFormat*) malloc (toPut * sizeof (SFLDataFormat)); - toPut = read (in, toPut* sizeof (SFLDataFormat)); + micAvailBytes = snd_pcm_avail_update (_CaptureHandle); - if (in) { - adjustVolume (in, toPut, SFL_PCM_CAPTURE); + if (micAvailBytes < 0) + _debug ("Audio: Mic error: %s", snd_strerror (micAvailBytes)); + if (micAvailBytes <= 0) + return; + + micAvailPut = getMainBuffer()->availForPut(); + toPut = (micAvailBytes <= framesPerBufferAlsa) ? micAvailBytes : framesPerBufferAlsa; + in = (SFLDataFormat*) malloc (toPut * sizeof (SFLDataFormat)); + toPut = read (in, toPut* sizeof (SFLDataFormat)); - int _mainBufferSampleRate = getMainBuffer()->getInternalSamplingRate(); + adjustVolume (in, toPut, SFL_PCM_CAPTURE); - if (_mainBufferSampleRate && ( (int) _audioSampleRate != _mainBufferSampleRate)) { + int _mainBufferSampleRate = getMainBuffer()->getInternalSamplingRate(); - SFLDataFormat* rsmpl_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat)); + if (_mainBufferSampleRate && ( (int) _audioSampleRate != _mainBufferSampleRate)) { - int nbSample = toPut / sizeof (SFLDataFormat); - int nb_sample_up = nbSample; + SFLDataFormat* rsmpl_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat)); - nbSample = _converter->downsampleData ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up); + int nbSample = toPut / sizeof (SFLDataFormat); + int nb_sample_up = nbSample; - _audiofilter->processAudio (rsmpl_out, nbSample*sizeof (SFLDataFormat)); + nbSample = _converter->downsampleData ( (SFLDataFormat*) in, rsmpl_out, _mainBufferSampleRate, _audioSampleRate, nb_sample_up); - getMainBuffer()->putData (rsmpl_out, nbSample * sizeof (SFLDataFormat), 100); + _audiofilter->processAudio (rsmpl_out, nbSample*sizeof (SFLDataFormat)); - free (rsmpl_out); - rsmpl_out = 0; + getMainBuffer()->putData (rsmpl_out, nbSample * sizeof (SFLDataFormat), 100); - } else { - SFLDataFormat* filter_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat)); + free (rsmpl_out); + rsmpl_out = 0; - if (filter_out) { - _audiofilter->processAudio (in, filter_out, toPut); - // captureFile->write ( (const char *) filter_out, toPut); - getMainBuffer()->putData (filter_out, toPut, 100); - free (filter_out); - } - } - } + } else { + SFLDataFormat* filter_out = (SFLDataFormat*) malloc (framesPerBufferAlsa * sizeof (SFLDataFormat)); - free (in); - in=0; - } else if (micAvailBytes < 0) { - _debug ("Audio: Mic error: %s", snd_strerror (micAvailBytes)); + if (filter_out) { + _audiofilter->processAudio (in, filter_out, toPut); + // captureFile->write ( (const char *) filter_out, toPut); + getMainBuffer()->putData (filter_out, toPut, 100); + free (filter_out); } } + + free (in); } void* AlsaLayer::adjustVolume (void* buffer , int len, int stream)