📄 ac97.c
字号:
// Assume that the value written to the codec will be accepted without
// change. Record as actual value in mixer register.
// Divide by two for index because only even registers are used,
// and structures assume that.
ctxP->mixerRegsCurrVals[targetReg/2] = newValue;
}
return (status);
} // Ac97GetAnyMixerRegister ()
*/
// 0x02: LINE_OUT master volume
// If only 5 bits of attenuation are supported, the codec is required
// to truncate any 6-bit attenuation command to its maximum attenuation.
UINT32 Ac97GetMasterVolLeft (Ac97ContextT* ctxP, PUINT8 attenuationP)
{
UINT32 status ;
UINT16 masterVolTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
&masterVolTmp);
if (!status)
{
*attenuationP = (masterVolTmp >> AC97_MR_MSTR_VOL_L_SHFT)
& AC97_MR_MSTR_VOL_MSK;
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetMasterVolLeft ()
UINT32 Ac97GetMasterVolRight (Ac97ContextT* ctxP, PUINT8 attenuationP)
{
UINT32 status ;
UINT16 masterVolTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
&masterVolTmp);
if (!status)
{
*attenuationP = (masterVolTmp >> AC97_MR_MSTR_VOL_R_SHFT)
& AC97_MR_MSTR_VOL_MSK;
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetMasterVolRight ()
UINT32 Ac97GetMasterVolMute (Ac97ContextT* ctxP, BOOL* muteEnableP)
{
return 0;//zzm mask return (Ac97GetUsualMute (ctxP, AC97_MR_MASTER_VOLUME, muteEnableP));
} // Ac97GetMasterVolMute ()
/* //masked zzm
UINT32 Ac97SetMasterVolLeft (Ac97ContextT* ctxP, UINT8 attenuation)
{
UINT32 status ;
UINT16 masterVolTmp ;
// Don't bother range-checking the requested volume levels
// Get existing setting and change target field
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
&masterVolTmp);
if (!status)
{
// clear target field and insert new value
masterVolTmp = (masterVolTmp & ~ (AC97_MR_MSTR_VOL_MSK
<< AC97_MR_MSTR_VOL_L_SHFT))
| ((attenuation & AC97_MR_MSTR_VOL_MSK)
<< AC97_MR_MSTR_VOL_L_SHFT);
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
masterVolTmp);
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97SetMasterVolLeft ()
*/ //masked zzm
/* masked zzm
UINT32 Ac97SetMasterVolRight (Ac97ContextT* ctxP, UINT8 attenuation)
{
UINT32 status ;
UINT16 masterVolTmp ;
// Don't bother range-checking the requested levels
// Get existing setting and change target field
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
&masterVolTmp);
if (!status)
{
// clear target field and insert new value
masterVolTmp = (masterVolTmp & ~ (AC97_MR_MSTR_VOL_MSK
<< AC97_MR_MSTR_VOL_R_SHFT))
| ((attenuation & AC97_MR_MSTR_VOL_MSK)
<< AC97_MR_MSTR_VOL_R_SHFT);
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_MASTER_VOLUME,
masterVolTmp);
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97SetMasterVolRight ()
*/
UINT32 Ac97SetMasterVolMute (Ac97ContextT* ctxP, BOOL muteEnable)
{
// Subroutine records enough error info. Just pass status back.
return 0;//mask zzm return (Ac97SetUsualMute (ctxP, AC97_MR_MASTER_VOLUME, muteEnable));
} // Ac97SetMasterVolMute ()
// 0x1A Select the input source for the PCM stream to the controller.
UINT32 Ac97GetRecordSelectLeft (Ac97ContextT* ctxP, PUINT8 inputSourceP)
{
UINT32 status ;
UINT16 recordSelectTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
&recordSelectTmp);
if (!status)
{
*inputSourceP = (recordSelectTmp >> AC97_MR_REC_SEL_L_SHFT)
& AC97_MR_REC_SEL_MSK;
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetRecordSelectLeft()
UINT32 Ac97GetRecordSelectRight (Ac97ContextT* ctxP, PUINT8 inputSourceP)
{
UINT32 status ;
UINT16 recordSelectTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
&recordSelectTmp);
if (!status)
{
*inputSourceP = (recordSelectTmp >> AC97_MR_REC_SEL_R_SHFT)
& AC97_MR_REC_SEL_MSK;
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetRecordSelectRight()
/*
UINT32 Ac97SetRecordSelectLeft (Ac97ContextT* ctxP, UINT8 inputSource)
{
UINT32 status ;
UINT16 recordSelectTmp;
UINT srcCheckMask;
srcCheckMask = (1u << inputSource);
if (~(ctxP->mixerRegsSpecialMasksP->mr0x1aRecSelSupport) & srcCheckMask)
{
status = ERR_T_NOT_AVAIL; // Source not available in target codec
// Only record our error info. For comms problem, subroutine records.
LOGERROR (ctxP->loggedError, ERR_L_AC97,
ERR_S_AC97_SET_REC_SEL, status, srcCheckMask, 0, 0)
}
else
{
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
&recordSelectTmp);
if (!status)
{
// clear target field and insert new value
recordSelectTmp = ((recordSelectTmp & ~ (AC97_MR_REC_SEL_MSK
<< AC97_MR_REC_SEL_L_SHFT))
| (inputSource << AC97_MR_REC_SEL_L_SHFT));
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
recordSelectTmp);
}
}
// Subroutines record enough error info. Just pass status back.
return (status);
} // Ac97SetRecordSelectLeft()
UINT32 Ac97SetRecordSelectRight (Ac97ContextT* ctxP, UINT8 inputSource)
{
UINT32 status ;
UINT16 recordSelectTmp;
UINT srcCheckMask;
srcCheckMask = (1u << inputSource);
if (~(ctxP->mixerRegsSpecialMasksP->mr0x1aRecSelSupport) & srcCheckMask)
{
status = ERR_T_NOT_AVAIL; // Source not available in target codec
// Only record our error info. For comms problem, subroutine records.
LOGERROR (ctxP->loggedError, ERR_L_AC97,
ERR_S_AC97_SET_REC_SEL, status, srcCheckMask, 0, 0)
}
else
{
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
&recordSelectTmp);
if (!status)
{
// clear target field and insert new value
recordSelectTmp = ((recordSelectTmp & ~ (AC97_MR_REC_SEL_MSK
<< AC97_MR_REC_SEL_R_SHFT))
| (inputSource << AC97_MR_REC_SEL_R_SHFT));
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_RECORD_SELECT,
recordSelectTmp);
}
}
// Subroutines record enough error info. Just pass status back.
return (status);
} // Ac97SetRecordSelectRight()
UINT32 Ac97GetHWLoopAdcToDac (Ac97ContextT* ctxP, BOOL* enableLoopP)
{
UINT32 status;
UINT16 gprTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_GENERAL_PURPOSE,
&gprTmp);
if (!status)
{
if (gprTmp & AC97_MR_GPR_LPBK_ENAB)
{
*enableLoopP = TRUE;
}
else
{
*enableLoopP = FALSE;
}
}
// Subroutines record enough error info. Just pass status back.
return (status);
} // Ac97SetHWLoopAdcToDac ()
UINT32 Ac97SetHWLoopAdcToDac (Ac97ContextT* ctxP, BOOL enableLoop)
{
UINT32 status ;
UINT16 gprTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_GENERAL_PURPOSE,
&gprTmp);
if (!status)
{
gprTmp &= ~AC97_MR_GPR_LPBK_ENAB;
if (enableLoop)
{
gprTmp |= AC97_MR_GPR_LPBK_ENAB;
}
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_GENERAL_PURPOSE,
gprTmp);
}
// Subroutines record enough error info. Just pass status back.
return (status);
} // Ac97SetHWLoopAdcToDac ()
UINT32 Ac97GetPcmVariableRateEnable (Ac97ContextT* ctxP, BOOL* enabledP)
{
UINT32 status ;
UINT16 reg2aTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_E_AUDIO_CTRL_STAT,
®2aTmp);
if (!status)
{
if (reg2aTmp & AC97_MR_EA_STAT_CTRL_VRA_ENAB)
{
*enabledP = TRUE ;
}
else
{
*enabledP = FALSE ;
}
}
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetPcmVariableRateEnable ()
// 0x2A: Extended Audio Status and Control Register
UINT32 Ac97SetPcmVariableRateEnable (Ac97ContextT* ctxP, BOOL enable)
{
UINT32 status ;
UINT16 reg2aTmp;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_E_AUDIO_CTRL_STAT,
®2aTmp);
if (!status)
{
reg2aTmp &= ~AC97_MR_EA_STAT_CTRL_VRA_ENAB;
if (enable)
{
reg2aTmp |= AC97_MR_EA_STAT_CTRL_VRA_ENAB;
}
status = Ac97SetAnyMixerRegister (ctxP,
AC97_MR_E_AUDIO_CTRL_STAT,
reg2aTmp);
}
// Subroutines record enough error info. Just pass status back.
return (status);
} // Ac97SetPcmVariableRateEnable ()
// 0x2C: Controls variable rate for SDAT_OUT slots 3, 4 & 6
// Rate = value Hertz
UINT32 Ac97GetSampleRatePcmOut (Ac97ContextT* ctxP, PUINT16 currentRateP)
{
UINT32 status ;
status = Ac97GetAnyMixerRegister (ctxP,
AC97_MR_E_ASR_PCM_FRNT_DAC_RT,
currentRateP);
// Subroutine records enough error info. Just pass status back.
return (status);
} // Ac97GetSampleRatePcmOut ()
UINT32 Ac97SetSampleRatePcmOut (Ac97ContextT* ctxP, UINT16 desiredRate)
{
UINT32 status ;
status = Ac97SetAnyMixerRegister (ctxP,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -