/* * audioproc.c * * Created on: 2021Äê11ÔÂ2ÈÕ * Author: graydon */ #include #include #include #include "tob.h" #include "crc.h" #include "config.h" #include "protocol_internal.h" #include "IModule.h" #include "f2f.h" #include "../drv/memory.h" //#define DEBUG #ifdef DEBUG #define dbg_printf printf #else #define dbg_printf #endif static ToB* tob = NULL; ToB* ToB::GetInstance() { return tob; } ToB::ToB(ubool dualDsp, u32 dspIndex ) : dual_dsp(dualDsp), dsp_index(dspIndex),mList(32) { if(tob != NULL) { delete tob; } tob = this; frames = NULL; processed = ufalse; mModuleNum =0; mModuleIndex.resize(0); paramset = new(SRAM_DDR) tg_param_ctrl_t(); } ToB::~ToB() { toClear(); tob = NULL; delete paramset; } uvoid ToB::SetMute(ubool mute) { processed = (mute==0); } ErrStatus ToB::toClear() { processed = ufalse; for (std::vector::iterator iter = mList.begin(); iter != mList.end() ;iter++) { delete *iter; } mList.clear(); mModuleIndex.clear(); if(frames != NULL) { delete frames; } mModuleNum = 0; return ErrStatus::SUCCESS; } IModule* ToB::CreateBaseModule(u32 moduleType, u16 tag ,u16 rxNum, u16 txNum) { ExportModules& em = ExportModules::Instance(); ModuleEntry* entry = em.GetModuleEntry(moduleType); if (entry) { Create create = entry->GetEntry(); if (create) { return create(tag, entry->link_enable , SAMPLE_RATE, SAMPLE_NUM, rxNum, txNum); } } return 0;//new IModule(SAMPLE_RATE, SAMPLE_NUM, rxNum, txNum); } ErrStatus ToB::CreateModule(const u8* bin, u32 nbytes) { FlowChartHead* head = (FlowChartHead*)bin; //dbg_printf("modules num %d, DSP1 Buffer %d,DSP2 Buffer %d.\n" // ,head->module_num,head->dsp1_buffer_num,head->dsp2_buffer_num); u32 size = sizeof(FlowChartHead); u32 nPhyInput =0 ,nPhyOutput=0; frames = new Frames(head->dsp_buffer_num[dsp_index]); do { Module* pmod = (Module*)(bin+ size); size += sizeof(Module); u16* mRxbufID = (u16*)(bin + size); size += pmod->mRxNum * sizeof(u16); u16* mTxbufID = (u16*)(bin + size); size += pmod->mTxNum * sizeof(u16); u16* mPhyID ; ubool bInput=ufalse,bOutput=ufalse; u16 input_num =0 ,output_num =0; if(pmod->mPhyModule == ModuleInterfaceType::PHY_INPUT){ pmod->mRxNum = pmod->mTxNum; mPhyID = (u16*)(bin + size); size += pmod->mTxNum * sizeof(u16); bInput = utrue; } else if(pmod->mPhyModule == ModuleInterfaceType::PHY_OUTPUT){ pmod->mTxNum = pmod->mRxNum ; mPhyID = (u16*)(bin + size); size += pmod->mRxNum * sizeof(u16); bOutput = utrue; } else { mPhyID = NULL; } if (pmod->mDsp != dsp_index) continue; #ifdef DEBUG dbg_printf("Module ID %d type %d rxnum %d txnum %d. \n",pmod->mID ,pmod->mType, pmod->mRxNum,pmod->mTxNum); #endif // if(pmod->mID == 394) { // int ddr = sram_free_space(SRAM_DDR); // int ccm = sram_free_space(SRAM_CCM); // int l1 = sram_free_space(SRAM_L1); // printf("ddr %d ccm %d l1 %d.\n",ddr, ccm ,l1); // } IModule* m = CreateBaseModule(pmod->mType,pmod->mTag, pmod->mRxNum,pmod->mTxNum); if(!m) { dbg_printf("Module ID Create fail.\n", pmod->mID); continue; } m->SetModuleInfo(pmod->mID ,pmod->mType,pmod->mTag); mList.push_back(m); if(pmod->mID >= mModuleIndex.size()) { mModuleIndex.resize(pmod->mID + 1, 0); } mModuleIndex[pmod->mID] = ++mModuleNum ; for (size_t i = 0; i < pmod->mTxNum && !bOutput; i++){ if (mTxbufID[i] > 0) { Frame* pcm = frames->GetFrame(mTxbufID[i]-1 ); m->SetOutputChannelDataPtr(i, pcm); if (bInput) { if(nPhyInput < mPhyID[i]) nPhyInput = mPhyID[i]; m->SetInputChannelDataPtr(i, pcm); SetRxChannelPtr(IntDataType::TDM , mPhyID[i]-1, pcm->Data()); } output_num ++; } else { m->SetOutputChannelDataPtr(i, 0); } } for (size_t i = 0; i < pmod->mRxNum && !bInput; i++) { if (mRxbufID[i] > 0) { Frame* pcm = frames->GetFrame(mRxbufID[i]-1 ); m->SetInputChannelDataPtr(i, pcm); if (bOutput) { if(nPhyOutput < mPhyID[i]) nPhyOutput = mPhyID[i]; pcm = frames->AllocFrame(); m->SetOutputChannelDataPtr(i, pcm); SetTxChannelPtr(IntDataType::TDM , mPhyID[i]-1, pcm->Data()); } input_num ++; } else { m->SetInputChannelDataPtr(i, 0); } } m->Init(); } while (size < nbytes); if (size != nbytes) { dbg_printf("check flowchart some error!\n"); } dbg_printf("Phy InputNum %d, Output Num %d\n",nPhyInput,nPhyOutput); SetNumOfChannels(IntDataType::TDM , nPhyInput, nPhyOutput); return ErrStatus::SUCCESS; } ErrStatus ToB::CreateModuleV1(const u8* bin, u32 nbytes) { FlowChartHead* head = (FlowChartHead*)bin; u32 size = sizeof(FlowChartHead); u16 nPhyInput[IntDataType::COUNT] = { 0,0,0 }, nPhyOutput[IntDataType::COUNT] = { 0,0,0 }; s32 len =0; frames = new Frames(head->dsp_buffer_num[dsp_index]); // C H G do { const Module* pmod = (Module*)(bin+ size); size += sizeof(Module); const u16* mRxbufID = (u16*)(bin + size); size += pmod->mRxNum * sizeof(u16); const u16* mTxbufID = (u16*)(bin + size); size += pmod->mTxNum * sizeof(u16); PhyPort* mPhyID ; ubool bInput=ufalse,bOutput=ufalse; u16 mRxNum = pmod->mRxNum, mTxNum = pmod->mTxNum; if(pmod->mPhyModule == ModuleInterfaceType::PHY_INPUT){ mRxNum = pmod->mTxNum; mPhyID = (PhyPort*)(bin + size); size += pmod->mTxNum * sizeof(PhyPort); bInput = utrue; } else if(pmod->mPhyModule == ModuleInterfaceType::PHY_OUTPUT){ mTxNum = pmod->mRxNum ; mPhyID = (PhyPort*)(bin + size); size += pmod->mRxNum * sizeof(PhyPort); bOutput = utrue; } else { mPhyID = NULL; } if (pmod->mDsp != dsp_index) continue; #ifdef DEBUG printf("Module ID %d type %d rxnum %d txnum %d tag %d. \n",pmod->mID ,pmod->mType, pmod->mRxNum,pmod->mTxNum,pmod->mTag); #endif IModule* m = CreateBaseModule(pmod->mType,pmod->mTag, mRxNum,mTxNum); if(!m) { dbg_printf("Module ID Create fail.\n", pmod->mID); continue; } m->SetModuleInfo(pmod->mID ,pmod->mType,pmod->mTag); mList.push_back(m); if(pmod->mID >= mModuleIndex.size()) { mModuleIndex.resize(pmod->mID + 1, 0); } mModuleIndex[pmod->mID] = ++mModuleNum ; // printf("Module id:%d, Tx buffer id:", pmod->mID); for (size_t i = 0; i < mTxNum && !bOutput; i++){ // printf("bid %d", mTxbufID[i]); if (mTxbufID[i] > 0) { Frame* pcm = frames->GetFrame(mTxbufID[i]-1 ); m->SetOutputChannelDataPtr(i, pcm); if (bInput && mPhyID[i].mIntType < IntDataType::COUNT) { if(nPhyInput[mPhyID[i].mIntType] < mPhyID[i].mPhyID) nPhyInput[mPhyID[i].mIntType] = mPhyID[i].mPhyID; m->SetInputChannelDataPtr(i, pcm); SetRxChannelPtr(static_cast(mPhyID[i].mIntType), mPhyID[i].mPhyID-1, pcm->Data()); // printf("phy_id %d", mPhyID[i].mPhyID); } } else { m->SetOutputChannelDataPtr(i, 0); } } // printf(";Rx buffer id:"); for (size_t i = 0; i < mRxNum && !bInput; i++) { // printf("bid %d", mRxbufID[i]); if (mRxbufID[i] > 0) { Frame* pcm = frames->GetFrame(mRxbufID[i]-1 ); m->SetInputChannelDataPtr(i, pcm); if (bOutput && mPhyID[i].mIntType < IntDataType::COUNT) { if(nPhyOutput[mPhyID[i].mIntType] < mPhyID[i].mPhyID) nPhyOutput[mPhyID[i].mIntType] = mPhyID[i].mPhyID; pcm = frames->AllocFrame(); m->SetOutputChannelDataPtr(i, pcm); SetTxChannelPtr(static_cast(mPhyID[i].mIntType), mPhyID[i].mPhyID-1, pcm->Data()); // printf("phy_id %d", mPhyID[i].mPhyID); } } else { m->SetInputChannelDataPtr(i, 0); } } // printf("\n"); m->Init(); //paramset->GetParamEntry(m->GetModuleType())(m, (uvoid*)pmod->mParamaddr, len); } while (size < nbytes); if (size != nbytes) { dbg_printf("check flowchart some error!\n"); } for(s32 i =0 ;i < IntDataType::COUNT;i++){ SetNumOfChannels(static_cast(i) , nPhyInput[i], nPhyOutput[i]); } /*for (auto pt = mList.begin(); pt < mList.end(); pt++) { IModule *p = *pt._Myptr; static int i = 0; printf("%d, id %d, type %d\n",i++, p->GetModuleID(), p->GetModuleType()); }*/ return ErrStatus::SUCCESS; } ErrStatus ToB::toAnalysis(const u8* bin, u32 nbytes) { FlowChartHead* head = (FlowChartHead*)bin; ErrStatus ret = ErrStatus::ERR_METHOD; //check crc s32 tmp_crc; s32 crc = head->crc; head->crc = 0; tmp_crc = CRC::crc32(bin, nbytes); if (tmp_crc != crc) { printf("flowchar crc check fail.\n"); return ErrStatus::ERR_PARAM; } processed = ufalse; if(head->version == 0) { ret = CreateModule(bin, nbytes); } else if(head->version == 1) { ret = CreateModuleV1(bin, nbytes); } processed = utrue; return ret; } ErrStatus ToB::toProc() { if(processed) { for (auto iter = mList.begin(); iter < mList.end(); iter++) { // if ((*iter)->GetModuleID() == 166) // continue; if((*iter)->GetModuleType() <= 5) { printf("%d ", (*iter)->GetModuleID()); (*iter)->Proc(); } } // printf("\n"); } else { MuteOutput(); } return ErrStatus::SUCCESS; } u32 ToB::GetModuleType(u32 mID) { if(mID >= mModuleIndex.size() || mModuleIndex[mID] == 0) { return ErrStatus::ERR_PARAM; } IModule* m = mList[mModuleIndex[mID]-1]; if( m != NULL) { return m->GetModuleType(); } return 0; } ErrStatus ToB::toCtrl(u32 mID, u32 pID, const s16* val, u32 num) { if(mID >= mModuleIndex.size() || mModuleIndex[mID] == 0) { return ErrStatus::ERR_PARAM; } IModule* m = mList[mModuleIndex[mID]-1]; if( m != NULL) { //m->Ctrl(pID, val, num); paramset->GetCtrlEntry(m->GetModuleType())(m, pID, (s16*)val); } return ErrStatus::SUCCESS; } ErrStatus ToB::toCtrl(const u8* bin , u32 nbytes) { FlowChartHead* head = (FlowChartHead*)bin; //check crc u32 tmp_crc ,crc = head->crc; head->crc =0; tmp_crc = CRC::crc32(bin, nbytes); if (tmp_crc != crc) { dbg_printf("flowchar crc check fail.\n"); return ErrStatus::ERR_PARAM; } u32 size = sizeof(FlowChartHead); while(size < nbytes) { Param* h = (Param*)(bin+size); size += sizeof(Param); const s16* val = (const s16*)(bin+size); toCtrl(h->mID, h->pID, val, h->num); size += h->num*sizeof(s16); } if(size != nbytes) { dbg_printf("check preset has some error!\n"); } processed = utrue; return ErrStatus::SUCCESS; } u32 ToB::GetLevels(s16* buffer) { u32 n =0,size =0; if( !processed ) { return 0; } for (std::vector::iterator iter = mList.begin(); iter != mList.end() ; iter++) { size = (*iter)->GetLevel(buffer + n ); n += size; } return n; }