⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rt5621.cpp

📁 realtek562x系列驱动源码。wince
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				RetVal=WriteCodecRegMask(RT5621_HP_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);	//Mute headphone right/left channel
					
			break;

			case RT_WAVOUT_PATH_SPK:
				
				RetVal=WriteCodecRegMask(RT5621_SPK_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);	//Mute Speaker right/left channel			

			break;
			
			case RT_WAVOUT_PATH_AUX:

				RetVal=WriteCodecRegMask(RT5621_MONO_AUX_OUT_VOL,RT_L_MUTE|RT_R_MUTE,RT_L_MUTE|RT_R_MUTE);	//Mute AuxOut right/left channel

			break;

			case RT_WAVOUT_PATH_MONO:

				RetVal=WriteCodecRegMask(RT5621_MONO_AUX_OUT_VOL,RT_L_MUTE,RT_L_MUTE);	//Mute MonoOut channel		

			break;

			case RT_WAVOUT_PATH_DAC:

				RetVal=WriteCodecRegMask(RT5621_STEREO_DAC_VOL,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER
															  ,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);	//Mute DAC to HP,Speaker,Mono Mixer				
			break;

			default:

				return FALSE;

		}
	}
	else
	{
		switch(WavOutPath)
		{

			case RT_WAVOUT_PATH_ALL:

				RetVal=WriteCodecRegMask(RT5621_SPK_OUT_VOL		,0,RT_L_MUTE|RT_R_MUTE);	//Mute Speaker right/left channel
				RetVal=WriteCodecRegMask(RT5621_HP_OUT_VOL 		,0,RT_L_MUTE|RT_R_MUTE);	//Mute headphone right/left channel
				RetVal=WriteCodecRegMask(RT5621_MONO_AUX_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);	//Mute Aux/Mono right/left channel
				RetVal=WriteCodecRegMask(RT5621_STEREO_DAC_VOL	,0,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);	//Mute DAC to HP,Speaker,Mono Mixer
		
			break;
		
			case RT_WAVOUT_PATH_HP:

				RetVal=WriteCodecRegMask(RT5621_HP_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);	//unMute headphone right/left channel
					
			break;

			case RT_WAVOUT_PATH_SPK:
				
				RetVal=WriteCodecRegMask(RT5621_SPK_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);	//unMute Speaker right/left channel			

			break;
			
			case RT_WAVOUT_PATH_AUX:

				RetVal=WriteCodecRegMask(RT5621_MONO_AUX_OUT_VOL,0,RT_L_MUTE|RT_R_MUTE);//unMute AuxOut right/left channel

			break;

			case RT_WAVOUT_PATH_MONO:

				RetVal=WriteCodecRegMask(RT5621_MONO_AUX_OUT_VOL,0,RT_L_MUTE);	//unMute MonoOut channel		

			break;

			case RT_WAVOUT_PATH_DAC:

				RetVal=WriteCodecRegMask(RT5621_STEREO_DAC_VOL,0,RT_M_HP_MIXER|RT_M_SPK_MIXER|RT_M_MONO_MIXER);	//unMute DAC to HP,Speaker,Mono Mixer

			default:
				return FALSE;
		}

	}
	
	return RetVal;
}
//*****************************************************************************
//
//function:Jack Detect to control output function
//parameter:
//			JackDetSel  :select jack detect source
//			OutputEnable:HP out enable,Auxout enable,Speaker out enable when Jack is low or high active
//
//*****************************************************************************
BOOL RT5621_Codec::JackDectCtrl(unsigned short int JackDetSel,unsigned short int OutputEnable)
{
	if(JackDetSel==JACK_DETECT_USE_JD1)		
	{	//Line In left is sharing to JD1,so we need switch to JD1
		WriteCodecRegMask(RT5621_GPIO_PIN_SHARING,LINEIN_L_PIN_AS_JD1,LINEIN_L_PIN_SHARING);
	}
	else if(JackDetSel==JACK_DETECT_USE_JD2)
	{	//Line In Right is sharing to JD2,so we need switch to JD2
		WriteCodecRegMask(RT5621_GPIO_PIN_SHARING,LINEIN_R_PIN_AS_JD2,LINEIN_R_PIN_SHARING);
	}
	else if(JackDetSel==JACK_DETECT_USE_GPIO)
	{	//To set GPIO pin to GPIO function,and set to input pin	
		WriteCodecRegMask(RT5621_GPIO_PIN_SHARING,GPIO_PIN_AS_GPIO,GPIO_PIN_SHARING);
		WriteCodecRegMask(RT5621_GPIO_PIN_CONFIG,GPIO_PIN_SET_INPUT,GPIO_PIN_MASK);
	}
			//write JD function
	return ShadowWriteCodec(RT5621_JACK_DET_CTRL,JackDetSel | OutputEnable);

}

