void Del_PcmEx_Start(void (*pcmNway_dl_hdlr)(void), void (*pcmNway_ul_hdlr)(void), uint32 cfgUL1, uint32 cfgUL2, uint32 cfgUL3, uint32 cfgUL4, uint32 cfgDL) { uint32 I; kal_bool flag; // prevent re-entry!! ASSERT(PNW_STATE_IDLE == pcmEx.state); pcmEx.aud_id = L1Audio_GetAudioID(); L1Audio_SetFlag( pcmEx.aud_id ); /*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/ // band and am type setting pcmEx.bandInfo = PCMEX_BAND_DYNAMIC; pcmEx.am_type = AM_PCMEX_TYPE_DEDICATION; // pcmEx.dspPcmExMicLen = 0; // pcmEx.dspPcmExSpkLen = 0; pcmEx.cfgUL1 = cfgUL1; pcmEx.cfgUL2 = cfgUL2; pcmEx.cfgUL3 = cfgUL3; pcmEx.cfgUL4 = cfgUL4; pcmEx.cfgDL = cfgDL; pcmEx.pnw_dl_hdlr = pcmNway_dl_hdlr; pcmEx.pnw_ul_hdlr = pcmNway_ul_hdlr; L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0); // check DSP state and turn on ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF)); AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); // wait for ready for(I = 0; ;I ++){ kal_bool is_ready = true; if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if( (pcmEx.cfgUL1 & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if(is_ready) break; #ifndef L1D_TEST ASSERT(I < 22); // wait 200ms kal_sleep_task(2); #endif } pcmEx.state = PNW_STATE_RUN; /* the end of configure the SAL */ }
void PCM2WAY_Start(void (*pcm2way_hdlr)(void), uint32 type) { uint32 I; ASSERT(type==1 || type==2); AM_PCM_EX_On(type); ASSERT(DP_PCM_EX_CTRL == 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX, (L1Audio_EventHandler)pcmEx_hisrHdlr, 0); pcmEx.hdlr = pcm2way_hdlr; pcmEx.state = PCM2WAY_STATE; DP_PCM_EX_CTRL = 0x110; for(I = 0; ;I ++) { if(DP_PCM_EX_CTRL == 0x120) break; ASSERT(I < 22); // wait 200ms kal_sleep_task(2); } }
void PCM4WAY_Start(void (*pcm4way_hdlr)(void), uint32 type) { uint32 I; AM_PCM_EX_On(type); ASSERT(DP_PCM_EX_CTRL == 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX,(L1Audio_EventHandler)pcmEx_hisrHdlr, 0); pcmEx.hdlr = pcm4way_hdlr; pcmEx.state = PCM4WAY_STATE; DP_PCM_EX_CTRL = 0x101; for(I = 0; ;I ++) { if(DP_PCM_EX_CTRL == 0x102) break; #ifndef L1D_TEST ASSERT(I < 22); // wait 200ms kal_sleep_task(2); #endif } }
void DACA_Start(void (*daca_dl_hdlr)(void), void (*daca_ul_hdlr)(void), DACA_APP_TYPE app_type) { uint32 I; //Sal_PCMEx_Config_t cfg_t; //cfg_t.idle = false;//initialized; dacaEx.aud_daca_id = L1Audio_GetAudioID(); L1Audio_SetFlag( dacaEx.aud_daca_id ); L1Audio_HookHisrHandler(DP_D2C_DACA_REQ_DL,(L1Audio_EventHandler)Daca_hisrDlHdlr, 0); L1Audio_HookHisrHandler(DP_D2C_DACA_REQ_UL,(L1Audio_EventHandler)Daca_hisrUlHdlr, 0); dacaEx.daca_dl_hdlr = daca_dl_hdlr; dacaEx.daca_ul_hdlr = daca_ul_hdlr; dacaEx.app_type = app_type; if(app_type & DACA_IN_PHONE_CALL){ dacaEx.am_type = AM_PCMEX_TYPE_DACA_DEDICATION; }else{ dacaEx.am_type = AM_PCMEX_TYPE_DACA_IDLE_WO_ENH; } if(app_type & DACA_USE_NB){ dacaEx.frame_size = 160;//PCMNWAY_BAND_INFO_NB; // cfg_t.band = SAL_PCM_NARROWBAND; }else{ dacaEx.frame_size = 320;//PCMNWAY_BAND_INFO_WB; // cfg_t.band = SAL_PCM_WIDEBAND; } /* the begining of configure the SAL */ if(app_type & DACA_USE_UL){ SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_ON); } if(app_type & DACA_USE_DL){ SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_ON); } //cfg_t.swi = SAL_PCMEX_SWITCH_ON; //cfg_t.type = SAL_PCMEX_TYPE_DACA; //cfg_t.band = (app_type & DACA_USE_NB) ? SAL_PCM_NARROWBAND : SAL_PCM_WIDEBAND; AM_PCM_EX_On(dacaEx.am_type, &dacaEx); for(dacaEx.state = DACA_STATE, I = 0; ;I ++){ kal_bool is_ready = true; if((dacaEx.app_type & DACA_USE_UL) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY))) is_ready = false; if((dacaEx.app_type & DACA_USE_DL) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY))) is_ready = false; if(is_ready) break; ASSERT(I < 22); // wait 200ms kal_sleep_task(2); } /* the end of configure the SAL */ }
/** @pcmNway_dl_hdlr @pcmNway_ul_hdlr: */ void Idle_PcmEx_Start(void (*pcmNway_dl_hdlr)(void), void (*pcmNway_ul_hdlr)(void), uint32 cfgUL1, uint32 cfgUL2, uint32 cfgUL3, uint32 cfgUL4, uint32 cfgDL, PCMEX_BAND band, PCMEX_IDLE_ENH_SETTING enhSetting) { uint32 I; kal_bool flag; // prevent re-entry!! ASSERT(PNW_STATE_IDLE == pcmEx.state); pcmEx.aud_id = L1Audio_GetAudioID(); L1Audio_SetFlag( pcmEx.aud_id ); /*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/ // band and am type setting pcmEx.bandInfo = band; switch(band){ case PCMEX_BAND_NB: { ASSERT(enhSetting != PCMEX_IDLE_ENH_SETTING_NONE); if(PCMEX_IDLE_ENH_SETTING_DMNR_REC_ONLY_CAL == enhSetting) { // pcmEx.dspPcmExMicLen = 322; //160*2+2 samples(word) // pcmEx.dspPcmExSpkLen = -1; pcmEx.am_type = AM_PCMEX_TYPE_REC_ONLY_CAL; } else if (PCMEX_IDLE_ENH_SETTING_DMNR_CAL == enhSetting) { // pcmEx.dspPcmExMicLen = 322; //160*2+2 samples(word) // pcmEx.dspPcmExSpkLen = 160; pcmEx.am_type = AM_PCMEX_TYPE_REC_PLAY_CAL; } else { // pcmEx.dspPcmExMicLen = 160; // pcmEx.dspPcmExSpkLen = 160; pcmEx.am_type = AM_PCMEX_TYPE_IDLE; } } break; case PCMEX_BAND_WB: { ASSERT(enhSetting != PCMEX_IDLE_ENH_SETTING_NONE); if(PCMEX_IDLE_ENH_SETTING_DMNR_REC_ONLY_CAL == enhSetting) { // pcmEx.dspPcmExMicLen = 642; //320*2+2 samples(word) // pcmEx.dspPcmExSpkLen = -1; pcmEx.am_type = AM_PCMEX_TYPE_REC_ONLY_CAL; } else if (PCMEX_IDLE_ENH_SETTING_DMNR_CAL == enhSetting) { // pcmEx.dspPcmExMicLen = 642; //320*2+2 samples(word) // pcmEx.dspPcmExSpkLen = 160; pcmEx.am_type = AM_PCMEX_TYPE_REC_PLAY_CAL; } else { // pcmEx.dspPcmExMicLen = 320; // pcmEx.dspPcmExSpkLen = 320; pcmEx.am_type = AM_PCMEX_TYPE_IDLE; } } break; default: // include PCMEX_BAND_DYNAMIC and PCMEX_BAND_UNSET cases ASSERT(0); } pcmEx.cfgUL1 = cfgUL1; pcmEx.cfgUL2 = cfgUL2; pcmEx.cfgUL3 = cfgUL3; pcmEx.cfgUL4 = cfgUL4; pcmEx.cfgDL = cfgDL; pcmEx.pnw_dl_hdlr = pcmNway_dl_hdlr; pcmEx.pnw_ul_hdlr = pcmNway_ul_hdlr; L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0); // check DSP state and turn on ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF)); AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); // wait for ready for(I = 0; ;I ++){ kal_bool is_ready = true; if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if( (pcmEx.cfgUL1 & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if(is_ready) break; #ifndef L1D_TEST ASSERT(I < 22); // wait 200ms kal_sleep_task(2); #endif } pcmEx.state = PNW_STATE_RUN; if(PCMEX_IDLE_ENH_SETTING_WITH == enhSetting) { pcmEx.isEnhOn = true; SetSpeechEnhancement(true); } /* the end of configure the SAL */ }
/** @type: please refer to P2W_App_Type. 0 for pcm4way CTM, 1 for pcm2way Voice, 2 for pcm2way Voip, 3 for pcm2Way record only(calibration used), 4 for pcm2Way record&playback(calibration used) */ void Extended_PCM2WAY_Start(void (*pcm2way_dl_hdlr)(void), void (*pcm2way_ul_hdlr)(void), uint32 type, uint32 cfgUL, uint32 cfgDL) { uint32 I; kal_bool flag; // Sal_PCMEx_Config_t cfg_t; // cfg_t.idle = false;//initialized pcmEx.aud_id = L1Audio_GetAudioID(); L1Audio_SetFlag( pcmEx.aud_id ); /*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/ // for band infomation checking, user should usd PCM2Way_SetFormat() to set format before pcm2way start ASSERT(pcmEx.bandInfo != PCMNWAY_BAND_INFO_UNSET ); pcmEx.app_type = type; // TODO: flag = true; //this flag is used to choose one among multiple options switch (type) { // type checking and pcm2way application type mapping to am type //group1 has the similar settings case P2W_APP_TYPE_UNDER_CALL: if(flag){pcmEx.am_type = AM_PCMEX_TYPE_DEDICATION;flag=false;} case P2W_APP_TYPE_WITHOUT_CALL: if(flag){pcmEx.am_type = AM_PCMEX_TYPE_IDLE_WO_ENH;flag=false;} case P2W_APP_TYPE_VOIP: if(flag){pcmEx.am_type = AM_PCMEX_TYPE_IDLE;flag=false;} if(PCMNWAY_BAND_INFO_WB == PCM2Way_GetBandInfo()){ PCM2WAY_QueryBufSize(P2W_FORMAT_WB_NORMAL, &(pcmEx.u4DspPcmExMicLen), &(pcmEx.u4DspPcmExSpkLen)); } else { PCM2WAY_QueryBufSize(P2W_FORMAT_NORMAL, &(pcmEx.u4DspPcmExMicLen), &(pcmEx.u4DspPcmExSpkLen)); } break; #if defined(__DUAL_MIC_SUPPORT__) || defined(__SMART_PHONE_MODEM__) //group2 has the similar settings case P2W_APP_TYPE_REC_ONLY_CAL: if(flag){pcmEx.am_type = AM_PCMEX_TYPE_REC_ONLY_CAL;flag=false;} case P2W_APP_TYPE_REC_PLAY_CAL: if(flag){pcmEx.am_type = AM_PCMEX_TYPE_REC_PLAY_CAL;flag=false;} if(PCMNWAY_BAND_INFO_NB == PCM2Way_GetBandInfo()){ PCM2WAY_QueryBufSize(P2W_FORMAT_CAL, &(pcmEx.u4DspPcmExMicLen), &(pcmEx.u4DspPcmExSpkLen)); } else if(PCMNWAY_BAND_INFO_WB == PCM2Way_GetBandInfo()){ PCM2WAY_QueryBufSize(P2W_FORMAT_WB_CAL, &(pcmEx.u4DspPcmExMicLen), &(pcmEx.u4DspPcmExSpkLen)); } else { ASSERT(0); // calibration does NOT support dynamic band setting } pcmEx.u4DspPcmExMicLen -= 2; //AGC is put in the sherif instead of buffer break; #endif //__DUAL_MIC_SUPPORT__ || defined(__SMART_PHONE_MODEM__) default: ASSERT(0); } ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF)); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0); pcmEx.pnw_dl_hdlr = pcm2way_dl_hdlr; pcmEx.pnw_ul_hdlr = pcm2way_ul_hdlr; pcmEx.state = PCM2WAY_STATE; pcmEx.cfgUL = cfgUL; pcmEx.cfgDL = cfgDL; /* the begining of configure the SAL */ /* the following is the same as the pcm4way. In the future, it'll be merged together */ /* cfg_t.D2M_ul = cfg_t.M2D_ul = cfg_t.afterEnh_ul = cfg_t.D2M_dl = cfg_t.M2D_dl = cfg_t.afterEnh_dl = false; if(cfgUL & USE_D2M_PATH){ cfg_t.D2M_ul = true; } if(cfgUL & USE_M2D_PATH){ cfg_t.M2D_ul = true; } if(cfgUL & DATA_SELECT_AFTER_ENH){ cfg_t.afterEnh_ul = true; } if(cfgDL & USE_D2M_PATH){ cfg_t.D2M_dl = true; } if(cfgDL & USE_M2D_PATH){ cfg_t.M2D_dl = true; } if(cfgDL & DATA_SELECT_AFTER_ENH){ cfg_t.afterEnh_dl = true; } cfg_t.swi = SAL_PCMEX_SWITCH_ON; cfg_t.type = SAL_PCMEX_TYPE_PNW; if(AM_IsSpeechOn()){ cfg_t.band = SAL_PCM_DYNAMIC; }else{ if(pcmEx.bandInfo == PCMNWAY_BAND_INFO_WB){ cfg_t.band = SAL_PCM_WIDEBAND; }else if (pcmEx.bandInfo == PCMNWAY_BAND_INFO_NB){ cfg_t.band = SAL_PCM_NARROWBAND; }else{ // should never been here ASSERT(0); } } */ AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); for(I = 0; ;I ++){ kal_bool is_ready = true; if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if( (pcmEx.cfgUL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if(is_ready) break; #ifndef L1D_TEST ASSERT(I < 22); // wait 200ms kal_sleep_task(2); #endif } /* the end of configure the SAL */ }
void Extended_PCM4WAY_Start(void (*pcm4way_dl_hdlr)(void), void (*pcm4way_ul_hdlr)(void), uint32 type, uint32 cfgUL, uint32 cfgDL) { uint32 I; pcmEx.aud_id = L1Audio_GetAudioID(); L1Audio_SetFlag( pcmEx.aud_id ); // mapping the pcm4way applicatoin type to am type, and setup the band informtion. pcmEx.app_type = type; switch (type) { case P4W_APP_CTM: case P4W_APP_TYPE_UNDER_CALL: pcmEx.am_type = AM_PCMEX_TYPE_DEDICATION; pcmEx.bandInfo = PCMNWAY_BAND_INFO_DYNAMIC; break; case P4W_APP_TYPE_WITHOUT_CALL: pcmEx.am_type = AM_PCMEX_TYPE_IDLE_WO_ENH; pcmEx.bandInfo = PCMNWAY_BAND_INFO_NB; break; } ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF)); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0); L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0); pcmEx.pnw_dl_hdlr = pcm4way_dl_hdlr; pcmEx.pnw_ul_hdlr = pcm4way_ul_hdlr; pcmEx.state = PCM4WAY_STATE; pcmEx.cfgDL = cfgDL; pcmEx.cfgUL = cfgUL; /* the begining of configure the SAL */ /* cfg_t.D2M_ul = cfg_t.M2D_ul = cfg_t.afterEnh_ul = cfg_t.D2M_dl = cfg_t.M2D_dl = cfg_t.afterEnh_dl = false; if(cfgUL & USE_D2M_PATH){ cfg_t.D2M_ul = true; } if(cfgUL & USE_M2D_PATH){ cfg_t.M2D_ul = true; } if(cfgUL & DATA_SELECT_AFTER_ENH){ cfg_t.afterEnh_ul = true; } if(cfgDL & USE_D2M_PATH){ cfg_t.D2M_dl = true; } if(cfgDL & USE_M2D_PATH){ cfg_t.M2D_dl = true; } if(cfgDL & DATA_SELECT_AFTER_ENH){ cfg_t.afterEnh_dl = true; } cfg_t.swi = SAL_PCMEX_SWITCH_ON; cfg_t.type = SAL_PCMEX_TYPE_PNW; */ AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON); for(I = 0; ;I ++){ kal_bool is_ready = true; if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if( (pcmEx.cfgUL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY))) is_ready &= false; if(is_ready) break; #ifndef L1D_TEST ASSERT(I < 22); // wait 200ms kal_sleep_task(2); #endif } /* the end of configure the SAL */ }