📄 rt5621.cpp
字号:
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 + -