| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 size_t num_bands, | 117 size_t num_bands, |
| 118 float* const* out, | 118 float* const* out, |
| 119 size_t num_samples, | 119 size_t num_samples, |
| 120 int16_t reported_delay_ms, | 120 int16_t reported_delay_ms, |
| 121 int32_t skew); | 121 int32_t skew); |
| 122 | 122 |
| 123 void* WebRtcAec_Create() { | 123 void* WebRtcAec_Create() { |
| 124 Aec* aecpc = new Aec(); | 124 Aec* aecpc = new Aec(); |
| 125 | 125 |
| 126 if (!aecpc) { | 126 if (!aecpc) { |
| 127 return NULL; | 127 return nullptr; |
| 128 } | 128 } |
| 129 aecpc->data_dumper.reset(new ApmDataDumper(aecpc->instance_count)); | 129 aecpc->data_dumper.reset(new ApmDataDumper(aecpc->instance_count)); |
| 130 | 130 |
| 131 aecpc->aec = WebRtcAec_CreateAec(aecpc->instance_count); | 131 aecpc->aec = WebRtcAec_CreateAec(aecpc->instance_count); |
| 132 if (!aecpc->aec) { | 132 if (!aecpc->aec) { |
| 133 WebRtcAec_Free(aecpc); | 133 WebRtcAec_Free(aecpc); |
| 134 return NULL; | 134 return nullptr; |
| 135 } | 135 } |
| 136 aecpc->resampler = WebRtcAec_CreateResampler(); | 136 aecpc->resampler = WebRtcAec_CreateResampler(); |
| 137 if (!aecpc->resampler) { | 137 if (!aecpc->resampler) { |
| 138 WebRtcAec_Free(aecpc); | 138 WebRtcAec_Free(aecpc); |
| 139 return NULL; | 139 return nullptr; |
| 140 } | 140 } |
| 141 // Create far-end pre-buffer. The buffer size has to be large enough for | 141 // Create far-end pre-buffer. The buffer size has to be large enough for |
| 142 // largest possible drift compensation (kResamplerBufferSize) + "almost" an | 142 // largest possible drift compensation (kResamplerBufferSize) + "almost" an |
| 143 // FFT buffer (PART_LEN2 - 1). | 143 // FFT buffer (PART_LEN2 - 1). |
| 144 aecpc->far_pre_buf = | 144 aecpc->far_pre_buf = |
| 145 WebRtc_CreateBuffer(PART_LEN2 + kResamplerBufferSize, sizeof(float)); | 145 WebRtc_CreateBuffer(PART_LEN2 + kResamplerBufferSize, sizeof(float)); |
| 146 if (!aecpc->far_pre_buf) { | 146 if (!aecpc->far_pre_buf) { |
| 147 WebRtcAec_Free(aecpc); | 147 WebRtcAec_Free(aecpc); |
| 148 return NULL; | 148 return nullptr; |
| 149 } | 149 } |
| 150 | 150 |
| 151 aecpc->initFlag = 0; | 151 aecpc->initFlag = 0; |
| 152 | 152 |
| 153 aecpc->instance_count++; | 153 aecpc->instance_count++; |
| 154 return aecpc; | 154 return aecpc; |
| 155 } | 155 } |
| 156 | 156 |
| 157 void WebRtcAec_Free(void* aecInst) { | 157 void WebRtcAec_Free(void* aecInst) { |
| 158 Aec* aecpc = reinterpret_cast<Aec*>(aecInst); | 158 Aec* aecpc = reinterpret_cast<Aec*>(aecInst); |
| 159 | 159 |
| 160 if (aecpc == NULL) { | 160 if (aecpc == nullptr) { |
| 161 return; | 161 return; |
| 162 } | 162 } |
| 163 | 163 |
| 164 WebRtc_FreeBuffer(aecpc->far_pre_buf); | 164 WebRtc_FreeBuffer(aecpc->far_pre_buf); |
| 165 | 165 |
| 166 WebRtcAec_FreeAec(aecpc->aec); | 166 WebRtcAec_FreeAec(aecpc->aec); |
| 167 WebRtcAec_FreeResampler(aecpc->resampler); | 167 WebRtcAec_FreeResampler(aecpc->resampler); |
| 168 delete aecpc; | 168 delete aecpc; |
| 169 } | 169 } |
| 170 | 170 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 WebRtcAec_SetSystemDelay(aecpc->aec, WebRtcAec_system_delay(aecpc->aec) + | 293 WebRtcAec_SetSystemDelay(aecpc->aec, WebRtcAec_system_delay(aecpc->aec) + |
| 294 static_cast<int>(newNrOfSamples)); | 294 static_cast<int>(newNrOfSamples)); |
| 295 | 295 |
| 296 // Write the time-domain data to |far_pre_buf|. | 296 // Write the time-domain data to |far_pre_buf|. |
| 297 WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_ptr, newNrOfSamples); | 297 WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_ptr, newNrOfSamples); |
| 298 | 298 |
| 299 // TODO(minyue): reduce to |PART_LEN| samples for each buffering. | 299 // TODO(minyue): reduce to |PART_LEN| samples for each buffering. |
| 300 while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) { | 300 while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) { |
| 301 // We have enough data to pass to the FFT, hence read PART_LEN2 samples. | 301 // We have enough data to pass to the FFT, hence read PART_LEN2 samples. |
| 302 { | 302 { |
| 303 float* ptmp = NULL; | 303 float* ptmp = nullptr; |
| 304 float tmp[PART_LEN2]; | 304 float tmp[PART_LEN2]; |
| 305 WebRtc_ReadBuffer(aecpc->far_pre_buf, | 305 WebRtc_ReadBuffer(aecpc->far_pre_buf, |
| 306 reinterpret_cast<void**>(&ptmp), tmp, PART_LEN2); | 306 reinterpret_cast<void**>(&ptmp), tmp, PART_LEN2); |
| 307 WebRtcAec_BufferFarendBlock(aecpc->aec, &ptmp[PART_LEN]); | 307 WebRtcAec_BufferFarendBlock(aecpc->aec, &ptmp[PART_LEN]); |
| 308 } | 308 } |
| 309 | 309 |
| 310 // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing. | 310 // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing. |
| 311 WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN); | 311 WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN); |
| 312 } | 312 } |
| 313 | 313 |
| 314 return 0; | 314 return 0; |
| 315 } | 315 } |
| 316 | 316 |
| 317 int32_t WebRtcAec_Process(void* aecInst, | 317 int32_t WebRtcAec_Process(void* aecInst, |
| 318 const float* const* nearend, | 318 const float* const* nearend, |
| 319 size_t num_bands, | 319 size_t num_bands, |
| 320 float* const* out, | 320 float* const* out, |
| 321 size_t nrOfSamples, | 321 size_t nrOfSamples, |
| 322 int16_t msInSndCardBuf, | 322 int16_t msInSndCardBuf, |
| 323 int32_t skew) { | 323 int32_t skew) { |
| 324 Aec* aecpc = reinterpret_cast<Aec*>(aecInst); | 324 Aec* aecpc = reinterpret_cast<Aec*>(aecInst); |
| 325 int32_t retVal = 0; | 325 int32_t retVal = 0; |
| 326 | 326 |
| 327 if (out == NULL) { | 327 if (out == nullptr) { |
| 328 return AEC_NULL_POINTER_ERROR; | 328 return AEC_NULL_POINTER_ERROR; |
| 329 } | 329 } |
| 330 | 330 |
| 331 if (aecpc->initFlag != initCheck) { | 331 if (aecpc->initFlag != initCheck) { |
| 332 return AEC_UNINITIALIZED_ERROR; | 332 return AEC_UNINITIALIZED_ERROR; |
| 333 } | 333 } |
| 334 | 334 |
| 335 // number of samples == 160 for SWB input | 335 // number of samples == 160 for SWB input |
| 336 if (nrOfSamples != 80 && nrOfSamples != 160) { | 336 if (nrOfSamples != 80 && nrOfSamples != 160) { |
| 337 return AEC_BAD_PARAMETER_ERROR; | 337 return AEC_BAD_PARAMETER_ERROR; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 return AEC_BAD_PARAMETER_ERROR; | 386 return AEC_BAD_PARAMETER_ERROR; |
| 387 } | 387 } |
| 388 | 388 |
| 389 WebRtcAec_SetConfigCore(self->aec, config.nlpMode, config.metricsMode, | 389 WebRtcAec_SetConfigCore(self->aec, config.nlpMode, config.metricsMode, |
| 390 config.delay_logging); | 390 config.delay_logging); |
| 391 return 0; | 391 return 0; |
| 392 } | 392 } |
| 393 | 393 |
| 394 int WebRtcAec_get_echo_status(void* handle, int* status) { | 394 int WebRtcAec_get_echo_status(void* handle, int* status) { |
| 395 Aec* self = reinterpret_cast<Aec*>(handle); | 395 Aec* self = reinterpret_cast<Aec*>(handle); |
| 396 if (status == NULL) { | 396 if (status == nullptr) { |
| 397 return AEC_NULL_POINTER_ERROR; | 397 return AEC_NULL_POINTER_ERROR; |
| 398 } | 398 } |
| 399 if (self->initFlag != initCheck) { | 399 if (self->initFlag != initCheck) { |
| 400 return AEC_UNINITIALIZED_ERROR; | 400 return AEC_UNINITIALIZED_ERROR; |
| 401 } | 401 } |
| 402 | 402 |
| 403 *status = WebRtcAec_echo_state(self->aec); | 403 *status = WebRtcAec_echo_state(self->aec); |
| 404 | 404 |
| 405 return 0; | 405 return 0; |
| 406 } | 406 } |
| 407 | 407 |
| 408 int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics) { | 408 int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics) { |
| 409 const float kUpWeight = 0.7f; | 409 const float kUpWeight = 0.7f; |
| 410 float dtmp; | 410 float dtmp; |
| 411 int stmp; | 411 int stmp; |
| 412 Aec* self = reinterpret_cast<Aec*>(handle); | 412 Aec* self = reinterpret_cast<Aec*>(handle); |
| 413 Stats erl; | 413 Stats erl; |
| 414 Stats erle; | 414 Stats erle; |
| 415 Stats a_nlp; | 415 Stats a_nlp; |
| 416 | 416 |
| 417 if (handle == NULL) { | 417 if (handle == nullptr) { |
| 418 return -1; | 418 return -1; |
| 419 } | 419 } |
| 420 if (metrics == NULL) { | 420 if (metrics == nullptr) { |
| 421 return AEC_NULL_POINTER_ERROR; | 421 return AEC_NULL_POINTER_ERROR; |
| 422 } | 422 } |
| 423 if (self->initFlag != initCheck) { | 423 if (self->initFlag != initCheck) { |
| 424 return AEC_UNINITIALIZED_ERROR; | 424 return AEC_UNINITIALIZED_ERROR; |
| 425 } | 425 } |
| 426 | 426 |
| 427 WebRtcAec_GetEchoStats(self->aec, &erl, &erle, &a_nlp, | 427 WebRtcAec_GetEchoStats(self->aec, &erl, &erle, &a_nlp, |
| 428 &metrics->divergent_filter_fraction); | 428 &metrics->divergent_filter_fraction); |
| 429 | 429 |
| 430 // ERL | 430 // ERL |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 } | 499 } |
| 500 | 500 |
| 501 return 0; | 501 return 0; |
| 502 } | 502 } |
| 503 | 503 |
| 504 int WebRtcAec_GetDelayMetrics(void* handle, | 504 int WebRtcAec_GetDelayMetrics(void* handle, |
| 505 int* median, | 505 int* median, |
| 506 int* std, | 506 int* std, |
| 507 float* fraction_poor_delays) { | 507 float* fraction_poor_delays) { |
| 508 Aec* self = reinterpret_cast<Aec*>(handle); | 508 Aec* self = reinterpret_cast<Aec*>(handle); |
| 509 if (median == NULL) { | 509 if (median == nullptr) { |
| 510 return AEC_NULL_POINTER_ERROR; | 510 return AEC_NULL_POINTER_ERROR; |
| 511 } | 511 } |
| 512 if (std == NULL) { | 512 if (std == nullptr) { |
| 513 return AEC_NULL_POINTER_ERROR; | 513 return AEC_NULL_POINTER_ERROR; |
| 514 } | 514 } |
| 515 if (self->initFlag != initCheck) { | 515 if (self->initFlag != initCheck) { |
| 516 return AEC_UNINITIALIZED_ERROR; | 516 return AEC_UNINITIALIZED_ERROR; |
| 517 } | 517 } |
| 518 if (WebRtcAec_GetDelayMetricsCore(self->aec, median, std, | 518 if (WebRtcAec_GetDelayMetricsCore(self->aec, median, std, |
| 519 fraction_poor_delays) == -1) { | 519 fraction_poor_delays) == -1) { |
| 520 // Logging disabled. | 520 // Logging disabled. |
| 521 return AEC_UNSUPPORTED_FUNCTION_ERROR; | 521 return AEC_UNSUPPORTED_FUNCTION_ERROR; |
| 522 } | 522 } |
| 523 | 523 |
| 524 return 0; | 524 return 0; |
| 525 } | 525 } |
| 526 | 526 |
| 527 AecCore* WebRtcAec_aec_core(void* handle) { | 527 AecCore* WebRtcAec_aec_core(void* handle) { |
| 528 if (!handle) { | 528 if (!handle) { |
| 529 return NULL; | 529 return nullptr; |
| 530 } | 530 } |
| 531 return reinterpret_cast<Aec*>(handle)->aec; | 531 return reinterpret_cast<Aec*>(handle)->aec; |
| 532 } | 532 } |
| 533 | 533 |
| 534 static int ProcessNormal(Aec* aecpc, | 534 static int ProcessNormal(Aec* aecpc, |
| 535 const float* const* nearend, | 535 const float* const* nearend, |
| 536 size_t num_bands, | 536 size_t num_bands, |
| 537 float* const* out, | 537 float* const* out, |
| 538 size_t nrOfSamples, | 538 size_t nrOfSamples, |
| 539 int16_t msInSndCardBuf, | 539 int16_t msInSndCardBuf, |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 } else { | 854 } else { |
| 855 self->timeForDelayChange = 0; | 855 self->timeForDelayChange = 0; |
| 856 } | 856 } |
| 857 self->lastDelayDiff = delay_difference; | 857 self->lastDelayDiff = delay_difference; |
| 858 | 858 |
| 859 if (self->timeForDelayChange > 25) { | 859 if (self->timeForDelayChange > 25) { |
| 860 self->knownDelay = WEBRTC_SPL_MAX((int)self->filtDelay - 256, 0); | 860 self->knownDelay = WEBRTC_SPL_MAX((int)self->filtDelay - 256, 0); |
| 861 } | 861 } |
| 862 } | 862 } |
| 863 } // namespace webrtc | 863 } // namespace webrtc |
| OLD | NEW |