示例#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
	}
}
示例#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

}
示例#3
0
bool UsbAudioControl(void)
{
	uint16_t Msg = 0;
    
#ifndef FUNC_MIXER_SRC_EN
	AudioSampleRateSet(44100);
#endif
    
#ifdef FUNC_USB_AUDIO_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO)
	{
		APP_DBG("Enter usb-audio\n");
	}
#endif

#ifdef FUNC_USB_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_READER)
	{
		APP_DBG("Enter sd reader\n");
	}
#endif

#ifdef FUNC_USB_AUDIO_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO_READER)
	{
		APP_DBG("Enter usb-audio-reader\n");
	}
#endif

	if(!IsPcLink())
	{
		APP_DBG("device not ready!\n");
		return FALSE;
	}

	TimeOutSet(&UsbAudioFreqAdjustTimer, 1000);    
	NVIC_EnableIRQ(USB_IRQn);
	UsbSetCurrentPort(PC_PORT_NUM);		// 选择USB端口

	APP_DBG("IsPcLink() OK!\n");

#ifdef FUNC_USB_AUDIO_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO)
	{
		// 单独USB声卡模式,PC识别出USB声卡
		APP_DBG("MODULE_ID_USB_AUDIO\n");
		DeviceAudioSetMode(USB_DEVICE_AUDIO);
		gDeviceVID = 0x0000;
		gDevicePID = 0x0201;
		gDeviceString_Manu = "MVSILICON";					//max length: 32bytes
		gDeviceString_Product = "MV USB AUDIO";				//max length: 32bytes
		gDeviceString_SerialNumber = "20130617A002";		//max length: 32bytes
	}
#endif

#ifdef FUNC_USB_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_READER)
	{
		// 单独USB读卡器模式,PC识别出USB读卡器
		APP_DBG("MODULE_ID_USB_READER\n");
		DeviceAudioSetMode(USB_DEVICE_READER);
		DeviceStorInit();
		gDeviceVID = 0x0000;
		gDevicePID = 0x1000;
		gDeviceString_Manu = "MVSILICON";				// max length: 32bytes
		gDeviceString_Product = "USB CARD READER";		// max length: 32bytes
		gDeviceString_SerialNumber = "20130617B002";	// max length: 32bytes
	}
#endif

#ifdef FUNC_USB_AUDIO_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO_READER)
	{
		// 一线通模式,PC同时识别出USB声卡和USB读卡器
		APP_DBG("MODULE_ID_USB_AUDIO_READER\n");
		DeviceAudioSetMode(USB_DEVICE_AUDIO_READER);
		DeviceStorInit();
		gDeviceVID = 0x0000;
		gDevicePID = 0x0201;
		gDeviceString_Manu = "MVSILICON";				// max length: 32bytes
		gDeviceString_Product = "MV USB AUDIO";			// max length: 32bytes
		gDeviceString_SerialNumber = "20130617C002";    // max length: 32bytes
	}
#endif


	//USB读卡器模式下,设备管理器中显示的磁盘驱动器名称
	gDeviceString_MassStor_Vendor = "MVSI";				// max length: 8bytes
	gDeviceString_MassStor_Product = "USB CARD READER";	// max length: 16bytes
	gDeviceString_MassStor_Ver = "V2.0";				// max length: 4bytes

	//USB声卡模式下,回调函数指针初始化
	gFpDeviceAudioMuteEn = DeviceAudioMuteEn;			// PC端执行MUTE命令时,回调此函数
	gFpDeviceAudioMuteDis = DeviceAudioMuteDis;			// PC端执行UNMUTE命令时,回调此函数
	gFpDeviceAudioSetVolume = DeviceAudioSetVolume;		// PC端改变音量时,回调此函数


	UsbDeviceEnableInt(DEVICE_CONTROL_EP, DeviceAudioOnCmd);
	UsbDeviceEnableInt(DEVICE_BULK_OUT_EP, DeviceAudioOnCmd);

//	CodecDacChannelSel(DAC_CH_DECD_L | DAC_CH_DECD_R); // select dac channel
	UsbDeviceInit();

//	NVIC_EnableIRQ(DECODER_IRQn);


	AudioAnaSetChannel(gSys.MicEnable ? AUDIO_CH_MIC : AUDIO_CH_NONE);	
	MixerConfigFormat(MIXER_SOURCE_USB, USB_DAC_FREQ, MIXER_FORMAT_STERO);
	mixer_pcm_format = MIXER_FORMAT_STERO;
	MixerConfigVolume(MIXER_SOURCE_USB, 4000, 4000);
	MixerUnmute(MIXER_SOURCE_USB);
	MixerEnable(MIXER_SOURCE_USB);

    AudioLeftVolume  = (AUDIO_MAX_VOLUME*3)/4;
    AudioRightVolume = (AUDIO_MAX_VOLUME*3)/4;
    APP_DBG("AudioLeftVolume = %d\n", AudioLeftVolume);
#ifdef FUNC_AUDIO_DRC_EFFECT_EN
	if(gSys.AudioDRCEffectFlag)
	{
		if(DRC_ERROR_OK != init_drc(&gSys.AudioDRCEffectHandle, MIXER_FORMAT_STERO, USB_DAC_FREQ, AUDIO_EFFECT_PARAM_DRC_THRESHHOLD,
							0, AUDIO_EFFECT_PARAM_DRC_RATIO, AUDIO_EFFECT_PARAM_DRC_ATTACK_TIME, 
							AUDIO_EFFECT_PARAM_DRC_RELEASE_TIME, AUDIO_EFFECT_PARAM_DRC_CROSSOVER_FREQ))
        {
            APP_DBG("Init DRC Effect fail,close\n");
            gDRCEffectInited = FALSE;
        }
        else
        {
        	gDRCEffectInited = TRUE;
        }
	}
#endif	
#ifdef FUNC_AUDIO_3D_EFFECT_EN
	if(gSys.Audio3dEffectFlag)
	{
		if(THREE_D_ERROR_OK != init_3d(&gSys.Audio3dEffectHandle, MIXER_FORMAT_STERO, USB_DAC_FREQ, AUDIO_EFFECT_PARAM_3D_BASS, AUDIO_EFFECT_PARAM_3D_MID_BOOST))
        {
            //gSys.Audio3dEffectFlag = 0;
            APP_DBG("Init 3D Effect fail,close\n");
            g3dEffectInited = FALSE;
        }
        else
        {
        	g3dEffectInited = TRUE;
        }
	}
#endif
#ifdef FUNC_AUDIO_VB_EFFECT_EN
    if(gSys.AudioVbEffectFlag)
    {
        if(VB_ERROR_OK != init_vb(&gSys.AudioVbEffectHandle, MIXER_FORMAT_STERO, USB_DAC_FREQ, AUDIO_EFFECT_PARAM_VB_CUTOFF_FREQ, AUDIO_EFFECT_PARAM_VB_LIMITER_EN))
        {
            gVbEffectInited = FALSE;
        }
        else
        {
            gVbEffectInited = TRUE;
        }
    }
#endif 
    SetModeSwitchState(MODE_SWITCH_STATE_DONE);
	while(Msg != MSG_COMMON_CLOSE)
	{
		//UsbDeviceDisableInt(DEVICE_BULK_OUT_EP);
		DeviceStorProcess();
		//UsbDeviceEnableInt(DEVICE_BULK_OUT_EP, DeviceAudioOnCmd);

		DeviceAudioProcess();
        
#if (!defined (OUTPUT_CHANNEL_CLASSD)) && (!defined (OUTPUT_CHANNEL_DAC_CLASSD))      //classd模式下,采用的clk mode = normal mode,禁止使用硬件微调
   #ifndef FUNC_SOFT_ADJUST_EN
        UsbAudioFreqAdjust();
   #endif
#endif        
		Msg = MsgRecv(10);// 消息接收,无消息阻塞20ms,有消息立即返回

		if(Msg == MSG_USB_DEVICE_INTERRUPT_CB)
		{
			UsbIntFlag = FALSE;
		}
                
		switch(Msg)
		{		
			case MSG_POWER:
				gSys.NextModuleID = MODULE_ID_STANDBY;
			case MSG_MODE: // mode change,end of this mode
				APP_DBG("CHANGE_MODE\n");
				// mode change,end of this mode
				Msg = MSG_COMMON_CLOSE;                    
				break;

			case MSG_PLAY_PAUSE:
				APP_DBG("PLAY_PAUSE\n");
				DeviceAudioSendPcCmd(PC_CMD_PLAY_PAUSE);
				break;

			case MSG_PRE:
				APP_DBG("PRE\n");
				DeviceAudioSendPcCmd(PC_CMD_PRE);
				SoundRemind(SOUND_PREV_TRACK);
				break;

			case MSG_NEXT:
				APP_DBG("NEXT\n");
				DeviceAudioSendPcCmd(PC_CMD_NEXT);				
                SoundRemind(SOUND_NEXT_TRACK);
				break;

			case MSG_STOP:
				APP_DBG("STOP\n");
				DeviceAudioSendPcCmd(PC_CMD_STOP);
				break;

			case MSG_MUTE:
				APP_DBG("MUTE\n");
				DeviceAudioSendPcCmd(PC_CMD_MUTE);
				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;
		}
	}

#ifdef FUNC_USB_AUDIO_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO)
	{
		APP_DBG("Leave usb-audio\n");
	}
#endif

#ifdef FUNC_USB_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_READER)
	{
		APP_DBG("Leave sd reader\n");
	}
#endif

#ifdef FUNC_USB_AUDIO_READER_EN
	if(gSys.CurModuleID == MODULE_ID_USB_AUDIO_READER)
	{
		APP_DBG("Leave usb-audio-reader\n");
	}
#endif

	MixerMute(MIXER_SOURCE_USB);
	MixerDisable(MIXER_SOURCE_USB);

	UsbDeviceDisConnect(); // 退出前断开usb device,停止接收数据,以免与SD/U盘播放产生冲突
#ifdef FUNC_USB_EN
	UsbSetCurrentPort(UDISK_PORT_NUM); // set usb host port
#endif
	return TRUE;//OK
}