//*****************************************************************************
//
//function:Vref power of Codec is ENABLE by default,the register 0x3C[11] work only Index 0x39[11]=0
//		   So if need control Verf power of Codec,we will to set index register 0x39[11] to 0.
//Parameter:
//			VrefEnable:
//						TRUE:enable Vref power
//					   FALSE:disable Vref power			   			
//
//*****************************************************************************
void RT5621_Codec::EnableVref(BOOL VrefEnable)
{
	if(VrefEnable)
	{
		ShadowWriteCodec(RT5621_HID_CTRL_INDEX,DIG_INTER_REG);			//index register 0x39
		ShadowWriteCodec(RT5621_HID_CTRL_DATA,0x9000);					//Enable Vref Power control enable
		WriteCodecRegMask(RT5621_PWR_MANAG_ADD2,PWR_VREF,PWR_VREF);		//enable Vref	
	}
	else
	{
		ShadowWriteCodec(RT5621_HID_CTRL_INDEX,DIG_INTER_REG);			//index register 0x39
		ShadowWriteCodec(RT5621_HID_CTRL_DATA,0x9000);					//Enable Vref Power control enable	
		WriteCodecRegMask(RT5621_PWR_MANAG_ADD2,0,PWR_VREF);			//Disable Vref
	}
}

//*****************************************************************************
//
//function:hardware EQ configuration
//
//*****************************************************************************
BOOL RT5621_Codec::EnableHwEq(HW_EQ_PRESET_TYPE Hw_Eq_Type,BOOL HwEqEnable)
{
	BOOL bRetVal=TRUE;
	int HwEqIndex;
	
	if(m_WaveOutSampleRate==KHZ48_000)
	{
		HwEq_Preset=HwEq_Preset_48k;
	}
	else 
	{
		HwEq_Preset=HwEq_Preset_44k;
	}
	

	if(HwEqEnable)
	{
		//enable Hardware EQ setting
		if(!ShadowWriteCodec(RT5621_EQ_CTRL,HwEq_Preset[Hw_Eq_Type].HwEQCtrl))
			{
				bRetVal=FALSE;

				return bRetVal;
			}


		//setting HW EQ Coefficient
		for(HwEqIndex=HW_EQ_LP0_A1;HwEqIndex<=HW_EQ_HP4_H0;HwEqIndex++)
		{			

			if(!WriteCodecAdvance((EXT_CODEC_INDEX)HwEqIndex,HwEq_Preset[Hw_Eq_Type].EqValue[HwEqIndex]))
			{
				bRetVal=FALSE;

				return bRetVal;
			}	
		}

		
		//Enable EQ Change mode
		if(!ShadowWriteCodec(RT5621_EQ_MODE_ENABLE,EQ_HPF_CHANGE_EN|EQ_BP3_CHANGE_EN|EQ_BP2_CHANGE_EN|EQ_BP1_CHANGE_EN|EQ_LPF_CHANGE_EN))
			{
				bRetVal=FALSE;

				return bRetVal;
			}
		
		//Disable EQ Change mode
		if(!ShadowWriteCodec(RT5621_EQ_MODE_ENABLE,0))
			{
				bRetVal=FALSE;

				return bRetVal;
			}

		return bRetVal;	
	}
	else
	{
		//Disable HW EQ setting
		bRetVal=WriteCodecRegMask(RT5621_EQ_CTRL,0,EN_HW_EQ_BLK | EN_HW_EQ_HPF | EN_HW_EQ_BP3 | EN_HW_EQ_BP2 | EN_HW_EQ_BP1 | EN_HW_EQ_LPF);
			
		return bRetVal;
	}
}

//*****************************************************************************
//
//function:Change audio codec power status
//
//*****************************************************************************

BOOL RT5621_Codec::ChangeCodecPowerStatus(POWER_STATE power_state)
{
	unsigned short int PowerDownState=0;

	switch(power_state)
	{
		case POWER_STATE_D0:			//FULL ON-----power on all power
			
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD1,~PowerDownState);
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD2,~PowerDownState);
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD3,~PowerDownState);

		break;	

		case POWER_STATE_D1:		//LOW ON-----


			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_VREF |PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|
													 PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER
													,PWR_VREF |PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|
													 PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT|
													 PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER
													,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT|
													 PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);			


			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,PWR_MAIN_I2S_EN|PWR_HP_AMP|PWR_HP_OUT|PWR_MIC1_BIAS_EN
													,PWR_MAIN_I2S_EN|PWR_HP_AMP|PWR_HP_OUT|PWR_MIC1_BIAS_EN);											   

#if	USE_CLASS_AB_SPEAKER		//Class AB

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_CLASS_AB,PWR_CLASS_AB);				
#else							//Class D
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_CLASS_D,PWR_CLASS_D);		
#endif
									

						
		break;

		case POWER_STATE_D1_PLAYBACK:	//Low on of Playback


			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_VREF|PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER
											  		,PWR_VREF|PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT 
											   		,PWR_MAIN_BIAS|PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT);		

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,PWR_MAIN_I2S_EN|PWR_HP_AMP|PWR_HP_OUT
											   		,PWR_MAIN_I2S_EN|PWR_HP_AMP|PWR_HP_OUT);											   
