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 + -
显示快捷键?