/* * tg_user_ctrl.cpp * * Created on: 2025Äê7ÔÂ24ÈÕ * Author: 86189 */ #include #include "IModule.h" #include "module_def.h" #include "tg_user_ctrl.h" #include "tg_scene.h" #include "../var_state.h" #include "../ModuleExport.h" u32 tg_param_ctrl::Signalgen_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum SGItemType{ SG_MUTE = 0x1, SG_TYPE , SG_FREQ , SG_GAIN, }; short val[4]; int channel = RESSIGNBIT(val_c[0]); //&(MAX_INPUT_NUM-1); if(pID == INPUT_TYPE) {//signal gen if(val_c[1] > 3) { val[0] = channel; val[1] = 0 ; } else if(val_c[1] > 0) { val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(SG_TYPE, val, 2); } else { val[0] = channel; val[1] = 0; m->Ctrl(SG_TYPE, val, 2); } } else if(pID == INPUT_FREQ) { val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(SG_FREQ, val, 2); } else if(pID == INPUT_LEVEL) { val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(SG_GAIN, val, 2); } // copy the channel params. ptag_input psg = (ptag_input)param; switch(pID) { case SG_MUTE: psg->input[channel].mute = val[1]; break; case SG_TYPE: psg->input[channel].type = val[1]; break; case SG_FREQ: psg->input[channel].freq = val[1]; break; case SG_GAIN: psg->input[channel].level = val[1]; break; default: break; } return 0; } u32 tg_param_ctrl::Input_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum SigSrcID { GAIN = 0x1, //val[0]: ͨµÀºÅ,val[1] : ÔöÒæ £¬³ËÒÔ100 £¬ ·¶Î§: -7200 ~ 1200 MUTE, //val[0]: ͨµÀºÅ,val[1] : ¾²Òô , 0-È¡Ïû¾²Òô,1-¾²Òô SENSI, PHANTO, SIGNAL_TYPE = 5, GENERATE_FREQ, GENERATE_LEVEL, PHASE = 9, //val[0]: ͨµÀºÅ,val[1] : ·´Ïà , 0-È¡Ïû·´Ïà, 1-·´Ïà STEP, }; short val[4]; int channel = RESSIGNBIT(val_c[0]);//&(MAX_INPUT_NUM-1); val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(pID, val, 2); ptag_input pin = (ptag_input)param; switch(pID) { case GAIN: pin->input[channel].gain = val[1]; break; case MUTE: pin->input[channel].mute = val[1]; break; case SENSI: pin->input[channel].sensitivity = val[1]; break; case PHANTO: pin->input[channel].phant = val[1]; break; case SIGNAL_TYPE: pin->input[channel].type = val[1]; break; case GENERATE_FREQ: pin->input[channel].freq = val[1]; break; case GENERATE_LEVEL: pin->input[channel].level = val[1]; break; case PHASE: pin->input[channel].phase = val[1]; break; case STEP: pin->input[channel].gain += val[1]; break; default: break; } return 0; } u32 tg_param_ctrl::Gain_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum GainID { GAIN = 0x1, MUTE, SENSI, PHANTOM, PHASE = 9, STEP,//-500~+500 }; short val[4]; int channel = val_c[0];//&(MAX_INPUT_NUM-1); if(pID == 0x20) { val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(GAIN, val, 2); } return 0; } u32 tg_param_ctrl::Output_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum GainID { GAIN = 0x1, MUTE, SENSI, PHANTO, PHASE = 9, STEP, }; short val[4]; int channel = val_c[0];//&(MAX_OUTPUT_NUM-1); short cmd[16] = {GAIN, MUTE, 0, PHASE, SENSI, STEP, 0, 0, 0, 0, 0, 0 ,0 ,0 ,0 ,0 }; val[0] = channel; val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(cmd[pID-1], val, 2); ptag_output pin = (ptag_output)param; switch(pID) { case GAIN: pin->output[channel].gain = val[1]; break; case MUTE: pin->output[channel].mute = val[1]; break; case SENSI: pin->output[channel].sensitivity = val[1]; break; case PHASE: pin->output[channel].phase = val[1]; break; case STEP: pin->output[channel].gain += val[1]; break; default: break; } return 0; } u32 tg_param_ctrl::Mixer_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { short val[4]; if(m->GetModuleID() >= 320){ val[0] = RESSIGNBIT(val_c[0]); val[1] = 0; val[2] = RESSIGNBIT(val_c[1]); m->Ctrl(MIXER_SWITCH, val, 3); } else{ val[0] = val_c[0]&0xff ; val[1] = (val_c[0]>>8)&0xff; val[2] = RESSIGNBIT(val_c[1]); m->Ctrl(pID, val, 3); } return 0; } u32 tg_param_ctrl::Crossover_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum CFilterID { _BYPASS = 0x1, _TYPE, _TAPS, _FREQ, _GAIN, }; short val[4]; if(pID >= XOVER_LOWPASS_BYPASS){ val[0] = 0; val[1] = RESSIGNBIT(val_c[0]); pID = pID - XOVER_LOWPASS_BYPASS +1; } else{ val[0] = 1; val[1] = RESSIGNBIT(val_c[0]); } m->Ctrl(pID, val, 2); // copy the ctrl params ptag_module pmodu = (ptag_module)param; ptag_crossover pxov = (ptag_crossover)pmodu->proc_ins; switch(pID) { case _BYPASS: (0==val[0]) ? (pxov->lowpass.bypass = val[1]) : (pxov->highpass.bypass = val[1]); break; case _TYPE: (0==val[0]) ? (pxov->lowpass.type = val[1]) : (pxov->highpass.type = val[1]); break; case _TAPS: (0==val[0]) ? (pxov->lowpass.taps = val[1]) : (pxov->highpass.taps = val[1]); break; case _FREQ: (0==val[0]) ? (pxov->lowpass.freq = val[1]) : (pxov->highpass.freq = val[1]); break; case _GAIN: (0==val[0]) ? (pxov->lowpass.gain = val[1]) : (pxov->highpass.gain = val[1]); break; default: break; } return 0; } u32 tg_param_ctrl::Automixer_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum GainSharingAMID { AM_BYPASS =0x1, AM_MUTE , AM_GAIN, AM_SLOPE, AM_RESPONSE, AM_CHANNEL_AUTO , AM_CHANNEL_MUTE, AM_CHANNEL_GAIN, AM_CHANNEL_PRIORITY, }; short val[4]; short cmd[16] = {AM_MUTE, AM_GAIN,AM_SLOPE,AM_RESPONSE,AM_CHANNEL_AUTO,AM_CHANNEL_MUTE,\ AM_CHANNEL_GAIN,AM_CHANNEL_PRIORITY,AM_BYPASS}; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(cmd[pID-1], val, 2); return 0; } u32 tg_param_ctrl::Aec_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum AECID{ BYPASS = 0X1, MUTE, NLPLEVEL, NSMODE, HPFFREQ, CHANNAME, AGC_BYPASS, AGC_THRESHOLD, AGC_TARTHRESHOLD, AGC_RATIO, AGC_ATTACK, AGC_RELEASE, AGC_GAIN, }; short val[4] = {0,0,0,0}; short cmd[3] = {0, BYPASS, NLPLEVEL}; val[1] = RESSIGNBIT(val_c[0]); m->Ctrl(cmd[pID], val, 2); return 0; } u32 tg_param_ctrl::Sysctl_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum SYSCTRLID{ SYSCTL_MUTE = 0x1, //val[0]:0-unmute,1-mute SYSCTL_GAIN, // }; short val[4]; short cmd[4] = {0, SYSCTL_GAIN, SYSCTL_MUTE, 0}; val[0] = RESSIGNBIT(val_c[0]); m->Ctrl(cmd[pID], val, 1); return 0; } u32 tg_param_ctrl::Reverb_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(pID, val, 2); return 0; } u32 tg_param_ctrl::Echo_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum EchoID{ ECHO_BYPASS = 1, ECHO_HPF, ECHO_LPF, ECHO_DELAY, ECHO_GAIN, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(pID, val, 2); return 0; } u32 tg_param_ctrl::Geq_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum GEQID{ GEQ_BYPASS_ALL = 0x1,//val[0]: 0-È¡Ïûbypass, 1- ʹÄÜbypass GEQ_QVALUE,//val[0]: 1-narrow, 2-normal, 3-wide GEQ_GAIN,//val[0]: ¶ÎÐòºÅ,val[1] : ÔöÒæ,³ËÒÔ100£¬·¶Î§:-4800~2400 GEQ_CLEAR,//val[0]: ¸´Î»EQ²ÎÊý }; short val[4]; short cmd[8] = {0, GEQ_BYPASS_ALL, GEQ_QVALUE, GEQ_GAIN, GEQ_CLEAR}; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(cmd[pID], val, 2); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_geq pgeq = (ptag_geq)pmodu->proc_ins; switch(pID) { case GEQ_BYPASS_ALL: pgeq->bypass = val[0]; break; case GEQ_QVALUE: pgeq->q_index = val[0]; break; case GEQ_GAIN: if (val[0] < 31) pgeq->eq_attr[val[0]].gain = val[1]; break; default: break; } return 0; } u32 tg_param_ctrl::Fir_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { enum FIRID { FIR_BYPASS = 0x1, ////val[0]: 0-È¡Ïûbypass, 1- ʹÄÜbypass FIR_NAME, //ÎÞÓà FIR_TAPS, //ÎÞÓà FIR_COEFFS, //val: ·Ö°ü£¬×î´ó³¤¶È1024 float. ÎÞת»»Ö±½Ó¿½±´float. }; s16 val[4]; val[0] = RESSIGNBIT(val_c[0]); if(FIR_BYPASS == pID){ m->Ctrl(pID, val, 1); // val[0] is bypass or nobypass } else if (FIR_COEFFS == pID){ m->Ctrl(pID, val_c, num); } ptag_module pmodu = (ptag_module)param; ptag_fir pfir = (ptag_fir)pmodu->proc_ins; switch(pID) { case FIR_BYPASS: pfir->bypass = val[0]; break; case FIR_COEFFS: memcpy((void*)&pfir->coeffs, val_c, num * sizeof(*val_c)); break; default: break; } return 0; } u32 tg_param_ctrl::General_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); m->Ctrl(pID, val, 2); // dbg_printf("pID:%d v[0]:%d v[1]:%d\n", pID, val[0], val[1]); return 0; } u32 tg_param_ctrl::Agc_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum AGCID { AGC_BYPASS = 0x1, //val[0]:0-È¡Ïûbypass£¬1-bypass AGC_NOISE_THR, //val[0]: ãÐÖµ,³ËÒÔ100£¬·¶Î§£º-9600~-2000 AGC_TARGET_LEVEL, //val[0]:Ä¿±êãÐÖµ£¬³ËÒÔ100£¬·¶Î§-4000~0 AGC_RATIO, //val[0]:±ÈÂÊ£¬³ËÒÔ100£¬·¶Î§1-10000. AGC_ATTACKTIME, //val[0]:½¨Á¢Ê±¼ä,·¶Î§1~2000 AGC_RELEASETIME, //val[0]:ÊÍ·Åʱ¼ä,·¶Î§1~2000 }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_agc pagc = (ptag_agc)pmodu->proc_ins; switch(pID) { case AGC_BYPASS: pagc->bypass = val[0]; break; case AGC_NOISE_THR: pagc->threshold = val[0]; break; case AGC_TARGET_LEVEL: pagc->tar_threshold = val[0]; break; case AGC_RATIO: pagc->ratio = val[0]; break; case AGC_ATTACKTIME: pagc->attacktime = val[0]; break; case AGC_RELEASETIME: pagc->releasetime = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::Peq_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum PEQID{ EQ_BYPASS_ALL = 0x1,//val[0]: 0-È¡Ïûbypass, 1- ʹÄÜbypass EQ_BYPASS,//val[0]: ¶ÎÐòºÅ,val[1] : 0-È¡Ïûbypass, 1- ʹÄÜbypass EQ_FREQ,//val[0]: ¶ÎÐòºÅ,val[1] : ƵÂÊ£¬ ·¶Î§:20-20K EQ_GAIN,//val[0]: ¶ÎÐòºÅ,val[1] : ÔöÒæ,³ËÒÔ100£¬·¶Î§:-4800~2400 EQ_QVALUE,//val[0]: ¶ÎÐòºÅ,val[1] :QÖµ£¬³ËÒÔ100£¬·¶Î§1~5000 EQ_TYPE,//val[0]: ¶ÎÐòºÅ,val[1] : EQÀàÐÍ ·¶Î§²Î¿¼Ã¶¾ÙÀàÐÍEQType¶¨Òå EQ_CLEAR,//val[0]: ¸´Î»EQ²ÎÊý }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_eq pexp = (ptag_eq)pmodu->proc_ins; switch(pID) { case EQ_BYPASS_ALL: pexp->bypass = val[0]; break; case EQ_BYPASS: pexp->eq_attr[val[0]].bypass = val[1]; break; case EQ_FREQ: pexp->eq_attr[val[0]].freq = val[1]; break; case EQ_GAIN: pexp->eq_attr[val[0]].gain = val[1]; break; case EQ_QVALUE: pexp->eq_attr[val[0]].q = val[1]; break; case EQ_TYPE: pexp->eq_attr[val[0]].type = val[1]; break; default: break; } return 0; } u32 tg_param_ctrl::Expander_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum ExpanderID{ EXPANDER_BYPASS = 0x1, EXPANDER_THRESHOLD, EXPANDER_RADIO, EXPANDER_ATTACK, EXPANDER_RELEASE, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_expander pexp = (ptag_expander)pmodu->proc_ins; switch(pID) { case EXPANDER_BYPASS: pexp->bypass = val[0]; break; case EXPANDER_THRESHOLD: pexp->threshold = val[0]; break; case EXPANDER_RADIO: pexp->ratio = val[0]; break; case EXPANDER_ATTACK: pexp->attack = val[0]; break; case EXPANDER_RELEASE: pexp->release = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::CompAndLimt_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum CompressorID { COMPRESS_BYPASS = 0x1, COMPRESS_THERSHOLD, COMPRESS_RADIO, COMPRESS_ATTACK, COMPRESS_RELEASE, COMPRESS_GAIN, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_compress pco2li = (ptag_compress)pmodu->proc_ins; switch(pID) { case COMPRESS_BYPASS: pco2li->bypass = val[0]; break; case COMPRESS_THERSHOLD: pco2li->threshold = val[0]; break; case COMPRESS_RADIO: pco2li->ratio = val[0]; break; case COMPRESS_ATTACK: pco2li->attack = val[0]; break; case COMPRESS_RELEASE: pco2li->release = val[0]; break; case COMPRESS_GAIN: pco2li->gain = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::Delay_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum DelayID { DELAY_BYPASS = 0x1, DELAY_MSEC, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); ptag_module pmodu = (ptag_module)param; ptag_delay pdelay = (ptag_delay)pmodu->proc_ins; switch(pID) { case DELAY_BYPASS: pdelay->bypass = val[0]; break; case DELAY_MSEC: pdelay->ms = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::Gating_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum NoiseGateID { GATE_BYPASS = 0x1, //val[0]:0-È¡Ïûbypass, 1-ʹÄÜbypass GATE_THRESHOLD,//val[0]:ãÐÖµ£¬³ËÒÔ100£¬·¶Î§-9600~0 GATE_DEPTH, //val[0]:Éî¶È£¬³ËÒÔ100£¬·¶Î§-7200~0 GATE_HOLDTIME, //val[0]: ±£³Öʱ¼ä,·¶Î§1~10000ms GATE_ATTACK, //val[0]:½¨Á¢Ê±¼ä£¬·¶Î§1~2000ms GATE_RELEASE,//val[0]:ÊÍ·Åʱ¼ä£¬·¶Î§1~2000ms }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); ptag_module pmodu = (ptag_module)param; ptag_gate pgate = (ptag_gate)pmodu->proc_ins; switch(pID) { case GATE_BYPASS: pgate->bypass = val[0]; break; case GATE_THRESHOLD: pgate->threshold = val[0]; break; case GATE_DEPTH: pgate->depth = val[0]; break; case GATE_HOLDTIME: pgate->holdtime = val[0]; break; case GATE_ATTACK: pgate->attacktime = val[0]; break; case GATE_RELEASE: pgate->releasetime = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::Feedback_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum NHSID{ FB_BYPASS= 0x1, FB_FLT_FREQ, FB_FLT_GAIN, FB_FLT_Q, FB_FLT_TYPE, FB_STEP, FB_CLEAR, FB_PANIC, FB_FLT_DEPTH, FB_THRS, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); // save the modul param ptag_module pmodu = (ptag_module)param; ptag_feedback pfb = (ptag_feedback)pmodu->proc_ins; switch(pID) { case FB_BYPASS: pfb->bypass = val[0]; break; case FB_FLT_FREQ: pfb->flt_group[val[0]].fc = val[1]; break; case FB_FLT_GAIN: pfb->flt_group[val[0]].gain = val[1]; break; case FB_FLT_Q: pfb->bw = val[0]; break; case FB_FLT_TYPE: pfb->flt_group[val[0]].type = val[1]; break; case FB_STEP: pfb->step = val[0]; break; case FB_PANIC: pfb->panic_threshold = val[0]; break; case FB_FLT_DEPTH: pfb->flt_depth = val[0]; break; case FB_THRS: pfb->fb_threshold = val[0]; break; default: break; } return 0; } u32 tg_param_ctrl::Ducker_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum DuckerWithMixID { DUCKER_BYPASS = 0x1, //val[0]:0-È¡Ïûbypass,1-ʹÄÜbypass DUCKER_THRESHOLD,//val[0]:ãÐÖµ£¬³ËÒÔ100£¬·¶Î§£º-6000~0 DUCKER_DEPTH,//val[0]:Éî¶È£¬³ËÒÔ100£¬·¶Î§£º-7200~0 DUCKER_ATTACK,//val[0]:½¨Á¢Ê±¼ä£¬·¶Î§£º1~2000ms DUCKER_HOLD,//val[0]:±£³Öʱ¼ä£¬·¶Î§£º1~10000ms DUCKER_RELEASE,//val[0]:ÊÍ·Åʱ¼ä£¬·¶Î§£º1~60000ms DUCKER_SIDE_GAIN,//val[0]:²àÁ´ÔöÒæ£¬³ËÒÔ100£¬·¶Î§£º-7200~1200 DUCKER_SIDE_MUTE,//val[0]:²àÁ´¾²Òô£¬0-È¡Ïû¾²Òô£¬1-¾²Òô DUCKER_SIDE_MIX,//val[0]:²àÁ´»ìÒô,0-È¡Ïû»ìÒô,1-»ìÒô }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); ptag_module pmodu = (ptag_module)param; ptag_ducker pduck = (ptag_ducker)pmodu->proc_ins; switch(pID) { case DUCKER_BYPASS: pduck->bypass = val[0]; break; case DUCKER_THRESHOLD: pduck->threshold = val[0]; break; case DUCKER_DEPTH: pduck->depth = val[0]; break; case DUCKER_ATTACK: pduck->attacktime = val[0]; break; case DUCKER_HOLD: pduck->holdtime = val[0]; break; case DUCKER_RELEASE: pduck->releasetime = val[0]; break; case DUCKER_SIDE_GAIN: pduck->side_gain = val[0]; break; case DUCKER_SIDE_MUTE: pduck->mute = val[0]; break; case DUCKER_SIDE_MIX: if (val[1]) pduck->mask[val[0]/16] |= (1>>(val[0]&15)); else pduck->mask[val[0]/16] &= (0>>(val[0]&15)); break; default: break; } return 0; } u32 tg_param_ctrl::Spler_Ctrl(IModule* m, u32 pID, s16* val_c, u32 num, void* param) { General_Ctrl(m, pID, val_c, num, param); enum ContSplWithMixID { SPLMIX_BYPASS = 0x1, //val[0]:0-È¡Ïûbypass,1-bypass SPL_MAX_GAIN, SPL_MIN_GAIN, SPL_SENSE_RATIO, SPL_SPEED, SPL_TRIM, SPL_THR, SPL_DISTANCE, SPL_MIX, }; short val[4]; val[0] = RESSIGNBIT(val_c[0]); val[1] = RESSIGNBIT(val_c[1]); ptag_module pmodu = (ptag_module)param; ptag_spl pspl = (ptag_spl)pmodu->proc_ins; switch(pID) { case SPLMIX_BYPASS: pspl->bypass = val[0]; break; case SPL_MAX_GAIN: pspl->maxgain = val[0]; break; case SPL_MIN_GAIN: pspl->mingain = val[0]; break; case SPL_SENSE_RATIO: pspl->sense_ratio = val[0]; break; case SPL_SPEED: pspl->speed = val[0]; break; case SPL_TRIM: pspl->trim = val[0]; break; case SPL_THR: pspl->noise_thr = val[0]; break; case SPL_DISTANCE: pspl->distance = val[0]; break; case SPL_MIX: if (val[1]) pspl->mask[val[0]/16] |= (1>>(val[0]&15)); else pspl->mask[val[0]/16] &= (0>>(val[0]&15)); break; default: break; } return 0; }