Webrtc 回聲消除 三(NS、VAD、AEC、AGC裝置端終結篇)
阿新 • • 發佈:2019-01-09
int echowebrtc_process(void *indata, int indata_len, short *outdata)
{
int frame_num = indata_len / FRAMESIZE;
if(0 < get_queue_data_count(queue_webrtc)) {
pthread_mutex_lock(&mutex);
queue_read(queue_webrtc,spk_c,BUFFSIZE);
memcpy(mic_c,indata,indata_len);
for(i = 0;i < BUFFSIZE/2;i++) {
mic_s[i] = (mic_c[i*2+1]<< 8) | (mic_c[i*2]&0xFF);
mic_f[i] = mic_s[i];
far_agc_s[i] = (spk_c[i*2+1]<< 8) | (spk_c[i*2]&0xFF);
spk_s[i] = (spk_c[i*2+1]<< 8) | (spk_c[i*2]&0xFF);
spk_f[i] = spk_s[i];
}
for(i = 0; i < frame_num; i ++) {
//AGC Farend
inMicLevel = micLevelOut;
outMicLevel = 0;
uint8_t saturationWarning;
WebRtcAgc_Process(handleAgc,far_agc_s+NN*i,NULL,NN,far_agc+NN*i,NULL,inMicLevel,&outMicLevel,0,&saturationWarning);
micLevelIn = outMicLevel;
fwrite(far_agc+NN*i,1,NN*2,fp_agc);
for(j = 0; j < NN; j++) {
spk_f[NN*i+j] = far_agc[NN*i+j];
}
//AEC Farend
fwrite(spk_s+NN*i,sizeof(short),NN,fp_fars);
EWebRtcAEC_BufferFarend(handleAEC,spk_f+NN*i,NN);
//fwrite(spk_f+NN*i,sizeof(float),NN,fp_far);
//AEC Process
//fwrite(mic_s+NN*i,sizeof(short),NN,fp_nears);
EWebRtcAEC_Process(handleAEC,mic_f+NN*i,1,out_f+NN*i,NN,aecDelay,0);
//fwrite(mic_f+NN*i,sizeof(float),NN,fp_near);
//Delay
//getAECDelayMetrics(spk_s+NN*i);
}
for(i = 0;i < BUFFSIZE/2;i++) {
//out_s[i] = out_f[i];
outdata[i] = out_f[i];
}
//fwrite(out_s,sizeof(short),BUFFSIZE/2,fp_out);
fwrite(outdata,sizeof(short),BUFFSIZE/2,fp_out);
pthread_mutex_unlock(&mutex);
return 0;
}
return -1;
}
{
int frame_num = indata_len / FRAMESIZE;
if(0 < get_queue_data_count(queue_webrtc)) {
pthread_mutex_lock(&mutex);
queue_read(queue_webrtc,spk_c,BUFFSIZE);
memcpy(mic_c,indata,indata_len);
for(i = 0;i < BUFFSIZE/2;i++) {
mic_s[i] = (mic_c[i*2+1]<< 8) | (mic_c[i*2]&0xFF);
mic_f[i] = mic_s[i];
far_agc_s[i] = (spk_c[i*2+1]<< 8) | (spk_c[i*2]&0xFF);
spk_s[i] = (spk_c[i*2+1]<< 8) | (spk_c[i*2]&0xFF);
spk_f[i] = spk_s[i];
}
for(i = 0; i < frame_num; i ++) {
//AGC Farend
inMicLevel = micLevelOut;
outMicLevel = 0;
uint8_t saturationWarning;
WebRtcAgc_Process(handleAgc,far_agc_s+NN*i,NULL,NN,far_agc+NN*i,NULL,inMicLevel,&outMicLevel,0,&saturationWarning);
micLevelIn = outMicLevel;
fwrite(far_agc+NN*i,1,NN*2,fp_agc);
for(j = 0; j < NN; j++) {
spk_f[NN*i+j] = far_agc[NN*i+j];
}
//AEC Farend
fwrite(spk_s+NN*i,sizeof(short),NN,fp_fars);
EWebRtcAEC_BufferFarend(handleAEC,spk_f+NN*i,NN);
//fwrite(spk_f+NN*i,sizeof(float),NN,fp_far);
//AEC Process
//fwrite(mic_s+NN*i,sizeof(short),NN,fp_nears);
EWebRtcAEC_Process(handleAEC,mic_f+NN*i,1,out_f+NN*i,NN,aecDelay,0);
//fwrite(mic_f+NN*i,sizeof(float),NN,fp_near);
//Delay
//getAECDelayMetrics(spk_s+NN*i);
}
for(i = 0;i < BUFFSIZE/2;i++) {
//out_s[i] = out_f[i];
outdata[i] = out_f[i];
}
//fwrite(out_s,sizeof(short),BUFFSIZE/2,fp_out);
fwrite(outdata,sizeof(short),BUFFSIZE/2,fp_out);
pthread_mutex_unlock(&mutex);
return 0;
}
return -1;
}