📄 mintopo.cpp
字号:
that->CMIAdapter->clearUInt8Bit(REG_MIXER4, INV_SPDIFI1);
} else {
that->CMIAdapter->clearUInt32Bit(REG_CHFORMAT, INV_SPDIFI2);
}
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_MONITOR:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt8(REG_MIXER1) & EN_SPDI2DAC);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
} else {
that->CMIAdapter->clearUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_SELECT:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
if (that->cm->chipVersion <= 37) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & SEL_SPDIFI1);
} else {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_MISCCTRL) & SEL_SPDIFI2);
}
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*LoudnessOn) {
if (that->cm->chipVersion <= 37) {
that->CMIAdapter->setUInt32Bit(REG_CHFORMAT, SEL_SPDIFI1);
} else {
that->CMIAdapter->setUInt32Bit(REG_MISCCTRL, SEL_SPDIFI2);
}
} else {
if (that->cm->chipVersion <= 37) {
that->CMIAdapter->clearUInt32Bit(REG_CHFORMAT, SEL_SPDIFI1);
} else {
that->CMIAdapter->clearUInt32Bit(REG_MISCCTRL, SEL_SPDIFI2);
}
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_XCHG_FB:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt8(REG_MIXER1) & REAR2FRONT);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt8Bit(REG_MIXER1, REAR2FRONT);
} else {
that->CMIAdapter->clearUInt8Bit(REG_MIXER1, REAR2FRONT);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_BASS2LINE:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_LEGACY) & BASS2LINE);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_LEGACY, BASS2LINE);
} else {
that->CMIAdapter->clearUInt32Bit(REG_LEGACY, BASS2LINE);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_CENTER2LINE:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_LEGACY) & CENTER2LINE);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_LEGACY, CENTER2LINE);
} else {
that->CMIAdapter->clearUInt32Bit(REG_LEGACY, CENTER2LINE);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_COPYRIGHT:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_LEGACY) & EN_SPDCOPYRHT);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_LEGACY, EN_SPDCOPYRHT);
} else {
that->CMIAdapter->clearUInt32Bit(REG_LEGACY, EN_SPDCOPYRHT);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_POLVALID:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & POLVALID);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_CHFORMAT, POLVALID);
} else {
that->CMIAdapter->clearUInt32Bit(REG_CHFORMAT, POLVALID);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_LOOP:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_FUNCTRL1) & LOOP_SPDF);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_FUNCTRL1, LOOP_SPDF);
} else {
that->CMIAdapter->clearUInt32Bit(REG_FUNCTRL1, LOOP_SPDF);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_REAR2LINE:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt8(REG_MIXER1) & REAR2LINE);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt8Bit(REG_MIXER1, REAR2LINE);
} else {
that->CMIAdapter->clearUInt8Bit(REG_MIXER1, REAR2LINE);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_CENTER2MIC:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt8(REG_MIXER4) & CENTER2MIC) && (that->cm->chipVersion > 37);
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded) && (that->cm->chipVersion > 37)) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt8Bit(REG_MIXER4, CENTER2MIC);
} else {
that->CMIAdapter->clearUInt8Bit(REG_MIXER4, CENTER2MIC);
}
}
ntStatus = STATUS_SUCCESS;
break;
}
}
if ((NT_SUCCESS(ntStatus)) && (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)) {
PropertyRequest->ValueSize = sizeof(BOOL);
}
}
} else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) {
bool supported = false;
if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_MUTE) {
switch (PropertyRequest->Node) {
case KSNODE_TOPO_CD_MUTE:
case KSNODE_TOPO_LINEIN_MUTE:
case KSNODE_TOPO_MICOUT_MUTE:
case KSNODE_TOPO_AUX_MUTE:
case KSNODE_TOPO_WAVEOUT_MUTE:
case KSNODE_TOPO_LINEIN_MUTE_IN:
case KSNODE_TOPO_MIC_MUTE_IN:
case KSNODE_TOPO_CD_MUTE_IN:
case KSNODE_TOPO_AUX_MUTE_IN:
case KSNODE_TOPO_WAVEOUT_MUTE_IN:
case KSNODE_TOPO_MASTER_MUTE_DUMMY:
supported = true;
}
}
if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_LOUDNESS) {
switch (PropertyRequest->Node) {
case KSNODE_TOPO_MICIN_LOUDNESS:
case KSNODE_TOPO_MICOUT_LOUDNESS:
case KSNODE_TOPO_IEC_5V:
case KSNODE_TOPO_IEC_OUT:
case KSNODE_TOPO_IEC_INVERSE:
case KSNODE_TOPO_IEC_MONITOR:
case KSNODE_TOPO_IEC_SELECT:
case KSNODE_TOPO_XCHG_FB:
case KSNODE_TOPO_BASS2LINE:
case KSNODE_TOPO_CENTER2LINE:
case KSNODE_TOPO_IEC_COPYRIGHT:
case KSNODE_TOPO_IEC_POLVALID:
case KSNODE_TOPO_IEC_LOOP:
case KSNODE_TOPO_REAR2LINE:
supported = true;
}
if ((PropertyRequest->Node == KSNODE_TOPO_CENTER2MIC) && (that->cm->chipVersion > 37)) {
supported = true;
}
}
if (supported) {
if (PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION))) {
PKSPROPERTY_DESCRIPTION PropDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
PropDesc->AccessFlags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT;
PropDesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = VT_BOOL;
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 0;
PropDesc->Reserved = 0;
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_SUCCESS;
} else if (PropertyRequest->ValueSize >= sizeof(ULONG)) {
PULONG AccessFlags = PULONG(PropertyRequest->Value);
*AccessFlags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_BASICSUPPORT;
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
}
}
return ntStatus;
}
static NTSTATUS BasicSupportHandler(PPCPROPERTY_REQUEST PropertyRequest)
{
PAGED_CODE();
ASSERT(PropertyRequest);
DBGPRINT(("[BasicSupportHandler]"));
NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
if (PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION))) {
PKSPROPERTY_DESCRIPTION PropDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
PropDesc->AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET;
PropDesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG);
PropDesc->PropTypeSet.Set = KSPROPTYPESETID_General;
PropDesc->PropTypeSet.Id = VT_I4;
PropDesc->PropTypeSet.Flags = 0;
PropDesc->MembersListCount = 1;
PropDesc->Reserved = 0;
if (PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG))) {
PKSPROPERTY_MEMBERSHEADER Members = PKSPROPERTY_MEMBERSHEADER(PropDesc + 1);
Members->MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES;
Members->MembersSize = sizeof(KSPROPERTY_STEPPING_LONG);
Members->MembersCount = 1;
Members->Flags = 0;
PKSPROPERTY_STEPPING_LONG Range = PKSPROPERTY_STEPPING_LONG(Members + 1);
for (int i=0;i<SIZEOF_ARRAY(VolTable);i++) {
if (VolTable[i].node == PropertyRequest->Node) {
Range->Bounds.SignedMaximum = (VolTable[i].max << 16);
Range->Bounds.SignedMinimum = (VolTable[i].min << 16);
Range->SteppingDelta = (VolTable[i].step << 16);
ntStatus = STATUS_SUCCESS;
}
}
if (!NT_SUCCESS(ntStatus)) {
switch (PropertyRequest->Node) {
case KSNODE_TOPO_AUX_VOLUME:
Range->Bounds.SignedMaximum = 0;
Range->Bounds.SignedMinimum = (-60 << 16);
Range->SteppingDelta = (4 << 16);
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_MICIN_VOLUME:
Range->Bounds.SignedMaximum = 0;
Range->Bounds.SignedMinimum = (-56 << 16);
Range->SteppingDelta = (8 << 16);
ntStatus = STATUS_SUCCESS;
break;
}
}
Range->Reserved = 0;
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG);
} else {
PropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION);
ntStatus = STATUS_SUCCESS;
}
} else if (PropertyRequest->ValueSize >= sizeof(ULONG)) {
PULONG AccessFlags = PULONG(PropertyRequest->Value);
*AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET;
PropertyRequest->ValueSize = sizeof(ULONG);
ntStatus = STATUS_SUCCESS;
}
return ntStatus;
}
static NTSTATUS PropertyHandler_Level(PPCPROPERTY_REQUEST PropertyRequest)
{
PAGED_CODE();
ASSERT(PropertyRequest);
DBGPRINT(("[PropertyHandler_Level]"));
CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
UInt32 channel;
UInt8 mixerValue;
if ((PropertyRequest->Node == ULONG(-1)) || (PropertyRequest->Node >= KSNODE_TOPO_INVALID) || (PropertyRequest->PropertyItem->Id != KSPROPERTY_AUDIO_VOLUMELEVEL)) {
return ntStatus;
}
if ( ((PropertyRequest->Verb & KSPROPERTY_TYPE_GET) || (PropertyRequest->Verb & KSPROPERTY_TYPE_SET)) && (PropertyRequest->InstanceSize >= sizeof(LONG)) ) {
channel = *(PLONG(PropertyRequest->Instance));
if ((PropertyRequest->Node == KSNODE_TOPO_MICOUT_VOLUME) && (channel != CHAN_LEFT)) {
return STATUS_INVALID_PARAMETER;
}
if ( ( (channel == CHAN_LEFT) || (channel == CHAN_RIGHT) ) && (PropertyRequest->ValueSize >= sizeof(LONG))) {
PLONG Level = (PLONG)PropertyRequest->Value;
for (int i=0;i<SIZEOF_ARRAY(VolTable);i++)
{
if (VolTable[i].node == PropertyRequest->Node) {
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
mixerValue = (that->CMIAdapter->readMixer(VolTable[i].reg+channel) >> VolTable[i].shift) & VolTable[i].mask;
*Level = that->NodeCache[(2*PropertyRequest->Node)+channel];
if (mixerValue != ((*Level >> (VolTable[i].dbshift+16))+VolTable[i].mask)) {
*Level = (mixerValue - VolTable[i].mask) << (16+VolTable[i].dbshift);
that->NodeCache[(2*PropertyRequest->Node)+channel] = *Level;
}
} else
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Level <= (VolTable[i].min << 16)) {
mixerValue = 0;
that->NodeCache[(2*PropertyRequest->Node)+channel] = VolTable[i].min << 16;
} else
if (*Level >= (VolTable[i].max << 16)) {
mixerValue = VolTable[i].mask;
that->NodeCache[(2*PropertyRequest->Node)+channel] = VolTable[i].max << 16;
} else {
mixerValue = ((*Level >> (VolTable[i].dbshift+16)) + VolTable[i].mask) & VolTable[i].mask;
that->NodeCache[(2*PropertyRequest->Node)+channel] = *Level;
}
that->CMIAdapter->writeMixer(VolTable[i].reg+channel, mixerValue << VolTable[i].shift);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -