chenlh
2026-01-29 1ac2340f684bf8c0b05fb571f5994b0755050671
src/tg/tg_scene.cpp
@@ -1,139 +1,238 @@
/*
 * scene.c
 *
 *  Created on: 2025年7月18日
 *  Created on: 2025年7月18日
 *      Author: 86189
 */
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include "tg_scene.h"
#include "../protocol_internal.h"
#include "../ModuleExport.h"
tgScene::~tgScene()
{
   for (s32 i = 0; i < input_num; i++)
      delete chin_mid[i];
   for (s32 i = 0; i < output_num; i++)
      delete chout_mid[i];
   delete chin_mid;
   delete chout_mid;
   paramPtr.clear();
}
tgScene::tgScene(hw_adapter_t* adapter):Scene(adapter)
{
   s8 inport_str[8],outport_str[8];
   s8 ana_input_num, ana_output_num,dante_input_num,dante_output_num ;
   s16 input_num, output_num ;
   s32 n;
   s32 i;
   s8 inport_str[16],outport_str[16];
   s8 ana_input_num, ana_output_num, loc_input_num, loc_output_num, dante_input_num, dante_output_num ;
   s8 usb_input_num, usb_output_num;
//   s16 input_num, output_num ;
   s32 n, new_idx = 300; //ID of the USB channel starts from 300.
   s16 dual_dsp = adapter->get_system_is_dual_dsp();
   s16 dsp_index = adapter->get_dsp_index();
   adapter->get_channel_num(&ana_input_num, &ana_output_num, &dante_input_num, &dante_output_num);
   input_num = ana_input_num + dante_input_num;
   output_num = ana_output_num + dante_output_num;
   adapter->get_channel_num(&loc_input_num, &loc_output_num, &dante_input_num, &dante_output_num, &usb_input_num, &usb_output_num);
   ana_input_num = loc_input_num - usb_input_num;
   ana_output_num = loc_output_num - usb_output_num;
   //物理输入共16+16+2
   input_num = ana_input_num + dante_input_num + usb_input_num; //2 USB
   output_num = ana_output_num + dante_output_num + usb_output_num;
   chin_mid = new s32*[input_num];
   chout_mid = new s32*[output_num];
   for (i = 0; i < input_num; i++) {
      chin_mid[i] = new s32[6];
   }
   for (i = 0; i < output_num; i++) {
      chout_mid[i] = new s32[5];
   }
   paramPtr.resize(new_idx + usb_input_num * 5 + usb_output_num * 4, nullptr);
   tgScene_param_default(&parameters);
   sprintf(inport_str, "1-%d", input_num);
   __MADD(299,PROC_INPUT,inport_str,inport_str,0, 1 ,&parameters.input,  0, ModuleInterfaceType::PHY_INPUT);
   __MADD(298,PROC_METER,inport_str,"",0,1 ,NULL,0, ModuleInterfaceType::SOFT_MODULE); //tag:0-peak,1-rms
   __MADD(299, PROC_INPUT,inport_str,inport_str,0, 1 ,&parameters.input,  0, ModuleInterfaceType::PHY_INPUT);
   for (i = 0; i < input_num; i++)
      chin_mid[i][0] = 299;
   //The number of DSPs is 1, but the number of input and output channels is greater than 16.
   //It only processes analog input and output.
   //However, for the channels that do not need to be processed, the level offset needs to be calculated.
   if(!dual_dsp && input_num >16) {
      n = ana_input_num;
   }
   else {
      n= input_num;
   }
   sprintf(inport_str, "1-%d", input_num);
   __MADD(298, PROC_METER,inport_str,"",0,1 ,NULL,0, ModuleInterfaceType::SOFT_MODULE); //tag:0-peak,1-rms
   //expander
   for(s32 i =0 ;i < input_num ; i++) {
      sprintf(inport_str, "%d|", i+1);
      __MADD(1+i,PROC_EXPANDER, inport_str, inport_str, 0, 0, &parameters.in1[i], 0, ModuleInterfaceType::SOFT_MODULE);
      if(i < input_num - usb_input_num) {
         __MADD(1+i, PROC_EXPANDER, inport_str, inport_str, 0, 0, &parameters.in1[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][1] = 1+i;
      }
      else {
         __MADD(new_idx, PROC_EXPANDER, inport_str, inport_str, 0, 0, &parameters.in1[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][1] = new_idx++;
      }
   }
   //compresser
   for(s32 i =0 ;i < input_num ; i++) {
      sprintf(inport_str, "%d|", i+1);
      __MADD(33+i,PROC_COMPRESS, inport_str, inport_str, 0, 0, &parameters.in2[i], 0, ModuleInterfaceType::SOFT_MODULE);
      if(i < input_num - usb_input_num) {
         __MADD(33+i, PROC_COMPRESS, inport_str, inport_str, 0, 0, &parameters.in2[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][2] = 33+i;
      }
      else {
         __MADD(new_idx, PROC_COMPRESS, inport_str, inport_str, 0, 0, &parameters.in2[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][2] = new_idx++;
      }
   }
   //agc
   for(s32 i =0 ;i < input_num ; i++) {
      sprintf(inport_str, "%d|", i+1);
      __MADD(65+i,PROC_AGC, inport_str, inport_str, 0, 0, &parameters.in3[i], 0, ModuleInterfaceType::SOFT_MODULE);
      if(i < input_num - usb_input_num) {
         __MADD(65+i, PROC_AGC, inport_str, inport_str, 0, 0, &parameters.in3[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][3] = 65+i;
      }
      else {
         __MADD(new_idx, PROC_AGC, inport_str, inport_str, 0, 0, &parameters.in3[i], 0, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][3] = new_idx++;
      }
   }
   //eq
   for(s32 i =0 ;i < input_num ; i++) {
      sprintf(inport_str, "%d|", i+1);
      __MADD(97+i,PROC_EQ, inport_str, inport_str, 0, 0, &parameters.in4[i],  8, ModuleInterfaceType::SOFT_MODULE);
      if(i < input_num - usb_input_num) {
         __MADD(97+i, PROC_EQ, inport_str, inport_str, 0, 0, &parameters.in4[i],  8, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][4] = 97+i;
      }
      else {
         __MADD(new_idx, PROC_EQ, inport_str, inport_str, 0, 0, &parameters.in4[i],  8, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][4] = new_idx++;
      }
   }
   //nhs
   for(s32 i =0 ;i < input_num ; i++) {
      sprintf(inport_str, "%d|", i+1);
      __MADD(129+i,PROC_FEEDBACK, inport_str, inport_str, 0, 0, &parameters.in5[i], 8, ModuleInterfaceType::SOFT_MODULE);
      if(i < input_num - usb_input_num) {
         __MADD(129+i, PROC_FEEDBACK, inport_str, inport_str, 0, 0, &parameters.in5[i], 8, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][5] = 129+i;
      }
      else {
         __MADD(new_idx, PROC_FEEDBACK, inport_str, inport_str, 0, 0, &parameters.in5[i], 8, ModuleInterfaceType::SOFT_MODULE);
         chin_mid[i][5] = new_idx++;
      }
   }
   //am
   sprintf(inport_str, "1-%d", input_num);
   sprintf(outport_str, "1-%d", input_num+1);
   __MADD(161,PROC_AUTOMIXER,inport_str, outport_str, 0, 0, &parameters.automixer, 0, ModuleInterfaceType::SOFT_MODULE);  //可替换
   __MADD(161,PROC_AUTOMIXER,inport_str, outport_str, 0, 0, &parameters.automixer, 0, ModuleInterfaceType::SOFT_MODULE);  //¿ÉÌæ»»
   //aec selector
   sprintf(inport_str, "1-%d", input_num+ 2);//+1 add usb
   sprintf(outport_str, "%d|%d|", input_num+ 3, input_num+ 4);
   sprintf(inport_str, "1-%d", input_num+ 1);
   sprintf(outport_str, "%d|%d|", input_num+ 2, input_num+ 3);
   __MADD(162,PROC_SELECTOR, inport_str,outport_str, 0, 1, &parameters.aec_selector, 0, ModuleInterfaceType::SOFT_MODULE);  //add usb
   //aec
   sprintf(inport_str, "%d|%d", input_num+ 3, input_num+ 4);
   sprintf(outport_str, "%d|", input_num+ 3);
   sprintf(inport_str, "%d|%d", input_num+ 2, input_num+ 3);
   sprintf(outport_str, "%d|", input_num+ 2);
   __MADD(163,PROC_AEC,inport_str, outport_str ,0, 1, &parameters.aec, 256, ModuleInterfaceType::SOFT_MODULE);
   //ans selector
   sprintf(inport_str, "1-%d", input_num+ 3);
   sprintf(outport_str, "%d|", input_num+ 4);
   sprintf(inport_str, "1-%d", input_num+ 2);
   sprintf(outport_str, "%d|", input_num+ 3);
   __MADD(164,PROC_SELECTOR,inport_str,outport_str, 1, 1 ,&parameters.ans_selector, 0, ModuleInterfaceType::SOFT_MODULE);
   //ans
   sprintf(inport_str, "%d|", input_num+ 4);
   sprintf(outport_str, "%d|", input_num+ 4);
   sprintf(inport_str, "%d|", input_num+ 3);
   sprintf(outport_str, "%d|", input_num+ 3);
   __MADD(165,PROC_ANS,inport_str,outport_str, 1, 0 ,&parameters.afc_ns,0, ModuleInterfaceType::SOFT_MODULE);
   //mixer
   sprintf(inport_str, "1-%d", input_num+ 4);
   sprintf(outport_str, "1-%d", output_num+1);
   __MADD(166,PROC_MIXER,inport_str,outport_str,1, 1 ,&parameters.mixer, 0, ModuleInterfaceType::SOFT_MODULE);   // .begin()+48
   sprintf(inport_str, "1-%d", input_num+ 3);
   sprintf(outport_str, "%d-%d",input_num+4, input_num+output_num+4);
   __MADD(166,PROC_MIXER,inport_str,outport_str,1, 1 ,&parameters.mixer, 0, ModuleInterfaceType::SOFT_MODULE);
   //dummy
   for(s32 i =0 ;i < output_num ; i++) {
      sprintf(inport_str, "%d|", i+input_num+4);
      sprintf(outport_str, "%d|", i+1);
      __MADD(500+i, DUMMY_OUTPUT, inport_str, outport_str, 1, 0, &parameters.aec, 2, ModuleInterfaceType::SOFT_MODULE); //预防删除了第一个输出模块时硬件无声音输出
   }
   //crossover
   for(s32 i =0 ;i < output_num ; i++) {
      sprintf(outport_str, "%d|", i+1);
      __MADD(167+i,PROC_CROSSOVER,outport_str, outport_str,1, 0, &parameters.out1[i],2, ModuleInterfaceType::SOFT_MODULE);
      if(i < output_num - usb_output_num) {
         __MADD(167+i, PROC_CROSSOVER, outport_str, outport_str, 1, 0, &parameters.out1[i],2, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][1] = 167+i;
      }
      else {
         __MADD(new_idx, PROC_CROSSOVER, outport_str, outport_str, 1, 0, &parameters.out1[i],2, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][1] = new_idx++;
      }
   }
//   printf("ou_adr ou1[2]:0x%x, ou1[3]:0x%x\n", &parameters.out1[2], &parameters.out1[3]);
   //eq
   for(s32 i =0 ;i < output_num ; i++) {
      sprintf(outport_str, "%d|", i+1);
      __MADD(199+i,PROC_EQ,outport_str, outport_str,1, 0, &parameters.out2[i], 8, ModuleInterfaceType::SOFT_MODULE);
      if(i < output_num - usb_output_num) {
         __MADD(199+i, PROC_EQ, outport_str, outport_str,1, 0, &parameters.out2[i], 8, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][2] = 199+i;
      }
      else {
         __MADD(new_idx, PROC_EQ, outport_str, outport_str,1, 0, &parameters.out2[i], 8, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][2] = new_idx++;
      }
   }
   //delay
   for(s32 i =0 ;i < output_num ; i++) {
      sprintf(outport_str, "%d|", i+1);
      __MADD(231+i,PROC_DELAY,outport_str, outport_str,1, 0, &parameters.out3[i], 1200, ModuleInterfaceType::SOFT_MODULE);
      if(i < output_num - usb_output_num) {
         __MADD(231+i,PROC_DELAY, outport_str, outport_str,1, 0, &parameters.out3[i], 1200, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][3] = 231+i;
      }
      else {
         __MADD(new_idx,PROC_DELAY, outport_str, outport_str,1, 0, &parameters.out3[i], 1200, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][3] = new_idx++;
      }
   }
   //limit
   for(s32 i =0 ;i < output_num ; i++) {
      sprintf(outport_str, "%d|", i+1);
      __MADD(263+i,PROC_LIMIT,outport_str, outport_str,1, 0, &parameters.out4[i],0, ModuleInterfaceType::SOFT_MODULE);
      if(i < output_num - usb_output_num) {
         __MADD(263+i, PROC_LIMIT, outport_str, outport_str,1, 0, &parameters.out4[i],0, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][4] = 263+i;
      }
      else {
         __MADD(new_idx, PROC_LIMIT, outport_str, outport_str,1, 0, &parameters.out4[i],0, ModuleInterfaceType::SOFT_MODULE);
         chout_mid[i][4] = new_idx++;
      }
   }
   //output
   sprintf(outport_str, "1-%d", output_num);
   __MADD(295,PROC_OUTPUT,outport_str,outport_str,1, 1, &parameters.output,0, ModuleInterfaceType::SOFT_MODULE);
   //sysctrl
   __MADD(296,PROC_SYSCTL,outport_str,outport_str,1, 1, &parameters.sysctl,0, ModuleInterfaceType::PHY_OUTPUT);
   //meter
   __MADD(297,PROC_METER,outport_str,"",1, 1, NULL, 0, ModuleInterfaceType::SOFT_MODULE);
   for (i = 0; i < output_num; i++)
      chout_mid[i][0] = 295;
   printf("lst size=%d\n", proc_list.size());
   //sysctrl
   __MADD(296,PROC_SYSCTL,outport_str,outport_str,1, 1, &parameters.sysctl,0, ModuleInterfaceType::SOFT_MODULE);
   //meter
   __MADD(297,PROC_METER,outport_str,outport_str,1, 1, &parameters.output, 0, ModuleInterfaceType::PHY_OUTPUT);
};
@@ -141,6 +240,7 @@
{
   int j;
   int allbypass = 1;
   ptag_module pmodu = (ptag_module)param_ptr;
   switch(proc_type) {
      case PROC_INPUT:
@@ -155,19 +255,21 @@
            pInput->input[j].gain =0;
            pInput->input[j].mute = 0;
            pInput->input[j].type=0;
            pInput->input[j].phase =0 ;
            pInput->input[j].phase =0;
            pInput->input[j].mingain = -8000;
            pInput->input[j].maxgain = 1200;
         }
      break;
      case PROC_METER:
         ptag_Meter pMeter = (ptag_Meter)param_ptr;
         pmodu->proc_type = PROC_METER;
         ptag_Meter pMeter = (ptag_Meter)pmodu->proc_ins;
         pMeter->input_num = 8;
      break;
      case PROC_SHELF:
         ptag_shelf pshelf = (ptag_shelf)param_ptr;
         pmodu->proc_type = PROC_SHELF;
         ptag_shelf pshelf = (ptag_shelf)pmodu->proc_ins;
         pshelf->highshelf.bypass = allbypass;
         pshelf->highshelf.freq = 500;
         pshelf->highshelf.gain = -4500;
@@ -180,16 +282,18 @@
      case PROC_GEQ:
         int j;
         ptag_geq pGEQ = (ptag_geq)param_ptr;
         pmodu->proc_type = PROC_GEQ;
         ptag_geq pGEQ = (ptag_geq)pmodu->proc_ins;
         pGEQ->bypass = allbypass;
         pGEQ->q = 2;
         pGEQ->q_index = 2;
         pGEQ->nsections = 31;
         for(j=0;j<31;j++){
            pGEQ->eq_attr[j].gain = 0;
         }
         break;
      case PROC_EQ:
         ptag_eq pEQ = (ptag_eq)param_ptr;
         pmodu->proc_type = PROC_EQ;
         ptag_eq pEQ = (ptag_eq)pmodu->proc_ins;
         u16  freq[]={40,80,200,500,1000,2000,4000,8000,10000,12500,16000,20000};
         pEQ->bypass = allbypass;
         pEQ->nsection = MAX_EQ_SECTION;
@@ -203,7 +307,8 @@
      break;
      case PROC_EXPANDER:
         ptag_expander pExpander = (ptag_expander)param_ptr;
         pmodu->proc_type = PROC_EXPANDER;
         ptag_expander pExpander = (ptag_expander)pmodu->proc_ins;
         pExpander->bypass = allbypass;
         pExpander->threshold = -6000;
         pExpander->ratio = 100;
@@ -212,7 +317,8 @@
      break;
      case PROC_COMPRESS:
         ptag_compress pcompress = (ptag_compress)param_ptr;
         pmodu->proc_type = PROC_COMPRESS;
         ptag_compress pcompress = (ptag_compress)pmodu->proc_ins;
         pcompress->bypass = allbypass;
         pcompress->threshold = -4800;
         pcompress->ratio = 100;
@@ -223,7 +329,8 @@
      break;
      case PROC_LIMIT:
         ptag_compress limiter = (ptag_compress)param_ptr;
         pmodu->proc_type = PROC_LIMIT;
         ptag_compress limiter = (ptag_compress)pmodu->proc_ins;
         limiter->bypass = allbypass;
         limiter->threshold = 0;
         limiter->ratio = 10000;
@@ -249,13 +356,15 @@
      break;
      case PROC_DELAY:
         ptag_delay pDelay = (ptag_delay)param_ptr;
         pmodu->proc_type = PROC_DELAY;
         ptag_delay pDelay = (ptag_delay)pmodu->proc_ins;
         pDelay->bypass = allbypass;
         pDelay->ms  = 1;
      break;
      case PROC_CROSSOVER:
         ptag_crossover pCross = (ptag_crossover)param_ptr;
         pmodu->proc_type = PROC_CROSSOVER;
         ptag_crossover pCross = (ptag_crossover)pmodu->proc_ins;
         pCross->highpass.bypass = allbypass;
         pCross->highpass.freq = 500;//454;
         pCross->highpass.taps = 18;//48;
@@ -303,7 +412,8 @@
      break;
      case PROC_FEEDBACK:
         ptag_feedback pfb = (ptag_feedback)param_ptr;
         pmodu->proc_type = PROC_FEEDBACK;
         ptag_feedback pfb = (ptag_feedback)pmodu->proc_ins;
         pfb->bypass = allbypass;
         pfb->panic_threshold = 0;
         pfb->flt_depth = 1800;
@@ -322,7 +432,8 @@
      break;
      case PROC_ANS:
         ptag_ans pans = (ptag_ans)param_ptr;
         pmodu->proc_type = PROC_ANS;
         ptag_ans pans = (ptag_ans)pmodu->proc_ins;
         pans->bypass = allbypass;
         pans->mode = 0;
      break;
@@ -384,7 +495,8 @@
      break;
      case PROC_DUCKER:
         ptag_ducker pducker = (ptag_ducker)param_ptr;
         pmodu->proc_type = PROC_DUCKER;
         ptag_ducker pducker = (ptag_ducker)pmodu->proc_ins;
         pducker->bypass = allbypass;
         pducker->threshold = -4500;
         pducker->depth = -2000;
@@ -401,6 +513,12 @@
      break;
      case PROC_FIR:
         pmodu->proc_type = PROC_FIR;
         ptag_fir pfir = (ptag_fir)pmodu->proc_ins;
         pfir->bypass = allbypass;
         pfir->taps = 1024;
         memset((void*)pfir->coeffs, 0, sizeof(pfir->coeffs));
         pfir->coeffs[0] = 1;
      break;
      default:
@@ -446,8 +564,28 @@
s32 tgScene::set_parameters_content(uvoid* param, s32 size)
{
   tag_parameters* pp = (tag_parameters*)param;
   int L[24] = {0};
   if(pp->magic != 0xbcba || size != sizeof(tag_parameters)) {
      printf("preset param error!\n");
      /*printf("tag_head:%d,%d,%d,%d,%d\n", L[0]=sizeof(parameters.magic), L[1]=sizeof(parameters.nmds)+L[0], L[2]=sizeof(parameters.pad1)+L[1], L[3]=sizeof(parameters.pad2)+L[2], L[4]=sizeof(parameters.crc)+L[3]);
      printf("tag_input:%d, %d\n", sizeof(tag_input), L[5]=sizeof(tag_input)+L[4]);
      printf("tag_module_in:%d, %d\n", sizeof(tag_module), L[6]=sizeof(tag_module) * MAX_INPUT_NUM * 5 + L[5]);
      printf("tag_automixer:%d, %d\n", sizeof(tag_automixer), L[7]=sizeof(tag_automixer)+L[6]);
      printf("tag_select1:%d, %d\n", sizeof(tag_selector), L[8]=sizeof(tag_selector)+L[7]);
      printf("tag_aec:%d, %d\n", sizeof(tag_aec), L[9]=sizeof(tag_aec)+L[8]);
      printf("tag_selector:%d, %d\n", sizeof(tag_selector), L[10]=sizeof(tag_selector) + L[9]);
      printf("tag_3a:%d, %d, %d\n", sizeof(tag_3a), L[11]=sizeof(tag_3a)+L[10]);
      printf("tag_mixer:%d, %d\n", sizeof(tag_mixer), L[12]=sizeof(tag_mixer)+L[11]);
      printf("tag_module_o1:%d, %d\n", sizeof(tag_module), L[13]=sizeof(tag_module) * MAX_INPUT_NUM + L[12]);
      printf("tag_module_fir:%d\n", sizeof(tag_module_fir), L[14]=sizeof(tag_module_fir) * MAX_OUTPUT_NUM + L[13]);
      printf("tag_module_out:%d\n", sizeof(tag_module), L[15]=sizeof(tag_module) * MAX_OUTPUT_NUM * 2 + L[14]);
      printf("tag_output:%d, %d\n", sizeof(tag_output), L[16]=sizeof(tag_output)+L[15]);
      printf("tag_sysctl:%d, %d\n", sizeof(tag_sysctl), L[17]=sizeof(tag_sysctl)+L[16]);
      printf("tag_group:%d, %d\n", sizeof(tag_group), L[18]=sizeof(tag_group)+L[17]);*/
      dbg_printf("Len parameters:%d, Len recv:%d\n", L[19]=sizeof(tag_parameters), size);
      return -1;
   }
   memcpy(&parameters, param, sizeof(tag_parameters));
@@ -455,7 +593,7 @@
   return 0;
}
s32 tgScene::update_dynmodule_tag(s32 proc_type,struct proc_field* proc)
s32 tgScene::update_dynmodule_tag(s32 proc_type, struct proc_field* proc)
{
   switch(proc_type) {
   case  ModuleType::PROC_GEQ:{
@@ -484,7 +622,7 @@
      proc->tag =1200;
      break;
   case  ModuleType::PROC_CROSSOVER:
      proc->tag =2;
      proc->tag =1;
      break;
   case  ModuleType::PROC_FEEDBACK:{
      ptag_module pmodule  = (ptag_module)proc->parameters;
@@ -515,12 +653,12 @@
s32 tgScene::update_module()
{
   s8 ana_input_num, ana_output_num,dante_input_num,dante_output_num ;
   s8 ana_input_num, ana_output_num,dante_input_num,dante_output_num, usb_input_num, usb_output_num ;
   s16 input_num, output_num ;
   s16 dual_dsp = hw_adapter->get_system_is_dual_dsp();
   s16 dsp_index = hw_adapter->get_dsp_index();
   hw_adapter->get_channel_num(&ana_input_num, &ana_output_num, &dante_input_num, &dante_output_num);
   hw_adapter->get_channel_num(&ana_input_num, &ana_output_num, &dante_input_num, &dante_output_num, &usb_input_num, &usb_output_num);
   input_num = ana_input_num + dante_input_num;
   output_num = ana_output_num + dante_output_num;
@@ -531,67 +669,40 @@
         if(pmodule->proc_type >= ModuleType::PROC_COUNT || pmodule->proc_type < ModuleType::PROC_NONE) {
            pmodule->proc_type = ModuleType::PROC_NONE;
         }
         update_dynmodule_tag(pmodule->proc_type, &iter);
//         if(iter.dsp_index == 0) {
//            s32 n = input_num;
//            s32 ninports = str_delim((const s8*)iter.inportstr, port_number);
//
//            //Consider PCM model&& PCM channel don't process.
//            if(dual_dsp == 0 && input_num >16){
//               n = ana_input_num;
//            }
//
//            if(ninports == 1 && port_number[0] >= n){
//               iter.proc_type = ModuleType::PROC_NONE;//便于解析场景过滤
//               //even though module not to process, but the pc has level offset.
//               if(port_number[0] >= input_num) {
//
//               }
//            }
//         }
//         else {
//            s32 n = output_num;
//            s32 ninports = str_delim(iter.inportstr, port_number);
//
//            if(dual_dsp == 0 && output_num >16){
//               n = ana_output_num;
//            }
//
//            if(ninports==1 && port_number[0] >= n){
//               iter.proc_type = ModuleType::PROC_NONE; //便于解析场景过滤
//               //even though module not to process, but the pc has level offset.
//               if(port_number[0] >= output_num) {
//
//               }
//            }
//         }
         update_dynmodule_tag(pmodule->proc_type, &iter);
      }
   }
   return 0;
}
uvoid* tgScene::get_module_param_ptr(uvoid *param, s32 fixed)
uvoid* tgScene::get_module_param_ptr(s32 mType, uvoid *param, s32 fixed)
{
   uvoid *ptr = param;
   if(fixed == 0){
      ptag_module pmod = (ptag_module)param;
      ptr = (void*)pmod->proc_ins;
      if (PROC_FIR == mType) {
         ptag_module_fir pmod = (ptag_module_fir)param;
         ptr = (void*)pmod->proc_ins;
      }
      else {
         ptag_module pmod = (ptag_module)param;
         ptr = (void*)pmod->proc_ins;
      }
   }
   return ptr;
}
u32 tgScene::get_module_id(u32 mid, s32 mtype , u32 pid)
{
   if(mtype == PROC_INPUT && (pid == INPUT_TYPE || pid == INPUT_FREQ || pid == INPUT_LEVEL)){
      mid = 300;
   }
   else if(mtype == PROC_DUCKER && pid == DUCKER_MIX){
      mid = mid + 320;
   }
   return mid;
}
//u32 tgScene::get_module_id(u32 mid, s32 mtype , u32 pid)
//{
//   if(mtype == PROC_INPUT && (pid == INPUT_TYPE || pid == INPUT_FREQ || pid == INPUT_LEVEL)){
//      mid = 300;
//   }
//   else if(mtype == PROC_DUCKER && pid == DUCKER_MIX){
//      mid = mid + 320;
//   }
//
//   return mid;
//}