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 Extended_PCM2WAY_Stop(uint32 type)
{        
	// Sal_PCMEx_Config_t cfg_t;
	// cfg_t.idle = false;//initialized

	
	ASSERT(type == pcmEx.app_type);  // start and stop should using same type


   /* the begining of configure the SAL */ 
	ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
	ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
               
   SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);
   SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);

   // cfg_t.swi = SAL_PCMEX_SWITCH_OFF;
   // cfg_t.type = SAL_PCMEX_TYPE_PNW;
   AM_PCM_EX_Off(type, (uint32)(&pcmEx));
   /* the end of configure the SAL */    
   
   L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_DL); 
   L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_UL); 
   L1Audio_ClearFlag( pcmEx.aud_id );
   L1Audio_FreeAudioID( pcmEx.aud_id );   
   pcmEx.pnw_dl_hdlr = pcmEx.pnw_ul_hdlr = NULL;
   pcmEx.state = 0;        
   pcmEx.bandInfo = PCMNWAY_BAND_INFO_UNSET;
   pcmEx.app_type = P2W_APP_TYPE_UNDEFINE;
   pcmEx.am_type  = AM_PCMEX_TYPE_UNDEF;   
   
   PCM2Way_SetFormat(P2W_FORMAT_NORMAL);
}
void PcmEx_Stop(void)
{
	
	ASSERT( PNW_STATE_RUN == pcmEx.state); 

	if(true == pcmEx.isEnhOn) {
		SetSpeechEnhancement(false);
	}

   /* the begining of configure the SAL */ 
	ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
	ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
               
   SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);
   SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);

   AM_PCM_EX_Off(pcmEx.am_type, (uint32)(&pcmEx));
   
   L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_DL); 
   L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_UL); 
	
   L1Audio_ClearFlag( pcmEx.aud_id );
   L1Audio_FreeAudioID( pcmEx.aud_id );   

	// set to default. 
   pcmEx.pnw_dl_hdlr = pcmEx.pnw_ul_hdlr = NULL;
	pcmEx.cfgUL1 = 0;
	pcmEx.cfgUL2 = 0;
	pcmEx.cfgUL3 = 0;
	pcmEx.cfgUL4 = 0;
	pcmEx.cfgDL = 0;

	// pcmEx.dspPcmExMicLen = 0; 
	// pcmEx.dspPcmExSpkLen = 0;

   pcmEx.bandInfo = PCMEX_BAND_UNSET;	
   pcmEx.am_type  = AM_PCMEX_TYPE_UNDEF;   
				
   pcmEx.state = PNW_STATE_IDLE;        
   
   
}
void DACA_Stop(DACA_APP_TYPE app_type)
{
	// Sal_PCMEx_Config_t cfg_t;

	// cfg_t.idle = false;//initialized

   ASSERT((dacaEx.app_type == app_type) && (dacaEx.state == DACA_STATE));   
  
    /* the begining of configure the SAL */  
   if(dacaEx.app_type & DACA_USE_UL){//either ready or off
   	ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY));
   }else{
   	ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF));
   }
   
   if(dacaEx.app_type & DACA_USE_DL){//either ready or off
		ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_RDY));
   }else{
		ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF));
   }

	SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF);
	SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_DACA, SAL_PCMEX_OFF);
	  
   // cfg_t.swi = SAL_PCMEX_SWITCH_OFF;
   // cfg_t.type = SAL_PCMEX_TYPE_DACA;
   AM_PCM_EX_Off(dacaEx.am_type, &dacaEx);    
    /* the end of configure the SAL */  
    
   L1Audio_UnhookHisrHandler(DP_D2C_DACA_REQ_DL); 
   L1Audio_UnhookHisrHandler(DP_D2C_DACA_REQ_UL); 

   L1Audio_ClearFlag( dacaEx.aud_daca_id );
   L1Audio_FreeAudioID( dacaEx.aud_daca_id );
   
   dacaEx.daca_dl_hdlr   = dacaEx.daca_ul_hdlr = NULL;
   dacaEx.state          = 0; 
   dacaEx.app_type       = DACA_APP_TYPE_UNDEFINE; 
   dacaEx.am_type        = 0xFFFF;      
}
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 */   
}