📄 mintopo.cpp
字号:
}
}
}
if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_LOUDNESS)) {
PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
PropertyHandler_OnOff(&PropertyRequest);
ntStatus = RtlStringCbPrintfW(buffer, sizeof(buffer), L"Node%dLeft", i);
if (!NT_SUCCESS(ntStatus)) {
DBGPRINT(("RtlStringCbPrintfW() failed"));
}
RtlInitUnicodeString(&KeyName, buffer);
Channel = CHAN_LEFT;
ntStatus = PropertyHandler_OnOff(&PropertyRequest);
if (NT_SUCCESS(ntStatus)) {
ntStatus = SettingsKey->SetValueKey(&KeyName, REG_DWORD, PVOID(&Value), sizeof(DWORD));
if(!NT_SUCCESS(ntStatus)) {
DBGPRINT(("SetValueKey() failed"));
break;
}
}
ntStatus = RtlStringCbPrintfW(buffer, sizeof(buffer), L"Node%dRight", i);
if (!NT_SUCCESS(ntStatus)) {
DBGPRINT(("RtlStringCbPrintfW() failed"));
}
RtlInitUnicodeString(&KeyName, buffer);
Channel = CHAN_RIGHT;
ntStatus = PropertyHandler_OnOff(&PropertyRequest);
if (NT_SUCCESS(ntStatus)) {
ntStatus = SettingsKey->SetValueKey(&KeyName, REG_DWORD, PVOID(&Value), sizeof(DWORD));
if(!NT_SUCCESS(ntStatus)) {
DBGPRINT(("SetValueKey() failed"));
break;
}
}
}
}
Value = cm->formatMask;
RtlInitUnicodeString(&KeyName, L"FormatMask");
ntStatus = SettingsKey->SetValueKey(&KeyName, REG_DWORD, PVOID(&Value), sizeof(DWORD));
if (!NT_SUCCESS(ntStatus)) {
DBGPRINT(("SetValueKey() failed"));
}
SettingsKey->Release();
DriverKey->Release();
return STATUS_SUCCESS;
}
static NTSTATUS PropertyHandler_OnOff(PPCPROPERTY_REQUEST PropertyRequest)
{
PAGED_CODE();
ASSERT(PropertyRequest);
DBGPRINT(("[PropertyHandler_OnOff]"));
CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
UInt8 data, mask, reg;
LONG channel;
if (PropertyRequest->Node == ULONG(-1)) {
return ntStatus;
}
if ( ((PropertyRequest->Verb & KSPROPERTY_TYPE_GET) || (PropertyRequest->Verb & KSPROPERTY_TYPE_SET)) && (PropertyRequest->InstanceSize >= sizeof(LONG)) ) {
channel = *(PLONG(PropertyRequest->Instance));
if (PropertyRequest->ValueSize >= sizeof(BOOL)) {
if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_MUTE) {
PBOOL Muted = PBOOL(PropertyRequest->Value);
switch (PropertyRequest->Node) {
case KSNODE_TOPO_WAVEOUT_MUTE:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = (that->CMIAdapter->readUInt8(REG_MIXER1) & MUTE_WAVE);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->setUInt8Bit(REG_MIXER1, MUTE_WAVE);
} else {
that->CMIAdapter->clearUInt8Bit(REG_MIXER1, MUTE_WAVE);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_AUX_MUTE:
switch (channel) {
case CHAN_LEFT: mask = MUTE_AUX_L; break;
case CHAN_RIGHT: mask = MUTE_AUX_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->micVolumeRegister & mask);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->micVolumeRegister &= ~mask;
} else {
that->micVolumeRegister |= mask;
}
that->CMIAdapter->writeUInt8(REG_MIXER2, that->micVolumeRegister);
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_MICOUT_MUTE:
if (channel != CHAN_LEFT) {
return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(SBREG_OUTPUTCTRL) & EN_MIC);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(SBREG_OUTPUTCTRL, EN_MIC);
} else {
that->CMIAdapter->setMixerBit(SBREG_OUTPUTCTRL, EN_MIC);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_CD_MUTE:
switch (channel) {
case CHAN_LEFT: mask = EN_CD_L; break;
case CHAN_RIGHT: mask = EN_CD_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(SBREG_OUTPUTCTRL) & mask);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(SBREG_OUTPUTCTRL, mask);
} else {
that->CMIAdapter->setMixerBit(SBREG_OUTPUTCTRL, mask);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_LINEIN_MUTE:
switch (channel) {
case CHAN_LEFT: mask = EN_LINEIN_L; break;
case CHAN_RIGHT: mask = EN_LINEIN_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(SBREG_OUTPUTCTRL) & mask);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(SBREG_OUTPUTCTRL, mask);
} else {
that->CMIAdapter->setMixerBit(SBREG_OUTPUTCTRL, mask);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_MIC_MUTE_IN:
if (channel != CHAN_LEFT) {
return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(SBREG_IN_CTRL_L) & EN_MIC);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(SBREG_IN_CTRL_L, EN_MIC);
that->CMIAdapter->clearMixerBit(SBREG_IN_CTRL_R, EN_MIC);
} else {
that->CMIAdapter->setMixerBit(SBREG_IN_CTRL_L, EN_MIC);
that->CMIAdapter->setMixerBit(SBREG_IN_CTRL_R, EN_MIC);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_CD_MUTE_IN:
switch (channel) {
case CHAN_LEFT: mask = EN_LINEIN_L; reg = EN_CD_L; break;
case CHAN_RIGHT: mask = EN_LINEIN_R; reg = EN_CD_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(reg) & mask);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(reg, mask);
} else {
that->CMIAdapter->setMixerBit(reg, mask);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_LINEIN_MUTE_IN:
switch (channel) {
case CHAN_LEFT: mask = EN_LINEIN_L; reg = SBREG_IN_CTRL_L; break;
case CHAN_RIGHT: mask = EN_LINEIN_R; reg = SBREG_IN_CTRL_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = !(that->CMIAdapter->readMixer(reg) & mask);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->CMIAdapter->clearMixerBit(reg, mask);
} else {
that->CMIAdapter->setMixerBit(reg, mask);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_AUX_MUTE_IN:
switch (channel) {
case CHAN_LEFT: mask = MUTE_RAUX_L; break;
case CHAN_RIGHT: mask = MUTE_RAUX_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = (that->micVolumeRegister & mask) ;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->micVolumeRegister |= mask;
} else {
that->micVolumeRegister &= ~mask;
}
that->CMIAdapter->writeUInt8(REG_MIXER2, that->micVolumeRegister);
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_WAVEOUT_MUTE_IN:
switch (channel) {
case CHAN_LEFT: mask = EN_WAVEIN_L; break;
case CHAN_RIGHT: mask = EN_WAVEIN_R; break;
default: return ntStatus;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
// *Muted = !(that->CMIAdapter->readUInt8(REG_MIXER1) & mask);
*Muted = !(that->cm->enableSPDIFIn);
ntStatus = STATUS_SUCCESS;
}
if ((PropertyRequest->Verb & KSPROPERTY_TYPE_SET) && !(that->settingsLoaded)) {
if (*Muted) {
that->cm->enableSPDIFIn = FALSE;
that->CMIAdapter->clearUInt8Bit(REG_MIXER1, mask);
} else {
that->cm->enableSPDIFIn = TRUE;
that->CMIAdapter->setUInt8Bit(REG_MIXER1, mask);
}
ntStatus = STATUS_SUCCESS;
}
break;
case KSNODE_TOPO_MASTER_MUTE_DUMMY:
channel = (1 << channel);
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*Muted = that->masterMuteDummy & channel;
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*Muted) {
that->masterMuteDummy |= channel;
} else {
that->masterMuteDummy &= ~channel;
}
}
ntStatus = STATUS_SUCCESS;
break;
}
}
if (PropertyRequest->PropertyItem->Id == KSPROPERTY_AUDIO_LOUDNESS) {
PBOOL LoudnessOn = PBOOL(PropertyRequest->Value);
switch (PropertyRequest->Node) {
case KSNODE_TOPO_MICIN_LOUDNESS:
if (channel == CHAN_LEFT) {
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readMixer(SBREG_EXTENSION) & EN_MICBOOST);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
// DBGPRINT(("setting mic boost: previous state %d, new state %d", (that->CMIAdapter->readMixer(SBREG_EXTENSION) & EN_MICBOOST), (*LoudnessOn)));
if (*LoudnessOn) {
that->CMIAdapter->setMixerBit(SBREG_EXTENSION, EN_MICBOOST);
} else {
that->CMIAdapter->clearMixerBit(SBREG_EXTENSION, EN_MICBOOST);
}
}
ntStatus = STATUS_SUCCESS;
}
break;
case KSNODE_TOPO_MICOUT_LOUDNESS:
if (channel == CHAN_LEFT) {
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = !(that->CMIAdapter->readUInt8(REG_MIXER2) & DIS_MICGAIN);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*LoudnessOn) {
that->CMIAdapter->clearUInt8Bit(REG_MIXER2, DIS_MICGAIN);
} else {
that->CMIAdapter->setUInt8Bit(REG_MIXER2, DIS_MICGAIN);
}
}
ntStatus = STATUS_SUCCESS;
}
break;
case KSNODE_TOPO_IEC_5V:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_MISCCTRL) & EN_SPDO5V);
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*LoudnessOn) {
that->CMIAdapter->setUInt32Bit(REG_MISCCTRL, EN_SPDO5V);
} else {
that->CMIAdapter->clearUInt32Bit(REG_MISCCTRL, EN_SPDO5V);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_OUT:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
if (that->cm) {
*LoudnessOn = that->cm->enableSPDIFOut;
}
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (that->cm) {
that->cm->enableSPDIFOut = (*LoudnessOn);
}
}
ntStatus = STATUS_SUCCESS;
break;
case KSNODE_TOPO_IEC_INVERSE:
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
if (that->cm->chipVersion <= 37) {
*LoudnessOn = (that->CMIAdapter->readUInt8(REG_MIXER4) & INV_SPDIFI1);
} else {
*LoudnessOn = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & INV_SPDIFI2);
}
}
if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
if (*LoudnessOn) {
if (that->cm->chipVersion <= 37) {
that->CMIAdapter->setUInt8Bit(REG_MIXER4, INV_SPDIFI1);
} else {
that->CMIAdapter->setUInt32Bit(REG_CHFORMAT, INV_SPDIFI2);
}
} else {
if (that->cm->chipVersion <= 37) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -