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

📄 mintopo.cpp

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