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 |