1. 程式人生 > >Webrtc 回聲消除 三(NS、VAD、AEC、AGC裝置端終結篇)

Webrtc 回聲消除 三(NS、VAD、AEC、AGC裝置端終結篇)

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;
}