// 上电时,硬件扫描消抖 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 } }
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 }
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 }