| Index: webrtc/modules/audio_processing/aec/aec_core.cc
|
| diff --git a/webrtc/modules/audio_processing/aec/aec_core.c b/webrtc/modules/audio_processing/aec/aec_core.cc
|
| similarity index 95%
|
| rename from webrtc/modules/audio_processing/aec/aec_core.c
|
| rename to webrtc/modules/audio_processing/aec/aec_core.cc
|
| index 76a33cec165e373530641fd7085e80813481834d..2cc2968f81c2e2ffc658d15ba048e3890d8a4a47 100644
|
| --- a/webrtc/modules/audio_processing/aec/aec_core.c
|
| +++ b/webrtc/modules/audio_processing/aec/aec_core.cc
|
| @@ -24,13 +24,19 @@
|
| #include <stdlib.h>
|
| #include <string.h>
|
|
|
| +extern "C" {
|
| #include "webrtc/common_audio/ring_buffer.h"
|
| +}
|
| #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
|
| #include "webrtc/modules/audio_processing/aec/aec_common.h"
|
| #include "webrtc/modules/audio_processing/aec/aec_core_internal.h"
|
| +extern "C" {
|
| #include "webrtc/modules/audio_processing/aec/aec_rdft.h"
|
| +}
|
| #include "webrtc/modules/audio_processing/logging/aec_logging.h"
|
| +extern "C" {
|
| #include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
|
| +}
|
| #include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
|
| #include "webrtc/typedefs.h"
|
|
|
| @@ -43,8 +49,7 @@ static const int countLen = 50;
|
| static const int kDelayMetricsAggregationWindow = 1250; // 5 seconds at 16 kHz.
|
|
|
| // Quantities to control H band scaling for SWB input
|
| -static const float cnScaleHband =
|
| - (float)0.4; // scale for comfort noise in H band
|
| +static const float cnScaleHband = 0.4f; // scale for comfort noise in H band.
|
| // Initial bin for averaging nlp gain in low band
|
| static const int freqAvgIc = PART_LEN / 2;
|
|
|
| @@ -416,11 +421,11 @@ static void SubbandCoherence(AecCore* aec,
|
| static void GetHighbandGain(const float* lambda, float* nlpGainHband) {
|
| int i;
|
|
|
| - *nlpGainHband = (float)0.0;
|
| + *nlpGainHband = 0.0f;
|
| for (i = freqAvgIc; i < PART_LEN1 - 1; i++) {
|
| *nlpGainHband += lambda[i];
|
| }
|
| - *nlpGainHband /= (float)(PART_LEN1 - 1 - freqAvgIc);
|
| + *nlpGainHband /= static_cast<float>(PART_LEN1 - 1 - freqAvgIc);
|
| }
|
|
|
| static void ComfortNoise(AecCore* aec,
|
| @@ -439,7 +444,7 @@ static void ComfortNoise(AecCore* aec,
|
| // Generate a uniform random array on [0 1]
|
| WebRtcSpl_RandUArray(randW16, PART_LEN, &aec->seed);
|
| for (i = 0; i < PART_LEN; i++) {
|
| - rand[i] = ((float)randW16[i]) / 32768;
|
| + rand[i] = static_cast<float>(randW16[i]) / 32768;
|
| }
|
|
|
| // Reject LF noise
|
| @@ -463,32 +468,34 @@ static void ComfortNoise(AecCore* aec,
|
| }
|
|
|
| // For H band comfort noise
|
| - // TODO: don't compute noise and "tmp" twice. Use the previous results.
|
| + // TODO(peah): don't compute noise and "tmp" twice. Use the previous results.
|
| noiseAvg = 0.0;
|
| tmpAvg = 0.0;
|
| num = 0;
|
| if (aec->num_bands > 1) {
|
| // average noise scale
|
| // average over second half of freq spectrum (i.e., 4->8khz)
|
| - // TODO: we shouldn't need num. We know how many elements we're summing.
|
| + // TODO(peah): we shouldn't need num. We know how many elements we're
|
| + // summing.
|
| for (i = PART_LEN1 >> 1; i < PART_LEN1; i++) {
|
| num++;
|
| noiseAvg += sqrtf(noisePow[i]);
|
| }
|
| - noiseAvg /= (float)num;
|
| + noiseAvg /= static_cast<float>(num);
|
|
|
| // average nlp scale
|
| // average over second half of freq spectrum (i.e., 4->8khz)
|
| - // TODO: we shouldn't need num. We know how many elements we're summing.
|
| + // TODO(peah): we shouldn't need num. We know how many elements
|
| + // we're summing.
|
| num = 0;
|
| for (i = PART_LEN1 >> 1; i < PART_LEN1; i++) {
|
| num++;
|
| tmpAvg += sqrtf(WEBRTC_SPL_MAX(1 - lambda[i] * lambda[i], 0));
|
| }
|
| - tmpAvg /= (float)num;
|
| + tmpAvg /= static_cast<float>(num);
|
|
|
| // Use average noise for H band
|
| - // TODO: we should probably have a new random vector here.
|
| + // TODO(peah): we should probably have a new random vector here.
|
| // Reject LF noise
|
| u[0][0] = 0;
|
| u[1][0] = 0;
|
| @@ -496,8 +503,8 @@ static void ComfortNoise(AecCore* aec,
|
| tmp = pi2 * rand[i - 1];
|
|
|
| // Use average noise for H band
|
| - u[0][i] = noiseAvg * (float)cos(tmp);
|
| - u[1][i] = -noiseAvg * (float)sin(tmp);
|
| + u[0][i] = noiseAvg * static_cast<float>(cos(tmp));
|
| + u[1][i] = -noiseAvg * static_cast<float>(sin(tmp));
|
| }
|
| u[1][PART_LEN] = 0;
|
|
|
| @@ -621,10 +628,12 @@ static void UpdateMetrics(AecCore* aec) {
|
| echo = aec->nearlevel.averagelevel - safety * aec->nearlevel.minlevel;
|
|
|
| // ERL
|
| - dtmp = 10 * (float)log10(aec->farlevel.averagelevel /
|
| - aec->nearlevel.averagelevel +
|
| - 1e-10f);
|
| - dtmp2 = 10 * (float)log10(aec->farlevel.averagelevel / echo + 1e-10f);
|
| + dtmp = 10 * static_cast<float>(log10(aec->farlevel.averagelevel /
|
| + aec->nearlevel.averagelevel +
|
| + 1e-10f));
|
| + dtmp2 = 10 * static_cast<float>(log10(aec->farlevel.averagelevel /
|
| + echo +
|
| + 1e-10f));
|
|
|
| aec->erl.instant = dtmp;
|
| if (dtmp > aec->erl.max) {
|
| @@ -647,14 +656,15 @@ static void UpdateMetrics(AecCore* aec) {
|
| }
|
|
|
| // A_NLP
|
| - dtmp = 10 * (float)log10(aec->nearlevel.averagelevel /
|
| - aec->linoutlevel.averagelevel + 1e-10f);
|
| + dtmp = 10 * static_cast<float>(log10(aec->nearlevel.averagelevel /
|
| + aec->linoutlevel.averagelevel +
|
| + 1e-10f));
|
|
|
| // subtract noise power
|
| suppressedEcho = aec->linoutlevel.averagelevel -
|
| safety * aec->linoutlevel.minlevel;
|
|
|
| - dtmp2 = 10 * (float)log10(echo / suppressedEcho + 1e-10f);
|
| + dtmp2 = 10 * static_cast<float>(log10(echo / suppressedEcho + 1e-10f));
|
|
|
| aec->aNlp.instant = dtmp2;
|
| if (dtmp > aec->aNlp.max) {
|
| @@ -682,10 +692,10 @@ static void UpdateMetrics(AecCore* aec) {
|
| suppressedEcho = 2 * (aec->nlpoutlevel.averagelevel -
|
| safety * aec->nlpoutlevel.minlevel);
|
|
|
| - dtmp = 10 * (float)log10(aec->nearlevel.averagelevel /
|
| - (2 * aec->nlpoutlevel.averagelevel) +
|
| - 1e-10f);
|
| - dtmp2 = 10 * (float)log10(echo / suppressedEcho + 1e-10f);
|
| + dtmp = 10 * static_cast<float>(log10(aec->nearlevel.averagelevel /
|
| + (2 * aec->nlpoutlevel.averagelevel) +
|
| + 1e-10f));
|
| + dtmp2 = 10 * static_cast<float>(log10(echo / suppressedEcho + 1e-10f));
|
|
|
| dtmp = dtmp2;
|
| aec->erle.instant = dtmp;
|
| @@ -751,8 +761,8 @@ static void UpdateDelayMetrics(AecCore* self) {
|
| l1_norm += abs(i - median) * self->delay_histogram[i];
|
| }
|
| self->delay_std =
|
| - (int)((l1_norm + self->num_delay_values / 2) / self->num_delay_values) *
|
| - kMsPerBlock;
|
| + static_cast<int>((l1_norm + self->num_delay_values / 2) /
|
| + self->num_delay_values) * kMsPerBlock;
|
|
|
| // Determine fraction of delays that are out of bounds, that is, either
|
| // negative (anti-causal system) or larger than the AEC filter length.
|
| @@ -765,7 +775,7 @@ static void UpdateDelayMetrics(AecCore* self) {
|
| num_delays_out_of_bounds -= self->delay_histogram[i];
|
| }
|
| self->fraction_poor_delays =
|
| - (float)num_delays_out_of_bounds / self->num_delay_values;
|
| + static_cast<float>(num_delays_out_of_bounds) / self->num_delay_values;
|
| }
|
|
|
| // Reset histogram.
|
| @@ -780,7 +790,7 @@ static void ScaledInverseFft(float freq_data[2][PART_LEN1],
|
| float scale,
|
| int conjugate) {
|
| int i;
|
| - const float normalization = scale / ((float)PART_LEN2);
|
| + const float normalization = scale / static_cast<float>(PART_LEN2);
|
| const float sign = (conjugate ? -1 : 1);
|
| time_data[0] = freq_data[0][0] * normalization;
|
| time_data[1] = freq_data[0][PART_LEN] * normalization;
|
| @@ -844,7 +854,8 @@ static int SignalBasedDelayCorrection(AecCore* self) {
|
| const int upper_bound = self->num_partitions * 3 / 4;
|
| const int do_correction = delay <= lower_bound || delay > upper_bound;
|
| if (do_correction == 1) {
|
| - int available_read = (int)WebRtc_available_read(self->far_time_buf);
|
| + int available_read =
|
| + static_cast<int>(WebRtc_available_read(self->far_time_buf));
|
| // With |shift_offset| we gradually rely on the delay estimates. For
|
| // positive delays we reduce the correction by |shift_offset| to lower the
|
| // risk of pushing the AEC into a non causal state. For negative delays
|
| @@ -1079,11 +1090,14 @@ static void EchoSuppression(AecCore* aec,
|
| }
|
|
|
| // Select an order statistic from the preferred bands.
|
| - // TODO: Using quicksort now, but a selection algorithm may be preferred.
|
| + // TODO(peah): Using quicksort now, but a selection algorithm may be
|
| + // preferred.
|
| memcpy(hNlPref, &hNl[minPrefBand], sizeof(float) * prefBandSize);
|
| qsort(hNlPref, prefBandSize, sizeof(float), CmpFloat);
|
| - hNlFb = hNlPref[(int)floor(prefBandQuant * (prefBandSize - 1))];
|
| - hNlFbLow = hNlPref[(int)floor(prefBandQuantLow * (prefBandSize - 1))];
|
| + hNlFb = hNlPref[static_cast<int>(floor(prefBandQuant *
|
| + (prefBandSize - 1)))];
|
| + hNlFbLow = hNlPref[static_cast<int>(floor(prefBandQuantLow *
|
| + (prefBandSize - 1)))];
|
| }
|
| }
|
|
|
| @@ -1106,7 +1120,7 @@ static void EchoSuppression(AecCore* aec,
|
| aec->hNlMinCtr = 0;
|
| aec->overDrive =
|
| WEBRTC_SPL_MAX(kTargetSupp[aec->nlp_mode] /
|
| - ((float)log(aec->hNlFbMin + 1e-10f) + 1e-10f),
|
| + static_cast<float>(log(aec->hNlFbMin + 1e-10f) + 1e-10f),
|
| min_overdrive[aec->nlp_mode]);
|
| }
|
|
|
| @@ -1225,16 +1239,19 @@ static void ProcessBlock(AecCore* aec) {
|
|
|
| // Concatenate old and new nearend blocks.
|
| for (i = 0; i < aec->num_bands - 1; ++i) {
|
| - WebRtc_ReadBuffer(aec->nearFrBufH[i], (void**)&nearend_ptr, nearend,
|
| - PART_LEN);
|
| + WebRtc_ReadBuffer(aec->nearFrBufH[i],
|
| + reinterpret_cast<void**>(&nearend_ptr),
|
| + nearend, PART_LEN);
|
| memcpy(aec->dBufH[i] + PART_LEN, nearend_ptr, sizeof(nearend));
|
| }
|
| - WebRtc_ReadBuffer(aec->nearFrBuf, (void**)&nearend_ptr, nearend, PART_LEN);
|
| + WebRtc_ReadBuffer(aec->nearFrBuf, reinterpret_cast<void**>(&nearend_ptr),
|
| + nearend, PART_LEN);
|
| memcpy(aec->dBuf + PART_LEN, nearend_ptr, sizeof(nearend));
|
|
|
| // We should always have at least one element stored in |far_buf|.
|
| assert(WebRtc_available_read(aec->far_time_buf) > 0);
|
| - WebRtc_ReadBuffer(aec->far_time_buf, (void**)&farend_ptr, farend, 1);
|
| + WebRtc_ReadBuffer(aec->far_time_buf, reinterpret_cast<void**>(&farend_ptr),
|
| + farend, 1);
|
|
|
| #ifdef WEBRTC_AEC_DEBUG_DUMP
|
| {
|
| @@ -1356,7 +1373,7 @@ static void ProcessBlock(AecCore* aec) {
|
|
|
| AecCore* WebRtcAec_CreateAec() {
|
| int i;
|
| - AecCore* aec = malloc(sizeof(AecCore));
|
| + AecCore* aec = reinterpret_cast<AecCore*>(malloc(sizeof(AecCore)));
|
| if (!aec) {
|
| return NULL;
|
| }
|
| @@ -1585,7 +1602,7 @@ int WebRtcAec_InitAec(AecCore* aec, int sampFreq) {
|
| if (aec->num_bands > 1) {
|
| aec->mult = 2;
|
| } else {
|
| - aec->mult = (short)aec->sampFreq / 8000;
|
| + aec->mult = static_cast<int16_t>(aec->sampFreq) / 8000;
|
| }
|
|
|
| aec->farBufWritePos = 0;
|
| @@ -1616,8 +1633,8 @@ int WebRtcAec_InitAec(AecCore* aec, int sampFreq) {
|
|
|
| // Holds the last block written to
|
| aec->xfBufBlockPos = 0;
|
| - // TODO: Investigate need for these initializations. Deleting them doesn't
|
| - // change the output at all and yields 0.4% overall speedup.
|
| + // TODO(peah): Investigate need for these initializations. Deleting them
|
| + // doesn't change the output at all and yields 0.4% overall speedup.
|
| memset(aec->xfBuf, 0, sizeof(complex_t) * kExtendedNumPartitions * PART_LEN1);
|
| memset(aec->wfBuf, 0, sizeof(complex_t) * kExtendedNumPartitions * PART_LEN1);
|
| memset(aec->sde, 0, sizeof(complex_t) * PART_LEN1);
|
| @@ -1782,7 +1799,7 @@ void WebRtcAec_ProcessFrames(AecCore* aec,
|
| // 6) Update output frame.
|
| // Stuff the out buffer if we have less than a frame to output.
|
| // This should only happen for the first frame.
|
| - out_elements = (int)WebRtc_available_read(aec->outFrBuf);
|
| + out_elements = static_cast<int>(WebRtc_available_read(aec->outFrBuf));
|
| if (out_elements < FRAME_LEN) {
|
| WebRtc_MoveReadPtr(aec->outFrBuf, out_elements - FRAME_LEN);
|
| for (i = 0; i < num_bands - 1; ++i) {
|
|
|