Example #1
0
// 上电时,硬件扫描消抖
void InitDeviceDetect(void)
{
	TIMER Timer;

	// GpioLcdIoConfig(RESTORE_TO_GENERAL_IO); // ??? 当前linein gpio c6 与 lcd touch 存在复用关系,所以先设置io为普通io口
	//TimeOutSet(&Timer, 800);

	//set the device detection time upto 500 ms by Robert. -20140114
	if(OSSysAuxtmrGet() + 200 + 130 + 60 < 500)
	{
		/*
		 * if device detection(especial USB) time less than 500ms,complement the left time to delete the device jitter
		 */
		TimeOutSet(&Timer, 500 - 60 - 130 - 200 - OSSysAuxtmrGet());
	}
	else
	{
		/*
		 * give 20 ms enough to device detection
		 */
		TimeOutSet(&Timer, 20);
	}
	while(!IsTimeOut(&Timer))
	{
#ifdef FUNC_USB_EN
		IsUDiskLink();
#endif
		IsPcLink();

#ifdef FUNC_CARD_EN
		IsCardLink();
#endif
		IsLineInLink();
#ifdef FUNC_MIC_DET_EN
		IsMicLinkFlag = IsMicInLink();
#endif
	}
}
Example #2
0
void DeviceDetect(void)
{
	int32_t Msg;

	if(gSys.CurModuleID == MODULE_ID_BT_HF)
	{
		// 蓝牙免提通话时,插入或拔除SD、U盘等设备,不切换模式,以免中断通话
		return;
	}

#ifdef FUNC_USB_EN
	//U盘插拔检测
	if((!IsUDiskLinkFlag) && IsUDiskLink())
	{
		IsUDiskLinkFlag = TRUE;
		DBG("UDiskPlugIn\n");		
		Msg = MSG_USB_PLUGIN;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_USB_PLUGIN);
		MsgClear(MSG_USB_PLUGOUT);
		MsgSend(Msg);
		return;
	}
	else if((IsUDiskLinkFlag) && (!IsUDiskLink()))
	{
//        if(gSys.CurModuleID == MODULE_ID_PLAYER_USB)
//        {
//                DacSoftMuteSet(TRUE, TRUE);
//        }
		IsUDiskLinkFlag = FALSE;
		DBG("UDiskPlugOut\n");
		Msg = MSG_USB_PLUGOUT;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_USB_PLUGIN);
		MsgClear(MSG_USB_PLUGOUT);
		MsgSend(Msg);
		return;
	}
#endif
	
	//PC插拔检测
	if((!IsPcLinkFlag) && IsPcLink())
	{
		IsPcLinkFlag = TRUE;
		DBG("PcPlugIn\n");
		Msg = MSG_PC_PLUGIN;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_PC_PLUGIN);
		MsgClear(MSG_PC_PLUGOUT);
		MsgSend(Msg);
		return;
	}
	else if((IsPcLinkFlag) && (!IsPcLink()))
	{
		IsPcLinkFlag = FALSE;
		DBG("PcPlugOut\n");
		Msg = MSG_PC_PLUGOUT;
		//为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_PC_PLUGIN);
		MsgClear(MSG_PC_PLUGOUT);
		MsgSend(Msg);
		return;
	}

#ifdef FUNC_CARD_EN
	//CARD插拔检测
	if((!IsCardLinkFlag) && IsCardLink())
	{
		IsCardLinkFlag = TRUE;
		DBG("CardPlugIn\n");
		Msg = MSG_SD_PLUGIN;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_SD_PLUGIN);
		MsgClear(MSG_SD_PLUGOUT);
		MsgSend(Msg);
		return;
	}
	else if((IsCardLinkFlag) && (!IsCardLink()))
	{
//        if(gSys.CurModuleID == MODULE_ID_PLAYER_SD)
//        {
//            DacSoftMuteSet(TRUE, TRUE);
//        }
		IsCardLinkFlag = FALSE;
		DBG("CardPlugOut\n");
		Msg = MSG_SD_PLUGOUT;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_SD_PLUGIN);
		MsgClear(MSG_SD_PLUGOUT);
		MsgSend(Msg);
		return;
	}
#endif
	
	//LINEIN插拔检测
	if((!IsLineInLinkFlag) && IsLineInLink())
	{
		IsLineInLinkFlag = TRUE;
		DBG("LineInPlugIn\n");
		Msg = MSG_LINEIN_PLUGIN;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_LINEIN_PLUGIN);
		MsgClear(MSG_LINEIN_PLUGOUT);
		MsgSend(Msg);
		return;
	}
	else if((IsLineInLinkFlag) && (!IsLineInLink()))
	{
		IsLineInLinkFlag = FALSE;
		DBG("LineInPlugOut\n");
		Msg = MSG_LINEIN_PLUGOUT;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_LINEIN_PLUGIN);
		MsgClear(MSG_LINEIN_PLUGOUT);
		MsgSend(Msg);
		return;
	}
