// only buffer L band for farend int32_t WebRtcAec_BufferFarend(void* aecInst, const float* farend, size_t nrOfSamples) { Aec* aecpc = aecInst; size_t newNrOfSamples = nrOfSamples; float new_farend[MAX_RESAMP_LEN]; const float* farend_ptr = farend; // Get any error caused by buffering the farend signal. int32_t error_code = WebRtcAec_GetBufferFarendError(aecInst, farend, nrOfSamples); if (error_code != 0) return error_code; if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) { // Resample and get a new number of samples WebRtcAec_ResampleLinear(aecpc->resampler, farend, nrOfSamples, aecpc->skew, new_farend, &newNrOfSamples); farend_ptr = new_farend; } aecpc->farend_started = 1; WebRtcAec_SetSystemDelay( aecpc->aec, WebRtcAec_system_delay(aecpc->aec) + (int)newNrOfSamples); // Write the time-domain data to |far_pre_buf|. WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_ptr, newNrOfSamples); // Transform to frequency domain if we have enough data. while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) { // We have enough data to pass to the FFT, hence read PART_LEN2 samples. { float* ptmp = NULL; float tmp[PART_LEN2]; WebRtc_ReadBuffer(aecpc->far_pre_buf, (void**)&ptmp, tmp, PART_LEN2); WebRtcAec_BufferFarendPartition(aecpc->aec, ptmp); #ifdef WEBRTC_AEC_DEBUG_DUMP WebRtc_WriteBuffer( WebRtcAec_far_time_buf(aecpc->aec), &ptmp[PART_LEN], 1); #endif } // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing. WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN); } return 0; }
// only buffer L band for farend int32_t WebRtcAec_BufferFarend(void *aecInst, const int16_t *farend, int16_t nrOfSamples) { aecpc_t *aecpc = aecInst; int32_t retVal = 0; int newNrOfSamples = (int) nrOfSamples; short newFarend[MAX_RESAMP_LEN]; const int16_t* farend_ptr = farend; float tmp_farend[MAX_RESAMP_LEN]; const float* farend_float = tmp_farend; float skew; int i = 0; if (aecpc == NULL) { return -1; } if (farend == NULL) { aecpc->lastError = AEC_NULL_POINTER_ERROR; return -1; } if (aecpc->initFlag != initCheck) { aecpc->lastError = AEC_UNINITIALIZED_ERROR; return -1; } // number of samples == 160 for SWB input if (nrOfSamples != 80 && nrOfSamples != 160) { aecpc->lastError = AEC_BAD_PARAMETER_ERROR; return -1; } skew = aecpc->skew; if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) { // Resample and get a new number of samples WebRtcAec_ResampleLinear(aecpc->resampler, farend, nrOfSamples, skew, newFarend, &newNrOfSamples); farend_ptr = (const int16_t*) newFarend; } WebRtcAec_SetSystemDelay(aecpc->aec, WebRtcAec_system_delay(aecpc->aec) + newNrOfSamples); #ifdef WEBRTC_AEC_DEBUG_DUMP WebRtc_WriteBuffer(aecpc->far_pre_buf_s16, farend_ptr, (size_t) newNrOfSamples); #endif // Cast to float and write the time-domain data to |far_pre_buf|. for (i = 0; i < newNrOfSamples; i++) { tmp_farend[i] = (float) farend_ptr[i]; } WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_float, (size_t) newNrOfSamples); // Transform to frequency domain if we have enough data. while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) { // We have enough data to pass to the FFT, hence read PART_LEN2 samples. WebRtc_ReadBuffer(aecpc->far_pre_buf, (void**) &farend_float, tmp_farend, PART_LEN2); WebRtcAec_BufferFarendPartition(aecpc->aec, farend_float); // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing. WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN); #ifdef WEBRTC_AEC_DEBUG_DUMP WebRtc_ReadBuffer(aecpc->far_pre_buf_s16, (void**) &farend_ptr, newFarend, PART_LEN2); WebRtc_WriteBuffer(WebRtcAec_far_time_buf(aecpc->aec), &farend_ptr[PART_LEN], 1); WebRtc_MoveReadPtr(aecpc->far_pre_buf_s16, -PART_LEN); #endif } return retVal; }
// only buffer L band for farend int32_t WebRtcAec_BufferFarend(void* aecInst, const float* farend, int16_t nrOfSamples) { Aec* aecpc = aecInst; int newNrOfSamples = (int)nrOfSamples; float new_farend[MAX_RESAMP_LEN]; const float* farend_ptr = farend; if (farend == NULL) { aecpc->lastError = AEC_NULL_POINTER_ERROR; return -1; } if (aecpc->initFlag != initCheck) { aecpc->lastError = AEC_UNINITIALIZED_ERROR; return -1; } // number of samples == 160 for SWB input if (nrOfSamples != 80 && nrOfSamples != 160) { aecpc->lastError = AEC_BAD_PARAMETER_ERROR; return -1; } if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) { // Resample and get a new number of samples WebRtcAec_ResampleLinear(aecpc->resampler, farend, nrOfSamples, aecpc->skew, new_farend, &newNrOfSamples); farend_ptr = new_farend; } aecpc->farend_started = 1; WebRtcAec_SetSystemDelay(aecpc->aec, WebRtcAec_system_delay(aecpc->aec) + newNrOfSamples); // Write the time-domain data to |far_pre_buf|. WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_ptr, (size_t)newNrOfSamples); // Transform to frequency domain if we have enough data. while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) { // We have enough data to pass to the FFT, hence read PART_LEN2 samples. { float* ptmp = NULL; float tmp[PART_LEN2]; WebRtc_ReadBuffer(aecpc->far_pre_buf, (void**)&ptmp, tmp, PART_LEN2); WebRtcAec_BufferFarendPartition(aecpc->aec, ptmp); #ifdef WEBRTC_AEC_DEBUG_DUMP WebRtc_WriteBuffer( WebRtcAec_far_time_buf(aecpc->aec), &ptmp[PART_LEN], 1); #endif } // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing. WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN); } return 0; }