mintopo.cpp
来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C++ 代码 · 共 1,496 行 · 第 1/4 页
CPP
1,496 行
ntStatus = SettingsKey->SetValueKey(&KeyName, REG_DWORD, PVOID(&Value), sizeof(DWORD));
if(!NT_SUCCESS(ntStatus)) {
DBGPRINT(("SetValueKey() failed"));
break;
}
}
}
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;
}
STDMETHODIMP CCMITopology::loadMixerSettingsFromMemory()
{
PAGED_CODE();
DBGPRINT(("CCMITopology::loadMixerSettingsFromMemory"));
CMIAdapter->resetMixer();
CMIAdapter->loadSBMixerFromMemory();
CMIAdapter->writeUInt8(REG_MIXER1, mixer1Register);
CMIAdapter->writeUInt8(REG_MIXER2, auxVolumeRegister);
CMIAdapter->writeUInt8(REG_MIXER3, micVolumeRegister);
CMIAdapter->writeUInt8(REG_MIXER4, mixer4Register);
CMIAdapter->setUInt32Bit(REG_FUNCTRL1, functrl1Register);
CMIAdapter->setUInt32Bit(REG_CHFORMAT, chformatRegister);
CMIAdapter->setUInt32Bit(REG_LEGACY, legacyRegister);
CMIAdapter->setUInt32Bit(REG_MISCCTRL, miscctrlRegister);
return STATUS_SUCCESS;
}
STDMETHODIMP CCMITopology::storeMixerSettingsToMemory()
{
PAGED_CODE();
DBGPRINT(("CCMITopology::storeMixerSettingsToMemory"));
mixer1Register = CMIAdapter->readUInt8(REG_MIXER1);
mixer4Register = CMIAdapter->readUInt8(REG_MIXER4);
functrl1Register = CMIAdapter->readUInt32(REG_FUNCTRL1) & LOOP_SPDF ;
chformatRegister = CMIAdapter->readUInt32(REG_CHFORMAT) & (INV_SPDIFI1 | SEL_SPDIFI1 | POLVALID);
legacyRegister = CMIAdapter->readUInt32(REG_LEGACY) & (BASS2LINE | CENTER2LINE | EN_SPDCOPYRHT);
miscctrlRegister = CMIAdapter->readUInt32(REG_MISCCTRL) & (EN_SPDO5V | SEL_SPDIFI2);
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?