| | |
| | | |
| | | s16* data = (s16*)(ptr + 1); |
| | | |
| | | data_num = (data_num - sizeof(struct ParamCtrl))/sizeof(s16); |
| | | data_num = (data_num - sizeof(struct ParamCtrl)) / sizeof(s16); |
| | | // ptr->mid = var.pscene->get_module_id(ptr->mid, type, ptr->cmd) ; |
| | | // dbg_printf("mID:%d pID:%d val[0]:%d val[1]:%d\n",ptr->mid, ptr->cmd, data[0], data[1]); |
| | | tob->toCtrl(ptr->mid, ptr->cmd, data, data_num); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // section equal - ret:1 |
| | | // section not equal - ret:0 |
| | | bool decide_modu_type_equal(ptag_module pmodu, s16 dst_ch, s16 src_ch) |
| | | { |
| | | bool ret = 0; |
| | | if (pmodu[dst_ch].proc_type == pmodu[src_ch].proc_type) { |
| | | if (PROC_EQ == pmodu[dst_ch].proc_type) { |
| | | ptag_eq proc_eq = (ptag_eq)&pmodu[dst_ch].proc_ins; |
| | | u16 section_dst = proc_eq->nsection; |
| | | proc_eq = (ptag_eq)&pmodu[src_ch].proc_ins; |
| | | u16 section_src = proc_eq->nsection; |
| | | if (section_src == section_dst) |
| | | ret = 1; |
| | | } |
| | | else if (PROC_GEQ == pmodu[dst_ch].proc_type) { |
| | | ptag_geq proc_geq = (ptag_geq)&pmodu[dst_ch].proc_ins; |
| | | u16 section_dst = proc_geq->nsections; |
| | | proc_geq = (ptag_geq)&pmodu[src_ch].proc_ins; |
| | | u16 section_src = proc_geq->nsections; |
| | | if (section_src == section_dst) |
| | | ret = 1; |
| | | } |
| | | else |
| | | ret = 1; |
| | | } |
| | | return ret; |
| | | } |
| | | |
| | | s32 Message::ChannelParamCopy(MSG* pmag) |
| | | { |
| | | s32 len = 0; |
| | | ptag_ch_param_copy ch_copy = (ptag_ch_param_copy)pmag->data; |
| | | VarState& var = VarState::GetInstance(); |
| | | void* params_ptr = var.pscene->get_parameters(); |
| | | if (params_ptr == nullptr) { |
| | | return -1; |
| | | } |
| | | ptag_parameters params = static_cast<ptag_parameters>(params_ptr); |
| | | ToB* tob = ToB::GetInstance(); |
| | | param_ctrl_t* paramset = tob->GetParamCtrl(); |
| | | s32** chin_mid = var.pscene->get_chin_mid(); |
| | | s32** chout_mid = var.pscene->get_chout_mid(); |
| | | tg_param_ctrl_t paramctrl; |
| | | |
| | | s32 max_ch = ch_copy->bOutput ? var.pscene->get_output_num() : var.pscene->get_input_num(); |
| | | if (ch_copy->src_ch_index >= max_ch || ch_copy->dst_ch_index >= max_ch || ch_copy->src_ch_index < 0 || ch_copy->dst_ch_index < 0) { |
| | | dbg_printf("ch %s copy channel index error\n", ch_copy->bOutput ? "out" : "in"); |
| | | return false; |
| | | } |
| | | |
| | | if (!ch_copy->bOutput) { |
| | | memcpy(¶ms->input.input[ch_copy->dst_ch_index], ¶ms->input.input[ch_copy->src_ch_index], sizeof(params->input.input[0])); |
| | | IModule* m = tob->GetModule(chin_mid[ch_copy->dst_ch_index][0]); // [ch_idx][0] is the input type |
| | | ParamCtrl_fn paramEntry = paramset->GetParamEntry(PROC_INPUT); |
| | | paramEntry(m, (uvoid*)¶ms->input, len); |
| | | |
| | | ptag_module inmod_params[5] = {params->in1, params->in2, params->in3, params->in4, params->in5}; |
| | | for (s32 i = 0; i < 5; i++) { |
| | | if (paramctrl.decide_modu_type_equal(static_cast<ptag_module>(inmod_params[i]), ch_copy->dst_ch_index, ch_copy->src_ch_index)) { // 1 |
| | | memcpy(&inmod_params[i][ch_copy->dst_ch_index], &inmod_params[i][ch_copy->src_ch_index], sizeof(tag_module)); |
| | | } |
| | | else { |
| | | dbg_printf("ch dst module in%d type != src.\n", i+1); |
| | | continue; |
| | | } |
| | | |
| | | paramEntry = paramset->GetParamEntry(inmod_params[i][ch_copy->dst_ch_index].proc_type); |
| | | if(paramEntry == NULL) { |
| | | dbg_printf("paramEntry is NULL!\n"); |
| | | return -1; |
| | | } |
| | | m = tob->GetModule(chin_mid[ch_copy->dst_ch_index][i + 1]); |
| | | u32 result = paramEntry(m, (uvoid*)&inmod_params[i][ch_copy->dst_ch_index].proc_ins, len); |
| | | } |
| | | } |
| | | else { |
| | | memcpy(¶ms->output.output[ch_copy->dst_ch_index], ¶ms->output.output[ch_copy->src_ch_index], sizeof(params->output.output[0])); |
| | | IModule* m = tob->GetModule(chout_mid[ch_copy->dst_ch_index][0]); // [ch_idx][0] is the output type |
| | | ParamCtrl_fn paramEntry = paramset->GetParamEntry(PROC_OUTPUT); |
| | | paramEntry(m, (uvoid*)¶ms->output, len); |
| | | |
| | | ptag_module outmod_params[3] = {params->out1, params->out3, params->out4}; |
| | | for (s32 i = 0; i < 3; i++) { |
| | | if (paramctrl.decide_modu_type_equal(static_cast<ptag_module>(outmod_params[i]), ch_copy->dst_ch_index, ch_copy->src_ch_index)) { // 2 |
| | | memcpy(&outmod_params[i][ch_copy->dst_ch_index], &outmod_params[i][ch_copy->src_ch_index], sizeof(tag_module)); |
| | | } |
| | | else { |
| | | dbg_printf("ch dst module out%d type != src.\n", i+1); |
| | | continue; |
| | | } |
| | | |
| | | paramEntry = paramset->GetParamEntry(outmod_params[i][ch_copy->dst_ch_index].proc_type); |
| | | if(paramEntry == NULL) { |
| | | dbg_printf("paramEntry is NULL!\n"); |
| | | return -1; |
| | | } |
| | | m = tob->GetModule(chout_mid[ch_copy->dst_ch_index][(0==i) ? (i+1) : (i+2)]); |
| | | u32 result = paramEntry(m, (uvoid*)&outmod_params[i][ch_copy->dst_ch_index].proc_ins, len); |
| | | // printf("dst p adr:0x%x\n", (uvoid*)&outmod_params[i][ch_copy->dst_ch_index]); |
| | | } |
| | | |
| | | ptag_module_fir outmod2_param = params->out2; |
| | | if (paramctrl.decide_modu_type_equal(static_cast<ptag_module_fir>(outmod2_param), ch_copy->dst_ch_index, ch_copy->src_ch_index)) { // 3 |
| | | memcpy(&outmod2_param[ch_copy->dst_ch_index], &outmod2_param[ch_copy->src_ch_index], sizeof(tag_module_fir)); |
| | | } |
| | | else { |
| | | dbg_printf("ch dst module out2 type != src.\n"); |
| | | return -1; |
| | | } |
| | | |
| | | paramEntry = paramset->GetParamEntry(outmod2_param[ch_copy->dst_ch_index].proc_type); |
| | | if(paramEntry == NULL) { |
| | | dbg_printf("paramEntry is NULL!\n"); |
| | | return -1; |
| | | } |
| | | m = tob->GetModule(chout_mid[ch_copy->dst_ch_index][2]); |
| | | u32 result = paramEntry(m, (uvoid*)&outmod2_param[ch_copy->dst_ch_index].proc_ins, len); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | s32 Message::RxMessageHandler(MSG* pmsg) |
| | | { |
| | | extern ubool systemMute; |
| | | if(pmsg->magic != 0x5aa5) { |
| | | //dbg_printf("magic error.\n"); |
| | | // dbg_printf("magic error.\n"); |
| | | return -1; |
| | | } |
| | | |
| | |
| | | case MsgType::MSG_ACK_REQ: |
| | | HandshakeMessageProcess(pmsg); |
| | | break; |
| | | case MsgType::MSG_CHANNEL_COPY_REQ: |
| | | ChannelParamCopy(pmsg); |
| | | break; |
| | | default: |
| | | break; |
| | | } |