/* ========================================================================= */
void AFE_Chip_Event_Handler( void *data )
{
	kal_int16 v_lowest, a_lowest;

#if ( defined( __CENTRALIZED_SLEEP_MANAGER__ )&& defined( MTK_SLEEP_ENABLE ))
	//Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag
	// because the event will happen whenever AP call related function 
	L1Audio_SetFlag( afe.aud_id );
#endif 

	SearchPathWorkingFlag(&v_lowest, &a_lowest);
	_digitOnly_update_digital_gain(v_lowest, a_lowest);

	// mic digital gain related
	/* no hw mute exit, so remove it
	if(afe.mic_mute){ 
		// AM_DSP_SetSpeechUplinkSwAgcGain(); AM_DSP_SetSpeechUplinkDigitalGain(0);
	}else {
	*/
	if(AM_IsBluetoothOn()) { // for the case of bluetooth use
		AM_DSP_SetSpeechUplinkSwAgcGain(0); // make agc gain as 0 under bt mode
	} else {
		AM_DSP_SetSpeechUplinkSwAgcGain(afe.digitOnly_mic_volume);
	}
	/*
	}
	*/

#if ( defined( __CENTRALIZED_SLEEP_MANAGER__ )&& defined( MTK_SLEEP_ENABLE ))
	L1Audio_ClearFlag( afe.aud_id );
#endif

}
예제 #2
0
/* ========================================================================= */
void SPE_CustomProcess_Off()
{
   if(spe_custom->state != SPE_STATE_WORKING)
      return;
   spe_custom->state = SPE_STATE_IDLE;
#if 1
   PCM4WAY_Stop(0);
#else
/* under construction !*/
#endif 
#if defined(__INTERNAL_SPE_ENGINE__)
   ENH_API_Free();
#elif defined( __VOICE_CHANGER_SUPPORT__ )
   VCHG_Close();
   if(VCHIsDcmLoad)
   {      	
      DCM_Unload(DYNAMIC_CODE_COMPRESS_VCH);
      VCHIsDcmLoad = KAL_FALSE;
   }
   kal_trace( TRACE_GROUP_AUD_SPE_CSUT, SPEECH_VCH_PROCESS, 0, VCHIsDcmLoad);  
#endif  
   L1Audio_ClearFlag(spe_custom->aud_id); 
   L1Audio_FreeAudioID(spe_custom->aud_id);
   if(spe_custom->working_buffer != NULL)
      audio_free_mem((void **)&(spe_custom->working_buffer));   
   audio_free_mem((void **)&spe_custom);
   spe_custom = NULL;
}
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);
}
예제 #4
0
파일: gmi.c 프로젝트: 12019/mtktest
static void gmiHandler( void *data )     /* This function works in L1Audio Task */
{
   GMI_Event event = (GMI_Event)(int32)data;
   
   if( event == GMI_END ) {
      L1Audio_ClearFlag( gmi.aud_id );   
      gmi.gmi_handler( GMI_END );
   }
   else if( event == GMI_NOTE_REQUEST ) {
      gmi.gmi_handler( GMI_NOTE_REQUEST );            
   }
}
static void dtmf_mcu_Destroy(kal_uint32 arg1, void* arg2)
{
   
   kal_bool fIsAudioRunning = false;//PcmSink_IsAudioRuning() || PcmSink_IsMixerRuning();   
   kal_trace( TRACE_GROUP_AUD_PLAYBACK, MCU_DTMF_DESTROY, DTMF_SW.pHandle, DTMF_SW.fNewDTMF, DTMF_SW.fEnding, DTMF_SW.fForceStop);
   if(DTMF_SW.pHandle == NULL)
   {
      return;
   }
   if((DTMF_SW.fNewDTMF == KAL_FALSE && DTMF_SW.fEnding == KAL_TRUE) || DTMF_SW.fForceStop)
   {
      {
         {
//            void AM_SWToneOff( void );
//            AM_SWToneOff();
         }   
      }
      DTMF_SW.pHandle = NULL;
      L1Audio_ClearFlag( DTMF_SW.uAudId);
      L1Audio_FreeAudioID(DTMF_SW.uAudId);
      audio_free_mem( (void **) &DTMF_SW.RingBuffer.rb_base);//
      DTMF_SW.RingBuffer.rb_base = NULL;
      if(fIsAudioRunning)
      {
////!    PcmSink_Mute(KAL_TRUE, PCMSINK_MUTE_TONE);
         kal_sleep_task(uDtmfMuteLength3);
      }
      if(DTMF_SW.fIsKeytonePlaying)
      {
////!         PcmSink_StopSound(PCM_FUNC_KEYTONE);
      }
      else if(DTMF_SW.fIsTonePlaying)
      {
////!         PcmSink_StopSound(PCM_FUNC_TONE);
      }
      else
      {
         ASSERT(0);
      }
      memset(&DTMF_SW, 0, sizeof(DTMF_SW));
      if(fIsAudioRunning)
      {
         kal_sleep_task(uDtmfMuteLength4);
      }
////!      PcmSink_DepopUnMute( NULL );
////!      PcmSink_Mute(KAL_FALSE, PCMSINK_MUTE_TONE);
   }
}
static void ktStop_nonblocking( void *data )
{
   if (keytone.state == TONE_STATE_NONE)
      return;

   if( !L1Audio_CheckFlag( keytone.aud_id ) )
      return;

   keytone.isReentrance = true;

   if (keytone.state == TONE_STATE_INIT) {
      L1Audio_InProcCall( ktStopInMedTask, keytone.seqNum, 0 );
      kal_sleep_task( 2 );
   }
   
   if (keytone.state == TONE_STATE_PLAY) {
      keytone.state = TONE_STATE_STOP;
      L1Audio_PutMessageAndWait(MSG_L1AUDIO2FAS_AUDIO_PLAYBACK_OFF, keytone.fc_aud_id, 0, false);
   }
   
   if (keytone.state == TONE_STATE_STOP) {
      L1Audio_InProcCall( ktStopInMedTask, keytone.seqNum, 0 );
      kal_sleep_task( 2 );
      return;
   }
   
   if (keytone.state == TONE_STATE_IDLE) {
      keytone.state = TONE_STATE_UNHOOKING;
      L1Audio_FC_UnHookHandler_WithoutWaitingSend(keytone.fc_aud_id, 0);
   }
   
   if (keytone.state == TONE_STATE_UNHOOKING) {
      L1Audio_InProcCall( ktStopInMedTask, keytone.seqNum, 0 );
      kal_sleep_task( 2 );
      return;
   }
   
   if (keytone.state == TONE_STATE_UNHOOKED) {
      keytone.state = TONE_STATE_NONE;
      L1Audio_FC_UnHookHandler_WithoutWaitingClear(keytone.fc_aud_id, 0);
      keytone.fc_aud_id = 0xFFFF;
   }
   
   AM_KeyToneOff();
   L1Audio_ClearFlag( keytone.aud_id );
   
   keytone.seqNum++;
}
static void toneStop( void *data )
{
   if (tone.state == TONE_STATE_NONE)
      return;

   if( !L1Audio_CheckFlag( tone.aud_id ) )
      return;

   if (tone.isReentrance)
      return;
   else
      tone.isReentrance = true;

   tone.bQTMF = false;
   
   if (tone.state == TONE_STATE_INIT) {
      int I;
      
      for (I = 0; ; I++) {
         if (tone.state != TONE_STATE_INIT)
            break;
         
         ASSERT_REBOOT( I < 20 );
         kal_sleep_task( 2 );
      }
   }
   
   if (tone.state == TONE_STATE_PLAY) {
      tone.state = TONE_STATE_STOP;
      tone.isWait = true;
      L1Audio_FC_TonePlaybackOff(tone.fc_aud_id);
      tone.isWait = false;
      tone.state = TONE_STATE_IDLE;
   }
   
   if (tone.state == TONE_STATE_IDLE) {
      tone.state = TONE_STATE_NONE;
      L1Audio_FC_UnHookHandler(tone.fc_aud_id, 0);
      tone.fc_aud_id = 0xFFFF;
   }
   
   AM_ToneOff();
   AFE_TurnOffSpeaker( L1SP_TONE );
   L1Audio_ClearFlag( tone.aud_id );
   tone.seqNum++;
   L1Audio_SetEvent( tone.aud_id, 0 );
}
예제 #8
0
파일: gmi.c 프로젝트: 12019/mtktest
/*****************************************************************************
* FUNCTION
*  GMI_Stop
* DESCRIPTION
*   This function is used to stop melody playing.
*****************************************************************************/
void GMI_Stop( void )
{
   int16 I;
   if( !L1Audio_CheckFlag( gmi.aud_id ) )
      return;

   if( gmi.state == GMI_STATE_IDLE )
      return;

   GPTI_StopItem( gmi.gpt );

   QTMF_CONTROL = 0;
   for( I = 0; I < MAX_DPRAM_BUFFER; I++ )
      QTMF_DURA(I) = 0;
   AM_MelodyOff();
   gmi.state = GMI_STATE_IDLE;

   L1Audio_ClearFlag( gmi.aud_id );
}
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;        
   
   
}
예제 #10
0
void BGSND_Close(void)
{
	
	L1Audio_ClearFlag( bgSnd.aud_id );

#ifdef DSP_BGS_UP_DOWN_INT_SEPERATE
	L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL);  
	L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_UL);  