#ifdef FUNC_MIC_DET_EN
	if((!IsMicLinkFlag) && IsMicInLink())
	{
		//MIC插入
        IsMicLinkFlag = TRUE;
        DBG("MicInPlugIn\n");

		Msg = MSG_MIC_PLUGIN;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_LINEIN_PLUGIN);
		MsgClear(MSG_LINEIN_PLUGOUT);
		MsgSend(Msg);
	}
	else if((IsMicLinkFlag) && (!IsMicInLink()))
	{
		//MIC拔出
		IsMicLinkFlag = FALSE;
		DBG("MicInPlugOut\n");
		Msg = MSG_MIC_PLUGOUT;
		// 为避免多个插拔事件的排队现象,所以每次收到新的插拔事件都清除前面未处理的事件,遵循后插先播原则
		MsgClear(MSG_LINEIN_PLUGIN);
		MsgClear(MSG_LINEIN_PLUGOUT);
		MsgSend(Msg);
	}
#endif

}
Example #3
0
bool LineInControl(void)
{
	uint16_t Msg = 0;
	SW_TIMER LineInTimer;

	APP_DBG("Enter LineInControl...\n");

	if(!IsLineInLink())
	{
		APP_DBG("Exit LineInControl...\n");
		return TRUE;
	}

#ifndef FUNC_MIXER_SRC_EN
	AudioSampleRateSet(44100);
#endif	
	
	SoundRemind(SOUND_LINEIN); 
    
#ifdef FUNC_TREB_BASS_EN
	if(gSys.EqStatus == 0)
	{
		TrebBassSet(gSys.TrebVal, gSys.BassVal);
	}
#endif
	
	if(gSys.MicEnable)
	{
		MixerMute(MIXER_SOURCE_ANA_MONO);	
		MixerMute(MIXER_SOURCE_MIC);
	}
	else
	{
		MixerMute(MIXER_SOURCE_ANA_STERO);
	}
	WaitMs(20);
	
	AudioAnaSetChannel(gSys.MicEnable ? AUDIO_CH_MIC_LINEIN : AUDIO_CH_LINEIN);
	
	if(gSys.MicEnable)
	{
		MixerUnmute(MIXER_SOURCE_ANA_MONO);	
		MixerUnmute(MIXER_SOURCE_MIC);
	}
	else
	{
		MixerUnmute(MIXER_SOURCE_ANA_STERO);
	}
	
	// ÏûÏ¢×¢²á
    if(gSys.MuteFlag)
	{
    	gSys.MuteFlag = 0;
		AudioPlayerMute(gSys.MuteFlag);
	} 

	InitTimer(&LineInTimer, 250, LineInLedCb);
	StartTimer(&LineInTimer);
	AudioSysInfoSetBreakPoint();

	SetModeSwitchState(MODE_SWITCH_STATE_DONE);
	
	while(Msg != MSG_COMMON_CLOSE)
	{
		//led light timer
		CheckTimer(&LineInTimer);
		
		Msg = MsgRecv(5);

		switch(Msg)
		{			
			case MSG_MODE:        //working mode changing
				Msg = MSG_COMMON_CLOSE;
				break;
			
			case MSG_POWER:
				gSys.NextModuleID = MODULE_ID_STANDBY;
				Msg = MSG_COMMON_CLOSE;
				break;
			
#ifdef FUNC_RECORD_EN
			case MSG_REC:  //¼Òô
				gSys.ModuleIDBackUp = gSys.CurModuleID;
				gSys.NextModuleID = MODULE_ID_RECORDER;
				gSys.RecordState = RECORD_STATE_REC;
				gSys.RecordSource = RECORD_SOURCE_LINEIN;
				Msg = MSG_COMMON_CLOSE;
				break;
#endif
           
#ifdef FUNC_REC_PLAYBACK_EN
			case MSG_REC_PLAYBACK:
				EnterRecBackPlay(gSys.CurModuleID, IsUDiskLink() ? DEV_ID_USB : DEV_ID_SD, TRUE, 0, 0);
				break;
#endif

			default:
				CommonMsgProccess(Msg);
				break;

		}
	}
#if (defined(FUNC_BREAKPOINT_EN) && (defined(FUNC_USB_EN) || defined(FUNC_CARD_EN)))
	{
		BP_SYS_INFO *pBpSysInfo;
		pBpSysInfo = (BP_SYS_INFO *)BP_GetInfo(BP_SYS_INFO_TYPE);
		BP_SET_ELEMENT(pBpSysInfo->Volume, gSys.Volume);
        BP_SET_ELEMENT(pBpSysInfo->Eq, gSys.Eq);
		BP_SaveInfo(BP_SAVE2NVM);
	}
#endif
	AudioAnaSetChannel(gSys.MicEnable ? AUDIO_CH_MIC : AUDIO_CH_NONE);	
	APP_DBG("leave LineInControl...\n");
	return TRUE;//OK
}