/* * ctrl.c * Description: ¸÷¸öË㷨ģ¿éµÄ²ÎÊý¿ØÖÆ´úÂë * * Created on: 2014-10-28 * Author: Graydon * Modify: */ #include #include #include "drv/global.h" #include "ctrl.h" #include "drv/fft.h" int empty_ctrl(void* handle,int cmd,int *val,int num) { return 0; } int input_ctrl(pinput_handle handle,int cmd,int *val,int num) { int setting =0; int channel = val[0]&(MAX_INPUT_NUM-1); ptag_input pInput = handle->param_ptr; extern void* netvoice_handle[4]; switch(cmd){ case INPUT_GAIN: if(val[1]>=pInput->input[channel].mingain && val[1]<=pInput->input[channel].maxgain){ handle->input[channel].gain = val[1]/100.0f; pInput->input[channel].gain = val[1]; } break; case INPUT_LEVEL: pInput->input[channel].level = val[1]; setting =1; break; case INPUT_MUTE: handle->input[channel].mute = val[1]&0x1; handle->input[channel].time = FADE_OUT_TIME; if(val[1]&0x1){ handle->input[channel].step_gain = (FADE_OUT_GAIN - handle->input[channel].old_gain)/FADE_OUT_TIME; } else{ handle->input[channel].step_gain = (handle->input[channel].gain - handle->input[channel].old_gain)/FADE_OUT_TIME; } pInput->input[channel].mute = val[1]&0x1;; break; case INPUT_PHANT: if(val[1]&0x1){ handle->input[channel].delay = RATE_SAMPLES*5; } break; case INPUT_SENS: handle->input[channel].delay = RATE_SAMPLES; break; case INPUT_TYPE:{ pInput->input[channel].type = val[1]; handle->input[channel].type = val[1]; setting =1; } break; case INPUT_FREQ: pInput->input[channel].freq = val[1]; setting =1; break; case INPUT_STEP: pInput->input[channel].gain += val[1]; if(pInput->input[channel].gain>pInput->input[channel].maxgain){ pInput->input[channel].gain = pInput->input[channel].maxgain; } if(pInput->input[channel].gain< pInput->input[channel].mingain){ pInput->input[channel].gain = pInput->input[channel].mingain; } handle->input[channel].gain = pInput->input[channel].gain/100.0f; break; case INPUT_POL: pInput->input[channel].phase = val[1]&0x1; handle->input[channel].phase = val[1]&0x1; break; case INPUT_MIN: if(val[1]>1200 || val[1]<-8000){ return -1; } pInput->input[channel].mingain = val[1]; if(pInput->input[channel].gain < pInput->input[channel].mingain){ pInput->input[channel].gain = pInput->input[channel].mingain; handle->input[channel].gain = pInput->input[channel].gain*0.01; } break; case INPUT_MAX: if(val[1]>1200 || val[1]<-8000){ return -1; } pInput->input[channel].maxgain = val[1]; if(pInput->input[channel].gain > pInput->input[channel].maxgain){ pInput->input[channel].gain = pInput->input[channel].maxgain; handle->input[channel].gain = pInput->input[channel].gain*0.01; } break; default: break; } if(setting){ alg_sg_set_param(handle->input[channel].hgen,pInput->input[channel].freq,pInput->input[channel].type,pInput->input[channel].level/100.f); } return 0; } int gain_ctrl(pgain_handle handle,int cmd,int *val,int num) { ptag_gain pgain = handle->param_ptr; switch(cmd){ case GAIN_SET: if(val[0]>=-7200 && val[0]<=1200){ handle->gain = val[0]*(1.0f/100); pgain->gain = val[0]; } break; default:break; } return 0; } int meter_ctrl(pmeter_handle handle,int cmd,int *val,int num) { return 0; } int delay_ctrl(pdelay_handle handle,int cmd,int *val,int num) { ptag_delay pdealy = (ptag_delay)handle->param_ptr; switch(cmd){ case DELAY_BYPASS: handle->bypass = val[0]&0x1; pdealy->bypass = handle->bypass; alg_delay_set_msec(handle->halg,pdealy->ms+pdealy->us*0.001); break; case DELAY_MSEC: if(val[0]<0 || val[0]>2000){ return -1; } pdealy->ms = val[0]; alg_delay_set_msec(handle->halg,pdealy->ms+pdealy->us*0.001); break; case DELAY_USEC: if(val[0]<0 || val[0]>1000){ return -1; } pdealy->us = val[0]; alg_delay_set_msec(handle->halg,pdealy->ms+pdealy->us*0.001); break; default: break; } return 0; } int eq_ctrl(peq_handle handle,int cmd,int *val,int num) { ptag_eq peq = (ptag_eq)handle->param_ptr; int setting =0; val[0]&=0x1f; switch(cmd){ case EQ_BYPASS_ALL: handle->bypass = val[0]&0x1; peq->bypass = handle->bypass; break; case EQ_BYPASS: peq->eq_attr[val[0]].bypass = val[1]&0x1; setting=1; break; case EQ_FREQ: if(val[1]<0 || val[1]>32000){ return -1; } peq->eq_attr[val[0]].freq = val[1]; setting=1; break; case EQ_GAIN: if(val[1]<-4800 || val[1]>2400){ return -1; } peq->eq_attr[val[0]].gain = val[1]; setting=1; break; case EQ_QVALUE: if(val[1]<0 || val[1]>5000){ return -1; } peq->eq_attr[val[0]].q = val[1]; setting=1; break; case EQ_TYPE: if(val[1]>eq_highshelf || val[1]< eq_lpf){ return -1; } peq->eq_attr[val[0]].type = val[1]; setting=1; break; default: break; } if(setting){ alg_eq_set_param(handle->halg,val[0], (eq_type_t)peq->eq_attr[val[0]].type, peq->eq_attr[val[0]].bypass ,peq->eq_attr[val[0]].freq,peq->eq_attr[val[0]].gain/100.0f,peq->eq_attr[val[0]].q/100.0f); } return 0; } int expander_ctrl(pexpander_handle handle,int cmd,int *val,int num) { ptag_expander pexpander = (ptag_expander)handle->param_ptr; int setting = 0; switch(cmd){ case EXPANDER_BYPASS: handle->bypass = val[0]&0x1; pexpander->bypass = handle->bypass; break; case EXPANDER_THRESHOLD: if(val[0]<-7200 || val[0]>0){ return -1; } pexpander->threshold = val[0]; setting=1; break; case EXPANDER_RADIO: if(val[0]<100 || val[0]>10000){ return -1; } pexpander->ratio= val[0]; setting=1; break; case EXPANDER_RELEASE: if(val[0]<1 || val[0]>10000){ return -1; } pexpander->release= val[0]; setting=1; break; case EXPANDER_ATTACK: if(val[0]<1 || val[0]>10000){ return -1; } pexpander->attack= val[0]; setting=1; break; default: break; } if(setting){ alg_expander_set_param(handle->halg,pexpander->threshold/100.0f ,pexpander->ratio/100.0f,pexpander->attack,pexpander->release); } return 0; } int compressor_ctrl(pcompressor_handle handle,int cmd,int *val,int num) { ptag_compress pcompressor = (ptag_compress)handle->param_ptr; int setting = 0; switch(cmd){ case COMPRESS_BYPASS: handle->bypass = val[0]&0x1; pcompressor->bypass = handle->bypass; break; case COMPRESS_THERSHOLD: if(val[0]<-4800 || val[0]>0){ return -1; } pcompressor->threshold = val[0]; setting=1; break; case COMPRESS_RADIO: if(val[0]<1 || val[0]>10000){ return -1; } pcompressor->ratio= val[0]; setting=1; break; case COMPRESS_RELEASE: if(val[0]<1 || val[0]>10000){ return -1; } pcompressor->release= val[0]; setting=1; break; case COMPRESS_ATTACK: if(val[0]<1 || val[0]>10000){ return -1; } pcompressor->attack= val[0]; setting=1; break; case COMPRESS_GAIN: if(val[0]<-7200 || val[0]>1200){ return -1; } pcompressor->gain= val[0]; setting=1; break; default: break; } if(setting){ alg_compress_set_param(handle->halg,pcompressor->threshold/100.0f ,pcompressor->ratio/100.0f, pcompressor->attack ,pcompressor->release,pcompressor->gain/100.0f ,0); } return 0; } int mixer_ctrl(pmixer_handle handle,int cmd,int *val,int num) { int ni,no; ptag_mixer pmixer = (ptag_mixer)handle->param_ptr; ni = val[0]&0xff; no = (val[0]>>8)&0xff; if(no>=MAX_MIXER_OUTPUT){ return -1; } if(ni>=MAX_MIXER_INPUT){ return -1; } switch(cmd){ case MIXER_SWITCH: if(val[1]&0x1){ handle->mask[no][ni/16]|= 1<<(ni&15); // handle->gain[no][ni/16] = pmixer->input_gain[no][ni]/100.0f; handle->gain[no][ni] = pmixer->input_gain[no][ni]/100.0f;///////////////////////////////////////////////// // handle->step[no*handle->input_num+ni] = (handle->input[channel].gain - handle->input[channel].old_gain)/FADE_OUT_TIME; } else{ handle->mask[no][ni/16]&= ~(1<<(ni&15)); } break; case MIXER_GAIN: if(val[1]<-7200 || val[1]>1200){ return -1; } //handle->gain[no*handle->input_num+ni] = GF(val[1]/100.0f); pmixer->input_gain[no][ni] = val[1]; if((handle->mask[no][ni/16] >> (ni&15))&0x1) { handle->gain[no][ni] = (val[1]/100.0f); } break; case MIXER_DELAY: if(val[1]<0 || val[1]>100){ return -1; } // handle->delay[no*handle->input_num+ni] = val[1]; //alg_delay_set_msec(handle->delay_ptr[no*handle->input_num+ni] , val[1]); break; default: break; } return 0; } int shelf_ctrl(pshelf_handle handle,int cmd,int *val,int num) { ptag_shelf pshelf = (ptag_shelf)handle->param_ptr; bool high_setting =0 ,low_setting=0; switch(cmd){ case HIGH_SHELF_BYPASS: pshelf->highshelf.bypass = val[0]&0x1; high_setting =1; break; case HIGH_SHELF_FREQ: if(val[0]<20 || val[0]>20000){ return -1; } pshelf->highshelf.freq = val[0]; high_setting =1; break; case HIGH_SHELF_QVALUE: if(val[0]>5000 || val[0]<2){ return -1; } pshelf->highshelf.q = val[0]; high_setting =1; break; case HIGH_SHELF_GAIN: if(val[0]>1500 || val[0]<-4500){ return -1; } pshelf->highshelf.gain = val[0]; high_setting=1; break; case LOW_SHELF_BYPASS: pshelf->lowshelf.bypass = val[0]&0x1; low_setting=1; break; case LOW_SHELF_FREQ: if(val[0]<20 || val[0]>20000){ return -1; } pshelf->lowshelf.freq = val[0]; low_setting =1; break; case LOW_SHELF_QVALUE: if(val[0]>5000 || val[0]<2){ return -1; } pshelf->lowshelf.q = val[0]; low_setting =1; break; case LOW_SHELF_GAIN: if(val[0]>1500 || val[0]<-4500){ return -1; } pshelf->lowshelf.gain = val[0]; low_setting=1; break; default: break; } if(pshelf->lowshelf.bypass && pshelf->highshelf.bypass){ handle->bypass =1 ; } else{ handle->bypass =0 ; } if(high_setting){ alg_eq_set_param(handle->halg,0,eq_highshelf, pshelf->highshelf.bypass,pshelf->highshelf.freq,pshelf->highshelf.gain/100.0f ,pshelf->highshelf.q/100.0f); } if(low_setting){ alg_eq_set_param(handle->halg,1,eq_lowshelf, pshelf->lowshelf.bypass,pshelf->lowshelf.freq,pshelf->lowshelf.gain/100.0f ,pshelf->lowshelf.q/100.0f); } return 0; } int crossover_ctrl(pcrossover_handle handle,int cmd,int *val,int num) { ptag_crossover pCross = (ptag_crossover)handle->param_ptr; bool high_setting=0,low_setting=0; switch(cmd){ case XOVER_HIGHPASS_BYPASS: pCross->highpass.bypass = val[0]&0x1; handle->highbypass = pCross->highpass.bypass; high_setting =1; break; case XOVER_HIGHPASS_TYPE: pCross->highpass.type = val[0]; high_setting =1; break; case XOVER_HIGHPASS_FREQ: if(val[0]<20 || val[0]>20000){ return -1; } pCross->highpass.freq = val[0]; high_setting =1; break; case XOVER_HIGHPASS_ORDER: if(val[0]>48){ return -1; } pCross->highpass.taps = val[0]; high_setting =1; break; case XOVER_HIGHPASS_GAIN: if(val[0]>1500 || val[0]<-1500){ return -1; } pCross->highpass.gain = val[0]; high_setting =1; break; case XOVER_LOWPASS_BYPASS: pCross->lowpass.bypass = val[0]&0x1; handle->lowbypass=pCross->lowpass.bypass; low_setting=1; break; case XOVER_LOWPASS_TYPE: pCross->lowpass.type = val[0]; low_setting=1; break; case XOVER_LOWPASS_FREQ: if(val[0]<20 || val[0]>20000){ return -1; } pCross->lowpass.freq = val[0]; low_setting=1; break; case XOVER_LOWPASS_ORDER: if(val[0]>48){ return -1; } pCross->lowpass.taps = val[0]; low_setting=1; break; case XOVER_LOWPASS_GAIN: if(val[0]>1500 || val[0]<-1500){ return -1; } pCross->lowpass.gain = val[0]; low_setting =1; break; default: break; } if(low_setting){ alg_filter_set_param(handle->hLowalg,pCross->lowpass.freq,pCross->lowpass.taps,(eFilterType)pCross->lowpass.type,pCross->lowpass.gain/100.0f); } if(high_setting){ alg_filter_set_param(handle->hHighalg,pCross->highpass.freq,pCross->highpass.taps,(eFilterType)pCross->highpass.type,pCross->highpass.gain/100.0f); } return 0; } int output_ctrl(poutput_handle handle,int cmd,int *val,int num) { int channel = val[0]&(MAX_OUTPUT_NUM-1); ptag_output poutput = handle->param_ptr; switch(cmd){ case OUTPUT_GAIN: if(val[1]>=poutput->output[channel].mingain && val[1]<=poutput->output[channel].maxgain){ handle->output[channel].gain = val[1]/100.0f; poutput->output[channel].gain = val[1]; } break; case OUTPUT_MUTE: handle->output[channel].mute = val[1]&0x1; handle->output[channel].time = FADE_OUT_TIME; if(val[1]&0x1){ handle->output[channel].step_gain = (FADE_OUT_GAIN - handle->output[channel].old_gain)/FADE_OUT_TIME; } else{ handle->output[channel].step_gain = (handle->output[channel].gain - handle->output[channel].old_gain)/FADE_OUT_TIME; } poutput->output[channel].mute = handle->output[channel].mute; break; case OUTPUT_STEP:{ poutput->output[channel].gain += val[1]; if(poutput->output[channel].gain>poutput->output[channel].maxgain){ poutput->output[channel].gain = poutput->output[channel].maxgain; } if(poutput->output[channel].gainoutput[channel].mingain){ poutput->output[channel].gain = poutput->output[channel].mingain; } handle->output[channel].gain = poutput->output[channel].gain/100.0f; } case OUTPUT_POL: poutput->output[channel].phase = val[1]&0x1; handle->output[channel].phase = val[1]&0x1; break; case OUTPUT_MIN: if(val[1]>1200 || val[1]<-8000){ return -1; } poutput->output[channel].mingain = val[1]; if(poutput->output[channel].gain < poutput->output[channel].mingain){ poutput->output[channel].gain = poutput->output[channel].mingain; handle->output[channel].gain = poutput->output[channel].gain*0.01; } break; case OUTPUT_MAX: if(val[1]>1200 || val[1]<-8000){ return -1; } poutput->output[channel].maxgain = val[1]; if(poutput->output[channel].gain > poutput->output[channel].maxgain){ poutput->output[channel].gain = poutput->output[channel].maxgain; handle->output[channel].gain = poutput->output[channel].gain*0.01; } break; default: break; } return 0; } int feedback_ctrl(pfeedback_handle handle,int cmd,int *val, int num) { int setting =0, setting1 =0; ptag_feedback p = handle->param_ptr; switch(cmd){ case FB_BYPASS: handle->bypass = val[0]&0x1; p->bypass = handle->bypass; break; case FB_PANIC: if(val[0]<-3600 || val[0]>0){ return -1; } p->panic_threshold = val[0]; alg_nhs_set_panic(handle->halg, val[0]*0.01); break; case FB_FLT_DEPTH: if(val[0]<100 || val[0]>2400){ return -1; } p->flt_depth = val[0]; setting =1; break; case FB_STEP: if(val[0]<50 || val[0]>300){ return -1; } p->step = val[0]; setting =1; break; case FB_CLEAR: alg_nhs_filters_clear(handle->halg); break; case FB_FLT_FREQ: p->flt_group[val[0]].fc = val[1]; setting1 =1; break; case FB_FLT_GAIN: p->flt_group[val[0]].gain = val[1]; setting1 =1; break; case FB_FLT_TYPE: p->flt_group[val[0]].type = val[1]; setting1 =1; break; case FB_THRS: p->fb_threshold = val[0]; alg_nhs_set_threshold(handle->halg, val[0]*0.01); break; case FB_FLT_Q: p->bw = val[0]; setting = 1; break; default: break; } if(setting){ alg_nhs_set_parameters(handle->halg, p->step*0.01 , p->flt_depth*0.01, p->bw*0.01 ); } if(setting1 ){ alg_nhs_filters_set_unit(handle->halg , val[0], p->flt_group[val[0]].type , p->flt_group[val[0]].fc, p->flt_group[val[0]].gain*0.01); } return 0; } int gainsharing_automixer_ctrl(pgainsharing_mixer_handle handle,int cmd,int *val, int num) { int setting=0 ;// ptag_gainsharing_mixer p = handle->param_ptr; switch(cmd){ case AM_BYPASS: handle->bypass = val[0]&0x1; break; case AM_MUTE: alg_automixer_set_mute(handle->halg,val[0]&0x1); break; case AM_GAIN: if(val[0]<-7200 || val[0]>1200){ return -1; } alg_automixer_set_gain(handle->halg,val[0]/100.f); break; case AM_SLOPE: if(val[0]<100 || val[0]>600){ return -1; } alg_automixer_set_slope(handle->halg,val[0]/100.f); break; case AM_RESPONSE: if(val[0]<5 || val[0]>5000){ return -1; } alg_automixer_set_response(handle->halg,val[0]); break; case AM_CHANNEL_AUTO: p->channels[val[0]].automatic = val[1]&0x1; setting =1; break; case AM_CHANNEL_MUTE: p->channels[val[0]].mute = val[1]&0x1; setting =1; break; case AM_CHANNEL_GAIN: if(val[1]<-7200 || val[1]>1200){ return -1; } p->channels[val[0]].gain = val[1]; setting =1; break; case AM_CHANNEL_PRIORITY: if(val[1]<0 || val[1]>10){ return -1; } p->channels[val[0]].priority = val[1]; setting =1; break; default: break; } if(setting){ alg_automixer_set_param(handle->halg, val[0], p->channels[val[0]].automatic, p->channels[val[0]].mute , p->channels[val[0]].priority , p->channels[val[0]].gain/100.f); } return 0; } int fir_ctrl(pcommon_handle handle,int cmd,int *val, int num) { switch(cmd){ case FIR_BYPASS: handle->bypass = val[0]&0x1; break; case FIR_COEFFS: //alg_fir_set_coeffs(handle->halg, val, num); break; default: break; } return 0; } int agc_ctrl(pagc_handle handle, int cmd,int *val,int num) { int setting=0 ; ptag_agc pagc = handle->param_ptr; switch(cmd){ case AGC_BYPASS: handle->bypass = val[0]&0x1; pagc->bypass = handle->bypass; break; case AGC_THRESHOLD: if(val[0]<-9600 || val[0]>-2000){ return -1; } pagc->threshold = val[0]; setting = 1; break; case AGC_TARGET_THRES: if(val[0]<-4000 || val[0]>0){ return -1; } pagc->tar_threshold = val[0]; setting = 1; break; case AGC_RATIO: if(val[0]<100 || val[0]>2000){ return -1; } pagc->ratio= val[0]; setting = 1; break; case AGC_ATTACKTIME: if(val[0] >10000 || val[0]<1){ return -1; } pagc->attacktime = val[0]; setting = 1; break; case AGC_RELEASETIME: if(val[0] >10000 || val[0]<1){ return -1; } pagc->releasetime = val[0]; setting = 1; break; default: break; } if(setting ){ alg_agc_set_param(handle->halg ,pagc->threshold/100.0f , pagc->tar_threshold/100.0f, pagc->ratio/100.0f ,pagc->attacktime , pagc->releasetime); } return 0; } int aec_ctrl(paec_handle p,int cmd,int *val, int num) { int i; extern void* haec; switch(cmd){ case AEC_BYPASS: p->bypass = val[0]&0x1; alg_aec_clr_ulitily(p->halg); ////////////////////////////////////////////// if(p->bypass) { haec = 0; } else{ haec = p->halg; } ///////////////////////////////////////////// break; case AEC_MODE:{ aec_mode_t mode = (aec_mode_t)(val[0]&0x3); alg_aec_set_param(p->halg, mode); } break; } return 0; } int ans_ctrl(pans_handle p,int cmd,int *val, int num) { extern void* hans; switch(cmd){ case ANS_BYPASS: p->bypass = val[0]&0x1; //alg_ans_clr_ulitily(p->halg); ///////////////////////////////////////////// if(p->bypass) { hans = 0; } else{ hans = p->halg; } ///////////////////////////////////////////// break; case ANS_MODE:{ ans_mode mode = (ans_mode)(val[0]&0x3); alg_ans_set_policy(p->halg, mode); } break; } return 0; } int afc_ctrl(pafc_handle p,int cmd,int *val, int num) { switch(cmd){ case AFC_BYPASS: p->bypass = val[0]&0x1; // alg_afc_set_calibration(p->halg , !(val[0]&0x1)); break; case AFC_MODE:{ } case AFC_GAIN: if(val[0]>1200 || val[0]<-7200){ return -1; } //p->gain = val[0]*0.01; break; } return 0; } int sysctl_ctrl(psysctl_handle p, int cmd ,int *val ,int num) { int i; switch(cmd){ case SYSCTL_GAIN: if(val[0]>=-8000 && val[0]<=1200){ p->gain = val[0]*(1.0f/100); } break; case SYSCTL_MUTE: if(val[0]&0x1){ for(i=0;i< p->input_num ;i++){ p->step_gain[i] = (FADE_OUT_GAIN - p->old_gain[i])/FADE_OUT_TIME; } } else{ for(i=0;i< p->input_num ;i++){ p->step_gain[i] = (p->gain - p->old_gain[i])/FADE_OUT_TIME; } } p->mute = val[0]&0x1; p->time = FADE_OUT_TIME*p->input_num; break; default:break; } return 0; } int selector_ctrl(pselector_handle handle, int cmd ,int *val ,int num) { int ni,no; ni = val[0]&0xff; no = (val[0]>>8)&0xff; if(no>=MAX_MIXER_OUTPUT){ return -1; } if(ni>=MAX_MIXER_INPUT){ return -1; } switch(cmd){ case MIXER_SWITCH: if(val[1]&0x1){ handle->mask[no][ni/16]|= 1<<(ni&15); } else{ handle->mask[no][ni/16]&= ~(1<<(ni&15)); } break; default: break; } return 0; } int gating_automixer_ctrl(pgating_mixer_handle handle,int cmd,int *val, int num) { int master_setting =0; int setting = 0; ptag_gating_mixer p = handle->param_ptr; int def_mic = 0; switch(cmd){ case AM_GATE_BYPASS: handle->bypass = val[0]&0x1; break; case AM_GATE_MUTE: alg_gating_automixer_set_mute(handle->halg ,val[0]&0x1); break; case AM_GATE_GAIN: if(val[0]<-7200 || val[0]>1200){ return -1; } alg_gating_automixer_set_gain(handle->halg ,val[0]*0.01); break; case AM_GATE_LAST_ON: alg_gating_automixer_set_last_on(handle->halg ,val[0]&0x1); break; case AM_GATE_NOISE_THR: if(val[0]<-9600 || val[0]>-2400){ return -1; } p->noise_thr = val[0]; master_setting = 1; break; case AM_GATE_HOLD_TIME: if(val[0]<100 || val[0]>5000){ return -1; } p->holdtime = val[0]; master_setting = 1; break; case AM_GATE_OFF_GAIN: if(val[0]<-9000 || val[0]>-1000){ return -1; } p->offgain = val[0]; master_setting = 1; break; case AM_GATE_SENSITIVITY: if(val[0]<300 || val[0]>3000){ return -1; } p->sensitivity = val[0]; master_setting = 1; break; case AM_GATE_NOM_ATTEN: if(val[0]<0 || val[0]>600){ return -1; } p->nom_atten = val[0]; master_setting = 1; break; case AM_GATE_NOM_NUM: if(val[0]<0 || val[0]>=AUTOMIXER_CHANNEL_NUM){ return -1; } p->nom_num = val[0]; master_setting = 1; break; case AM_GATE_CHANNEL_AUTO: p->channels[val[0]].automatic = val[1]&0x1; setting = 1; break; case AM_GATE_CHANNEL_MUTE: p->channels[val[0]].mute = val[1]&0x1; setting = 1; break; case AM_GATE_CHANNEL_GAIN: if(val[1]<-8000 || val[1]>1200){ return -1; } p->channels[val[0]].gain = val[1]; setting = 1; break; case AM_GATE_CHANNEL_PRIORITY: if(val[1]<0 || val[1]>10){ return -1; } p->channels[val[0]].priority = val[1]; setting = 1; break; case AM_GATE_CHANNEL_DEF: p->channels[val[0]].def = val[1]&0x1; setting = 1; break; default: break; } if(master_setting){ alg_gating_automixer_set_master_param(handle->halg ,p->holdtime, p->offgain*0.01,p->noise_thr*0.01, p->sensitivity*0.01, p->nom_atten*0.01, p->nom_num); } if(setting){ alg_gating_automixer_set_param(handle->halg, val[0] ,p->channels[val[0]].automatic,p->channels[val[0]].mute ,p->channels[val[0]].priority, p->channels[val[0]].gain*0.01, p->channels[val[0]].def); } return 0; } int spl_ctrl(pspl_handle handle,int cmd,int *val, int num) { int setting =0; ptag_spl p = handle->param_ptr; switch(cmd){ case SPL_BYPASS: handle->bypass = val[0]&0x1; break; case SPL_MAX_GAIN: if(val[0]>2000 || val[0]<0){ return -1; } p->maxgain = val[0]; setting = 1; break; case SPL_MIN_GAIN: if(val[0]>0 || val[0]<-3000){ return -1; } p->mingain = val[0]; setting = 1; break; case SPL_SENSE_RATIO: if(val[0]<50 || val[0]>150){ return -1; } p->sense_ratio = val[0]; setting = 1; break; case SPL_SPEED: if(val[0]<500 || val[0]>60000){ return -1; } p->speed = val[0]; setting = 1; break; case SPL_TRIM: if(val[0]<-1000 || val[0]>1000){ return -1; } p->trim = val[0]; setting = 1; break; case SPL_THR: if(val[0]<-7200 || val[0]>-2400){ return -1; } p->noise_thr = val[0]; setting =1; break; case SPL_DISTANCE: if(val[0]<0 || val[0]>1500){ return -1; } p->distance = val[0]; alg_spl_continuous_set_distance(handle->halg , p->distance * 0.01); break; case SPL_MIX: val[0] &= MAX_INPUT_NUM -1; if(val[1]&0x1){ handle->mask[val[0]/16] |= (1<<(val[0]&15)); } else{ handle->mask[val[0]/16] &= ~(1<<(val[0]&15)); } setting =1; break; default: break; } if(setting){ alg_spl_continuous_set_parameters(handle->halg ,p->noise_thr*0.01, p->maxgain*0.01 ,p->mingain*0.01 , p->sense_ratio*0.01, p->speed, p->trim*0.01); } return 0; } int gate_ctrl(pgate_handle handle,int cmd,int *val, int num) { int setting =0; ptag_gate p = handle->param_ptr; switch(cmd){ case GATE_BYPASS: handle->bypass = val[0]&0x1; break; case GATE_THRESHOLD: if(val[0]<-4800 || val[0]>0){ return -1; } p->threshold = val[0]; setting =1; break; case GATE_DEPTH: if(val[0]<-7200 || val[0]>0){ return -1; } p->depth = val[0]; setting =1; break; case GATE_HOLDTIME: if(val[0]<5 || val[0]>10000){ return -1; } p->holdtime = val[0]; setting =1; break; case GATE_ATTACK: if(val[0]<1 || val[0]>1000){ return -1; } p->attacktime = val[0]; setting =1; break; case GATE_RELEASE: if(val[0]<5 || val[0]>10000){ return -1; } p->releasetime = val[0]; setting =1; break; default: break; } if(setting){ alg_gate_set_param(handle->halg ,p->threshold*0.01 ,p->holdtime, p->depth*0.01, p->releasetime, p->attacktime ); } return 0; } #if 1 int ducker_ctrl(pducker_handle handle,int cmd,int *val, int num) { int setting =0; ptag_ducker p = handle->param_ptr; switch(cmd){ case DUCKER_BYPASS: handle->bypass = val[0]&0x1; break; case DUCKER_THRESHOLD: if(val[0]<-6000 || val[0]>0){ return -1; } p->threshold = val[0]; alg_ducker_set_threshold(handle->halg, p->threshold*0.01); // setting =1; break; case DUCKER_DEPTH: if(val[0]<-7200 || val[0]>0){ return -1; } p->depth = val[0]; alg_ducker_set_depth(handle->halg, p->depth*0.01); // setting =1; break; case DUCKER_ATTACK: if(val[0]<10 || val[0]>500){ return -1; } p->attacktime = val[0]; alg_ducker_set_attack_time(handle->halg, p->attacktime); // setting =1; break; case DUCKER_HOLD: if(val[0]<10 || val[0]>10000){ return -1; } p->holdtime = val[0]; alg_ducker_set_hold_time(handle->halg, p->holdtime); // setting =1; break; case DUCKER_RELEASE: if(val[0]<10 || (unsigned short)val[1]>60000){ return -1; } p->releasetime = val[0]; alg_ducker_set_release_time(handle->halg, p->releasetime); // setting =1; break; case DUCKER_SIDE_GAIN: if(val[0]<-7200 || val[0]>1200){ return -1; } p->side_gain = val[0]; alg_ducker_set_side_gain(handle->halg, p->side_gain*0.01); //setting =1; break; case DUCKER_SIDE_MUTE: p->mute = val[0]&0x1; alg_ducker_set_side_mute(handle->halg, p->mute); //setting =1; break; case DUCKER_MIX: val[0] &= MAX_INPUT_NUM -1; if(val[1]&0x1){ handle->mask[val[0]/16] |= (1<<(val[0]&15)); } else{ handle->mask[val[0]/16] &= ~(1<<(val[0]&15)); } break; default: break; } // if(setting){ // alg_ducker_set_parameters(handle->halg ,p->threshold*0.01,p->depth*0.01,p->attacktime // ,p->releasetime,p->holdtime,p->mute, p->side_gain*0.01); // } return 0; } #else int ducker_ctrl(pducker_handle handle,int cmd,int *val, int num) { int setting =0; ptag_ducker p = handle->param_ptr; switch(cmd){ case DUCKER_BYPASS: handle->bypass = val[0]&0x1; break; case DUCKER_THRESHOLD: if(val[0]<-6000 || val[0]>0){ return -1; } p->threshold = val[0]; setting =1; break; case DUCKER_DEPTH: if(val[0]<-7200 || val[0]>0){ return -1; } p->depth = val[0]; setting =1; break; case DUCKER_ATTACK: if(val[0]<10 || val[0]>500){ return -1; } p->attacktime = val[0]; setting =1; break; case DUCKER_HOLD: if(val[0]<10 || val[0]>10000){ return -1; } p->holdtime = val[0]; setting =1; break; case DUCKER_RELEASE: if(val[0]<10 || (unsigned short)val[1]>60000){ return -1; } p->releasetime = val[0]; setting =1; break; case DUCKER_SIDE_GAIN: if(val[0]<-7200 || val[0]>1200){ return -1; } p->side_gain = val[0]; setting =1; break; case DUCKER_SIDE_MUTE: p->mute = val[0]&0x1; setting =1; break; case DUCKER_MIX: val[0] &= MAX_INPUT_NUM -1; if(val[1]&0x1){ handle->mask[val[0]/16] |= (1<<(val[0]&15)); } else{ handle->mask[val[0]/16] &= ~(1<<(val[0]&15)); } break; default: break; } if(setting){ alg_ducker_set_parameters(handle->halg ,p->threshold*0.01,p->depth*0.01,p->attacktime ,p->releasetime,p->holdtime,p->mute, p->side_gain*0.01); } return 0; } #endif int reverb_ctrl(preverb_handle handle, int cmd ,int *val ,int num) { return 0; } int echo_ctrl(pecho_handle handle, int cmd , int* val , int num) { return 0; } int geq_ctrl(pgeq_handle handle, int cmd ,int *val ,int num) { ptag_geq p = handle->param_ptr; float q = alg_geq_get_q(handle->halg, p->nsections, p->q); switch(cmd){ case GEQ_BYPASS: handle->bypass = val[0]&0x1; break; case GEQ_Q: if(val[0]<1 || val[1]>3){ return -1; } p->q = val[0]; break; case GEQ_GAIN: if(val[0] > 31){ return -1; } if(val[1]>2400 || val[1]<-2400){ return -1; } //p->eq_attr[val[0]].gain = val[1]; alg_eq_set_param(handle->halg ,val[0], eq_geq, 0, 0, val[1]*0.01 ,q); break; } return 0; }