static void volume_process(MSFilter *f){ mblk_t *m; Volume *v=(Volume*)f->data; float target_gain; /* Important notice: any processes called herein can modify v->target_gain, at * end of this function apply_gain() is called, thus: later process calls can * override this target gain, and order must be well thought out */ if (v->agc_enabled || v->peer!=NULL){ mblk_t *om; int nbytes=v->nsamples*2; ms_bufferizer_put_from_queue(v->buffer,f->inputs[0]); while(ms_bufferizer_get_avail(v->buffer)>=nbytes){ om=allocb(nbytes,0); ms_bufferizer_read(v->buffer,om->b_wptr,nbytes); om->b_wptr+=nbytes; update_energy((int16_t*)om->b_rptr, v->nsamples, v); target_gain = v->static_gain; if (v->peer) /* this ptr set = echo limiter enable flag */ target_gain = volume_echo_avoider_process(v, om); /* Multiply with gain from echo limiter, not "choose smallest". Why? * Remote talks, local echo suppress via mic path, but still audible in * remote speaker. AGC operates fully, too (local speaker close to local mic!); * having agc gain reduction also contribute to total reduction makes sense. */ if (v->agc_enabled) target_gain/= volume_agc_process(v, om); if (v->noise_gate_enabled) volume_noise_gate_process(v, v->level_pk, om); apply_gain(v, om, target_gain); ms_queue_put(f->outputs[0],om); } }else{ /*light processing: no agc. Work in place in the input buffer*/ while((m=ms_queue_get(f->inputs[0]))!=NULL){ update_energy((int16_t*)m->b_rptr, (m->b_wptr - m->b_rptr) / 2, v); target_gain = v->static_gain; if (v->noise_gate_enabled) volume_noise_gate_process(v, v->level_pk, m); apply_gain(v, m, target_gain); ms_queue_put(f->outputs[0],m); } } }
static void vad_dtx_process(MSFilter *f){ VadDtxContext *ctx=(VadDtxContext*)f->data; mblk_t *m; while((m=ms_queue_get(f->inputs[0]))!=NULL){ update_energy(ctx,(int16_t*)m->b_rptr, (m->b_wptr - m->b_rptr) / 2, f->ticker->time); if (ortp_extremum_get_current(&ctx->max)<silence_threshold){ if (!ctx->silence_mode){ MSCngData cngdata={0}; cngdata.datasize=1; /*only noise level*/ cngdata.data[0]=0; /*noise level set to zero for the moment*/ ms_message("vad_dtx_process(): silence period detected."); ctx->silence_mode=1; ms_filter_notify(f, MS_VAD_DTX_NO_VOICE, &cngdata); } }else{ if (ctx->silence_mode){ ms_message("vad_dtx_process(): silence period finished."); ctx->silence_mode=0; ms_filter_notify(f, MS_VAD_DTX_VOICE, NULL); } } ms_queue_put(f->outputs[0],m); } }