#if	USE_CLASS_AB_SPEAKER		//Class AB

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_CLASS_AB,PWR_CLASS_AB);				
#else							//Class D
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_CLASS_D,PWR_CLASS_D);		
#endif
									

		break;

		case POWER_STATE_D1_RECORD:	//Low on of Record

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,PWR_MAIN_I2S_EN|PWR_MIC1_BIAS_EN
											   		,PWR_MAIN_I2S_EN|PWR_MIC1_BIAS_EN);											   
											
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,PWR_VREF|PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER
											   		,PWR_VREF|PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,PWR_MAIN_BIAS|PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER
											   		,PWR_MAIN_BIAS|PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);		
	
		break;

		case POWER_STATE_D2:		//STANDBY----

#if	USE_CLASS_AB_SPEAKER		//Class AB

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_CLASS_AB);				
#else							//Class D
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_CLASS_D);		
#endif

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,0,PWR_MAIN_I2S_EN|PWR_HP_AMP|PWR_HP_OUT|PWR_MIC1_BIAS_EN);											   
														
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_DAC_REF_CIR |PWR_L_DAC_CLK |PWR_R_DAC_CLK |PWR_L_HP_MIXER |PWR_R_HP_MIXER|
													   PWR_L_ADC_CLK_GAIN |PWR_R_ADC_CLK_GAIN |PWR_L_ADC_REC_MIXER |PWR_R_ADC_REC_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,0 ,PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT|
														PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);

		
		break;

		case POWER_STATE_D2_PLAYBACK:	//STANDBY of playback

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,0,PWR_HP_AMP|PWR_HP_OUT);											   

#if	USE_CLASS_AB_SPEAKER	//Class AB 

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_CLASS_AB);				
#else						//Class D
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_CLASS_D);		
#endif
									
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_DAC_REF_CIR|PWR_L_DAC_CLK|PWR_R_DAC_CLK|PWR_L_HP_MIXER|PWR_R_HP_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,0,PWR_HP_R_OUT_VOL|PWR_HP_L_OUT_VOL|PWR_SPK_R_OUT|PWR_SPK_RN_OUT);

		break;

		case POWER_STATE_D2_RECORD:		//STANDBY of record

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD1 ,0,PWR_MIC1_BIAS_EN);											   
											
			WriteCodecRegMask(RT5621_PWR_MANAG_ADD2 ,0,PWR_L_ADC_CLK_GAIN|PWR_R_ADC_CLK_GAIN|PWR_L_ADC_REC_MIXER|PWR_R_ADC_REC_MIXER);

			WriteCodecRegMask(RT5621_PWR_MANAG_ADD3 ,0,PWR_MIC1_FUN_CTRL|PWR_MIC1_BOOST_MIXER);		

		break;		

		case POWER_STATE_D3:		//SLEEP
		case POWER_STATE_D4:		//OFF----power off all power
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD1,0);
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD2,0);
			ShadowWriteCodec(RT5621_PWR_MANAG_ADD3,0);		
				
		break;	

		default:

		break;
	}

	return TRUE;	
}

//*****************************************************************************
//
//function:Process private message of codec
//
//*****************************************************************************

DWORD RT5621_Codec::ProcessAudioMessage(UINT uMsg,DWORD dwParam1,DWORD dwParam2)
{
	
   switch (uMsg)
    {
		
		//To enable/Disable and config HW EQ
        case WPDM_PRIVATE_CONFIG_HW_EQ:
		
			if(!EnableHwEq((HW_EQ_PRESET_TYPE)dwParam1,(BYTE)dwParam2))
				return(MMSYSERR_ERROR);

            return (MMSYSERR_NOERROR);
            break;

		//To enable 3D Spatial function
 	    case WPDM_PRIVATE_ENABLE_3D:					
		//To disable 3D Spatial	function
	    case WPDM_PRIVATE_DISABLE_3D:		
		//To set 3D gain function
	    case WPDM_PRIVATE_SET_3D_PARAMETER:
				
			 if(!Set_3D_Func(SET_3D_PARA_MODE(dwParam1),(BYTE)dwParam2))
				return(MMSYSERR_ERROR);		
			
			return (MMSYSERR_NOERROR);

			break;
		

		//To enable/disable pseudo stereo function	
	   case WPDM_PRIVATE_CONFIG_PSEUDO:
			
			if(!Enable_Pseudo_Stereo((BYTE)dwParam1))
				return(MMSYSERR_ERROR);

            return (MMSYSERR_NOERROR);

			break;
		
		//To enable/disable Auto volume control	function
	   case WPDM_PRIVATE_CONFIG_AVC:		
		
			if(!EnableAVC((BYTE)dwParam1))
				return(MMSYSERR_ERROR);

            return (MMSYSERR_NOERROR);

			break;
	}
	
	return(MMSYSERR_NOTSUPPORTED);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -