⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mintopo.cpp

📁 C-Media8738/8768声卡驱动开发源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				}
			}
		}
		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 + -