#else
	L1Audio_UnhookHisrHandler(D2C_SOUND_EFFECT_INT_ID_DL);
#endif 

	// reset the pointer
	bgSnd.pBuf = NULL;
	bgSnd.bufSize = 0;
	bgSnd.bgSnd_hisrHandler = NULL;	


	bgSnd.state = BGSND_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;      
}
예제 #12
0
void AVB_Close()
{
   kal_uint16 uSampleRate; 
   kal_uint8  uChannelNumber; 
   kal_trace( TRACE_GROUP_SCO, L1AUDIO_AVB_CLOSE, AVB.uState);
   PcmSink_StopBT(PCMSINK_BT_SCO);
   if(AVB.uState == AVB_STATE_IDLE)
   {
      return;
   }
   L1Audio_UnhookHisrHandler(D2C_AUDIO_VIA_8KBT_ID);
   L1Audio_ClearFlag( AVB.uAudID ); //enable sleep mode     
   L1Audio_FreeAudioID(AVB.uAudID);
   AVB.uState = AVB_STATE_IDLE;
   audio_free_mem( (void **) &AVB.pBuffer);
   BLI_Close(AVB.pBuffer, audio_free_ext_mem_simplified);
   uSampleRate = AVB.uSampleRate; 
   uChannelNumber = AVB.uChannelNumber; 
   memset(&AVB, 0, sizeof(AVB));
   AVB.uSampleRate = uSampleRate;
   AVB.uChannelNumber = uChannelNumber;
}
// under MED Task, triggered by the EXT_HISR when UL/DL buffer flushes completely.
// Even if many src would like to close DSP BGSND, we don't think about the race condition since the request of closing is processed by MED's queue.
void EXT_BGSND_Close(uint32 id) 
{
   kal_prompt_trace(MOD_L1SP, "[EXT_BGSND_Close] Enter");     
   ASSERT(Ext_BGSnd.is_used[id]);
   EXT_BGSND_SRC_T *pSrc = &Ext_BGSnd.src[id]; 
      
   ASSERT(EXT_SRC_STATE_FLUSHING_OVER==pSrc->state[BGSND_DL_PROCESS]);
   ASSERT(EXT_SRC_STATE_FLUSHING_OVER==pSrc->state[BGSND_UL_PROCESS]);
   kal_prompt_trace(MOD_L1SP, "[EXT_BGSND_Close] selected_src_id=%d num_src_used=%d", id,  Ext_BGSnd.num_src_used);
    
   {  //flush buffer first, and then close it   // buffer reset
   	memset(pSrc, 0, sizeof(EXT_BGSND_SRC_T));
   	Ext_BGSnd.is_used[id] = false;   	
   	Ext_BGSnd.num_src_used--;  
   }
   
   if( 0 == Ext_BGSnd.num_src_used){ 
      pSrc->state[BGSND_DL_PROCESS] = pSrc->state[BGSND_UL_PROCESS] = EXT_SRC_STATE_STOPPING;    
      DSP_BGSND_Stop();      
      L1Audio_ClearFlag( Ext_BGSnd.aud_id );
      pSrc->state[BGSND_DL_PROCESS] = pSrc->state[BGSND_UL_PROCESS] = EXT_SRC_STATE_IDLE;    
   }  
   kal_prompt_trace(MOD_L1SP, "[EXT_BGSND_Close] Leave");     
}
예제 #14
0
Media_Status I2S_Close( void ){
   kal_trace( TRACE_FUNC, L1AUDIO_I2S_DISABLE);
#if !defined(__AUDIO_RECORD_COMPONENT_SUPPORT__)
   ASSERT(I2S_RECORD_STATE_INIT == i2s.state);
#endif
   i2s.state = I2S_RECORD_STATE_CLOSED;
   AM_AudioPlaybackOff( true );
   
   AFE_TurnOffEDI();
#if defined(__INTERAL_FM_VIA_I2S__)
   if(!I2S_is_FM())
#endif
      I2S_Input_GPIO_TurnOff();
      
#if defined(MT6260)
#if defined(__INTERAL_FM_VIA_I2S__)
   if(I2S_is_FM())
   *HW_MISC_REG &= ~0x0001;
#endif   
#endif     
  
   *DSP_AUDIO_FLEXI_CTRL &= ~(FLEXI_VBI_ENABLE | FLEXI_SD_ENABLE);
   *DSP_AUDIO_CTRL2 &= ~DP_PCM_R_DIS;
   /*  GPIO setting */

#if defined(__AUDIO_COMPONENT_SUPPORT__)
   ASSERT(i2s.ihdl);
   Media_SetIsDSPDec(KAL_FALSE); // to bypass sink component
   AudioRoute2Drain_Stop(i2s.ihdl);
   AudioRoute2Drain_Free(i2s.ihdl);
   i2s.ihdl = NULL;
#endif   

#if defined(__BES_LOUDNESS_ON_I2S__)
   AudioPP_Loudness_Registry();
#endif

#if defined(MT6250)
   L1Audio_UnhookHisrHandler( DP_D2C_I2S_REC_INT );
#endif

#if defined(__AUDIO_DSP_LOWPOWER_V2__)
   if(AUDLP_Check_LowPower_Status())
   {
   #if defined(MT6250) || defined(MT6260)
      AUDLP_SetClkSwitch_26M(KAL_FALSE);
      AUDLP_SW_Trigger_Event_Setting(KAL_FALSE);
      AUDLP_Set_ClkSwitchMode(KAL_FALSE);
   #endif
      AUDLP_Mode(KAL_FALSE, 1);
      L1Audio_ClearFlag_MD2G( i2s.aud_id );
   }
   else
      L1Audio_ClearFlag( i2s.aud_id );
#else
   L1Audio_ClearFlag( i2s.aud_id );
#endif

   L1Audio_FreeAudioID( i2s.aud_id );
   i2s.is_ON = KAL_FALSE;
   ktUnlock();
   return MEDIA_SUCCESS;
}
예제 #15
0
/* ------------------------------------------------------------------------------ */
void L1Audio_Task(unsigned argc, void *argv)
{
   uint32 retrieved_events;
   uint32 I;
   uint16 tempID;

   l1audio.aud_events = kal_create_event_group("L1Audio");
   l1audio.hisr = kal_init_hisr(L1AUDIO_HISR);
   
   GET_SLEEP_HANDLE();
   
#if ( defined( __CENTRALIZED_SLEEP_MANAGER__ ) && defined(MTK_SLEEP_ENABLE) && !defined(__AUDIO_POWERON_RESET_DSP__) )
   l1audio.md2g_pdn_handle = L1D_MD2G_PWD_GetHandle();
   l1audio.l1sm_handle = L1SM_IntGetHandle();
#endif

   l1audio.runningState        = 0;
   l1audio.disallowSleepState  = 0;
   l1audio.dsp_slow_idle_counter = 0;
   l1audio.event_flag   = 0;
   l1audio.id_flag      = 0;
   l1audio.media_flag   = 0;
   l1audio.postHisrHandler = (L1Audio_EventHandler)0;
   l1audio.sema = kal_create_sem( "Aud_Sema", 1 );  

   l1audio.hisrMagicFlag = 0;
   for( I = 0; I < MAX_HISR_HANDLER; I++ )
      l1audio.hisrMagicNo[I] = 0;

   tempID = L1Audio_GetAudioID();
   L1Audio_SetFlag(tempID);

   DSP_DynamicDownload_Init();

#ifndef  L1D_TEST
   /// Dynamic download for A/V sync
#if defined( DSP_WT_SYN ) && !defined(__AUDIO_COMPONENT_SUPPORT__)
   DSP_DynamicDownload( DDID_WAVETABLE );
#endif
#endif
   AM_Init();

#if APM_SUPPORT
   APM_Init();
#endif

   /// AFE_Init will invoke L1Audio_GetAudioID
   /// and expect to get the id 0 to make sure
   /// it has the highest priority in the event group
   AFE_Init();

#if !defined(__SMART_PHONE_MODEM__) && !defined(__L1_STANDALONE__) && !defined( MED_MODEM )   
   AVsync_Init();
#endif   
   
#if defined(__AUDIO_POWERON_RESET_DSP__)
   {
      uint32 _savedMask;
      _savedMask = SaveAndSetIRQMask();
      AFE_Init_status(KAL_TRUE);
      AFE_RegisterBackup();
      RestoreIRQMask(_savedMask);
   }
#endif

   L1SP_Init();

   ktInit( L1Audio_GetAudioID() );
   toneInit( L1Audio_GetAudioID() );
   mediaInit( L1Audio_GetAudioID() );
#if defined(VR_CYBERON)
   vrsdInit();
#elif defined(VRSI_CYBERON)
   vrsiInit();
#endif

   toneLoopbackRecInit();

#if ( defined(__BT_A2DP_PROFILE__) || defined(SBC_UNIT_TEST) ) //&& !(APM_SUPPORT)
   SBC_Init();
#endif

#if defined(__BES_TS_SUPPORT__)
   AudioPP_TS_Init();
#endif

#ifdef __CTM_SUPPORT__
   l1ctm_init();
#endif

#ifdef __TWOMICNR_SUPPORT__
   Two_Mic_NR_chip_Init();	
#endif


#if VMI_SUPPORT || defined(VORTP_UNIT_TEST)
   VMI_Init();
#endif

#if VORTP_SUPPORT || defined(VORTP_UNIT_TEST)
   VoRTP_Init();
#endif

#if defined(CYBERON_DIC_TTS) || defined(IFLY_TTS) || defined(SINOVOICE_TTS)
   ttsInit();
#endif
#if defined( DSP_WT_SYN ) && !defined(__AUDIO_COMPONENT_SUPPORT__)
   DSPSYN_HW_Init();
#endif

#if defined( __I2S_INPUT_MODE_SUPPORT__ )
   I2S_init();
#endif

#if defined(__VOICE_CHANGER_SUPPORT__)
   VCHG_Initialize();
#endif

#if defined(__AUDIO_COMPONENT_SUPPORT__) && !defined(__L1_STANDALONE__) && !defined(MED_MODEM)
   // KH : for audio component
   ACU_Init();
#endif

#if defined(__CVSD_CODEC_SUPPORT__) 
    {
        extern void BT_SCO_Init(void);
        BT_SCO_Init();
    }
#endif

   memset( &(l1audio.debug_info), 0, sizeof(l1audio.debug_info) );
   AFE_TurnOnFIR( L1SP_SPEECH );
   AFE_TurnOnFIR( L1SP_VOICE );

   L1Audio_ClearFlag(tempID);
   L1Audio_FreeAudioID(tempID);

   l1audio.isInitiated = KAL_TRUE;

   while( 1 ) {
#if VERIFY_DATA_TO_DSP
      VERIFY_DATA_TO_DSP_SAVE_DATA();
#endif
      kal_retrieve_eg_events(l1audio.aud_events,0xFFFF,KAL_OR_CONSUME,&retrieved_events,KAL_SUSPEND);
      l1audio.retrieved_events = retrieved_events;
      l1audio.events_l1FN = L1I_GetTimeStamp();
      for( I = 0; I < MAX_AUDIO_FUNCTIONS; I++ ) {
         if ( l1audio.retrieved_events & (1<<I) ) {
            l1audio.evHandler[I]( l1audio.evData[I] );
         }
      }
      //if( (l1audio.runningState & l1audio.disallowSleepState) == 0 )
      if( l1audio.runningState == 0 )
         SLEEP_UNLOCK();
   }
}
static void ktStop_blocking( void *data )
{
   int I;
   
   if (keytone.state == TONE_STATE_NONE)
      return;

   if( !L1Audio_CheckFlag( keytone.aud_id ) )
      return;

   if (keytone.state == TONE_STATE_INIT) {
      for (I = 0; ; I++) {
         if (keytone.state != TONE_STATE_INIT)
            break;
         
         ASSERT_REBOOT( I < 120 );
         kal_sleep_task( 2 );
      }
   }
   
   if (keytone.state == TONE_STATE_PLAY) {
      keytone.state = TONE_STATE_STOP;
      keytone.isWait = true;
      L1Audio_FC_TonePlaybackOff(keytone.fc_aud_id);
      keytone.isWait = false;
      keytone.state = TONE_STATE_IDLE;
   }
   
   if (keytone.state == TONE_STATE_STOP) {
      for (I = 0; ; I++) {
         if (keytone.state == TONE_STATE_IDLE)
            break;
         
         ASSERT_REBOOT( I < 120 );
         kal_sleep_task( 2 );
      }
   }
   
   if (keytone.state == TONE_STATE_UNHOOKING) {
      for (I = 0; ; I++) {
         if (keytone.state == TONE_STATE_UNHOOKED)
            break;
         
         ASSERT_REBOOT( I < 120 );
         kal_sleep_task( 2 );
      }
      return;
   }
   
   if (keytone.state == TONE_STATE_UNHOOKED) {
      keytone.state = TONE_STATE_NONE;
      L1Audio_FC_UnHookHandler_WithoutWaitingClear(keytone.fc_aud_id, 0);
      keytone.fc_aud_id = 0xFFFF;
   }
   
   if (keytone.state == TONE_STATE_IDLE) {
      keytone.state = TONE_STATE_NONE;
      L1Audio_FC_UnHookHandler(keytone.fc_aud_id, 0);
      keytone.fc_aud_id = 0xFFFF;
   }

   AM_KeyToneOff();
   L1Audio_ClearFlag( keytone.aud_id );
}