Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / reactos / drivers / wdm / audio / drivers / CMIDriver / mintopo.cpp
diff --git a/reactos/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp b/reactos/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
deleted file mode 100644 (file)
index 061197b..0000000
+++ /dev/null
@@ -1,1513 +0,0 @@
-/*
-Copyright (c) 2006-2008 dogbert <dogber1@gmail.com>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. The name of the author may not be used to endorse or promote products
-   derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include "limits.h"
-#include "mintopo.hpp"
-#include "mintopotables.hpp"
-#define NTSTRSAFE_LIB //for Windows 2000 compatibility
-#include "ntstrsafe.h"
-
-#ifdef _MSC_VER
-#pragma code_seg("PAGE")
-#endif
-
-NTSTATUS NTAPI CreateMiniportTopologyCMI(PUNKNOWN* Unknown, REFCLSID, PUNKNOWN UnknownOuter, POOL_TYPE PoolType)
-{
-       PAGED_CODE();
-       ASSERT(Unknown);
-       STD_CREATE_BODY_(CCMITopology,Unknown,UnknownOuter,PoolType,PMINIPORTTOPOLOGY);
-}
-
-STDMETHODIMP CCMITopology::NonDelegatingQueryInterface(REFIID Interface, PVOID* Object)
-{
-       PAGED_CODE();
-       ASSERT(Object);
-       DBGPRINT(("CCMITopology::NonDelegatingQueryInterface"));
-
-       if (IsEqualGUIDAligned(Interface,IID_IUnknown)) {
-               *Object = PVOID(PUNKNOWN(PMINIPORTTOPOLOGY(this)));
-       } else if (IsEqualGUIDAligned(Interface,IID_IMiniport)) {
-               *Object = PVOID(PMINIPORT(this));
-       } else if (IsEqualGUIDAligned(Interface,IID_IMiniportTopology)) {
-               *Object = PVOID(PMINIPORTTOPOLOGY(this));
-       } else if (IsEqualGUIDAligned (Interface, IID_ICMITopolgy)) {
-               *Object = (PVOID)(PMINIPORTTOPOLOGY)this;
-       } else {
-               *Object = NULL;
-       }
-
-       if (*Object) {
-               PUNKNOWN(*Object)->AddRef();
-               return STATUS_SUCCESS;
-       }
-
-       return STATUS_INVALID_PARAMETER;
-}
-
-CCMITopology::~CCMITopology()
-{
-       PAGED_CODE();
-
-       DBGPRINT(("CCMITopology::~CCMITopology"));
-
-       storeMixerSettingsToRegistry(); //or not. during system shutdown, this doesn't seem to work.
-       cm->TopoMiniport = NULL;
-
-       if (CMIAdapter) {
-               CMIAdapter->Release();
-       }
-}
-
-STDMETHODIMP CCMITopology::Init(PUNKNOWN UnknownAdapter, PRESOURCELIST ResourceList, PPORTTOPOLOGY Port)
-{
-       PAGED_CODE();
-       ASSERT(UnknownAdapter);
-       ASSERT(Port);
-       DBGPRINT(("CCMITopology::Init"));
-
-       NTSTATUS ntStatus = UnknownAdapter->QueryInterface(IID_ICMIAdapter, (PVOID *)&CMIAdapter);
-
-       if (!NT_SUCCESS(ntStatus)) {
-               DBGPRINT(("UnknownAdapter->QueryInterface() failed"));
-               return STATUS_INVALID_PARAMETER;
-       }
-
-       CMIAdapter->resetMixer();
-       auxVolumeRegister = CMIAdapter->readUInt8(REG_MIXER3);
-       micVolumeRegister = CMIAdapter->readUInt8(REG_MIXER2);
-       functrl1Register = 0;
-       chformatRegister = 0;
-       legacyRegister   = 0;
-       miscctrlRegister = 0;
-
-       cm = CMIAdapter->getCMI8738Info();
-       cm->TopoMiniport = this; //this is not really nice
-       loadMixerSettingsFromRegistry();
-
-       return STATUS_SUCCESS;
-}
-
-STDMETHODIMP CCMITopology::GetDescription(PPCFILTER_DESCRIPTOR*  OutFilterDescriptor)
-{
-    PAGED_CODE();
-    ASSERT(OutFilterDescriptor);
-    DBGPRINT(("CCMITopology::GetDescription"));
-
-    *OutFilterDescriptor = &MiniportFilterDescriptor;
-
-    return STATUS_SUCCESS;
-}
-
-STDMETHODIMP CCMITopology::loadMixerSettingsFromRegistry()
-{
-       PAGED_CODE();
-       DBGPRINT(("CCMITopology::loadMixerSettingsFromRegistry"));
-
-       PREGISTRYKEY       DriverKey;
-       PREGISTRYKEY       SettingsKey;
-       UNICODE_STRING     KeyName;
-       PCPROPERTY_REQUEST PropertyRequest;
-       PCPROPERTY_ITEM    PropertyItem;
-       DWORD              Channel;
-       PVOID              KeyInfo;
-       ULONG              ResultLength;
-       WCHAR              buffer[128];
-
-       if ((!CMIAdapter) || (!(CMIAdapter->getDeviceObject()))) {
-               DBGPRINT(("CMIAdapter->getDeviceObject() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       settingsLoaded = FALSE;
-
-       NTSTATUS ntStatus = PcNewRegistryKey(&DriverKey, NULL, DriverRegistryKey, KEY_ALL_ACCESS, CMIAdapter->getDeviceObject(), NULL, NULL, 0, NULL);
-
-       if(!NT_SUCCESS(ntStatus)) {
-               DBGPRINT(("PcNewRegistryKey() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       RtlInitUnicodeString(&KeyName, L"Settings");
-
-       ntStatus = DriverKey->NewSubKey(&SettingsKey, NULL, KEY_ALL_ACCESS, &KeyName, REG_OPTION_NON_VOLATILE, NULL);
-       if(!NT_SUCCESS(ntStatus)) {
-               DBGPRINT(("DriverKey->NewSubKey() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       KeyInfo = ExAllocatePoolWithTag(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD), 'dbrt');
-       if(KeyInfo == NULL) {
-               DBGPRINT(("ExAllocatePoolWithTag() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       PropertyRequest.MajorTarget  = this;
-       PropertyRequest.Verb         = KSPROPERTY_TYPE_SET;
-       PropertyRequest.Instance     = &Channel;
-       PropertyRequest.InstanceSize = sizeof(DWORD);
-       PropertyRequest.Value        = &(PKEY_VALUE_PARTIAL_INFORMATION(KeyInfo)->Data);
-       PropertyRequest.ValueSize    = sizeof(DWORD);
-       PropertyRequest.PropertyItem = &PropertyItem;
-
-       for (unsigned int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
-               PropertyRequest.Node = i;
-
-               Channel = CHAN_LEFT;
-               ntStatus = RtlStringCbPrintfW(buffer, sizeof(buffer), L"Node%dLeft", i);
-               if (!NT_SUCCESS(ntStatus)) {
-                       DBGPRINT(("RtlStringCbPrintfW() failed"));
-               }
-               RtlInitUnicodeString(&KeyName, buffer);
-               ntStatus = SettingsKey->QueryValueKey(&KeyName, KeyValuePartialInformation, KeyInfo, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD), &ResultLength);
-               if (NT_SUCCESS(ntStatus)) {
-                       if(PKEY_VALUE_PARTIAL_INFORMATION(KeyInfo)->DataLength == sizeof(DWORD)) {
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_VOLUME)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
-                                       PropertyHandler_Level(&PropertyRequest);
-                               }
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_MUTE)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_MUTE;
-                                       PropertyHandler_OnOff(&PropertyRequest);
-                               }
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_LOUDNESS)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                                       PropertyHandler_OnOff(&PropertyRequest);
-                               }
-                       }
-               } else {
-                       // default values
-                       if (i == KSNODE_TOPO_IEC_OUT) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                               *(PBOOL(PropertyRequest.Value)) = true;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-                       if (i == KSNODE_TOPO_WAVEOUT_MUTE_IN) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_MUTE;
-                               *(PBOOL(PropertyRequest.Value)) = true;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-                       if (i == KSNODE_TOPO_CENTER2MIC) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                               *(PBOOL(PropertyRequest.Value)) = false;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-                       if (i == KSNODE_TOPO_IEC_MONITOR) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                               *(PBOOL(PropertyRequest.Value)) = true;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-               }
-
-               Channel = CHAN_RIGHT;
-               ntStatus = RtlStringCbPrintfW(buffer, sizeof(buffer), L"Node%dRight", i);
-               if (!NT_SUCCESS(ntStatus)) {
-                       DBGPRINT(("RtlStringCbPrintfW() failed"));
-               }
-               RtlInitUnicodeString(&KeyName, buffer);
-               ntStatus = SettingsKey->QueryValueKey(&KeyName, KeyValuePartialInformation, KeyInfo, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD), &ResultLength);
-               if (NT_SUCCESS(ntStatus)) {
-                       if(PKEY_VALUE_PARTIAL_INFORMATION(KeyInfo)->DataLength == sizeof(DWORD)) {
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_VOLUME)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
-                                       PropertyHandler_Level(&PropertyRequest);
-                               }
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_MUTE)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_MUTE;
-                                       PropertyHandler_OnOff(&PropertyRequest);
-                               }
-                               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_LOUDNESS)) {
-                                       PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                                       PropertyHandler_OnOff(&PropertyRequest);
-                               }
-                       }
-               } else {
-                       if (i == KSNODE_TOPO_IEC_OUT) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_LOUDNESS;
-                               *(PBOOL(PropertyRequest.Value)) = true;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-                       if (i == KSNODE_TOPO_WAVEOUT_MUTE_IN) {
-                               PropertyItem.Id = KSPROPERTY_AUDIO_MUTE;
-                               *(PBOOL(PropertyRequest.Value)) = true;
-                               PropertyHandler_OnOff(&PropertyRequest);
-                       }
-               }
-
-       }
-       RtlInitUnicodeString(&KeyName, L"FormatMask");
-       ntStatus = SettingsKey->QueryValueKey(&KeyName, KeyValuePartialInformation, KeyInfo, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD), &ResultLength);
-       if (NT_SUCCESS (ntStatus)) {
-               PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION)KeyInfo;
-               if (PartialInfo->DataLength == sizeof(DWORD)) {
-                       cm->formatMask = (*(PLONG)PartialInfo->Data);
-               }
-       } else {
-               cm->formatMask = FMT_441_PCM | FMT_441_MULTI_PCM | FMT_441_DOLBY | FMT_480_PCM | FMT_480_MULTI_PCM | FMT_480_DOLBY;
-               if (cm->chipVersion >= 68) {
-                       cm->formatMask |= FMT_882_PCM | FMT_882_MULTI_PCM | FMT_882_DOLBY | FMT_960_PCM | FMT_960_MULTI_PCM | FMT_960_DOLBY;
-               }
-       }
-
-       ExFreePoolWithTag (KeyInfo,'dbrt');
-
-       SettingsKey->Release();
-       DriverKey->Release();
-
-       settingsLoaded = TRUE;
-
-    return STATUS_SUCCESS;
-}
-
-STDMETHODIMP CCMITopology::storeMixerSettingsToRegistry()
-{
-       PAGED_CODE();
-       DBGPRINT(("CCMITopology::storeMixerSettingsToRegistry"));
-
-       PREGISTRYKEY       DriverKey;
-       PREGISTRYKEY       SettingsKey;
-       UNICODE_STRING     KeyName;
-       PCPROPERTY_REQUEST PropertyRequest;
-       PCPROPERTY_ITEM    PropertyItem;
-       DWORD              Value,Channel;
-       WCHAR              buffer[128];
-
-       if ((!CMIAdapter) || (!(CMIAdapter->getDeviceObject()))) {
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       NTSTATUS ntStatus = PcNewRegistryKey(&DriverKey, NULL, DriverRegistryKey, KEY_ALL_ACCESS, CMIAdapter->getDeviceObject(), NULL, NULL, 0, NULL);
-
-       if(!NT_SUCCESS(ntStatus)) {
-               DBGPRINT(("PcNewRegistryKey() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       RtlInitUnicodeString(&KeyName, L"Settings");
-
-       ntStatus = DriverKey->NewSubKey(&SettingsKey, NULL, KEY_ALL_ACCESS, &KeyName, REG_OPTION_NON_VOLATILE, NULL);
-
-       if(!NT_SUCCESS(ntStatus)) {
-               DBGPRINT(("DriverKey->NewSubKey() failed"));
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       PropertyRequest.MajorTarget  = this;
-       PropertyRequest.Verb         = KSPROPERTY_TYPE_GET;
-       PropertyRequest.Instance     = &Channel;
-       PropertyRequest.InstanceSize = sizeof(DWORD);
-       PropertyRequest.Value        = &Value;
-       PropertyRequest.ValueSize    = sizeof(DWORD);
-       PropertyRequest.PropertyItem = &PropertyItem;
-
-       for (unsigned int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
-               PropertyRequest.Node = i;
-               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_VOLUME)) {
-                       PropertyRequest.Node = i;
-                       PropertyItem.Id = KSPROPERTY_AUDIO_VOLUMELEVEL;
-
-                       ntStatus = RtlStringCbPrintfW(buffer, sizeof(buffer), L"Node%dLeft", i);
-                       if (!NT_SUCCESS(ntStatus)) {
-                               DBGPRINT(("RtlStringCbPrintfW() failed"));
-                       }
-                   RtlInitUnicodeString(&KeyName, buffer);
-                       Channel = CHAN_LEFT;
-                       ntStatus = PropertyHandler_Level(&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_Level(&PropertyRequest);
-                       if (NT_SUCCESS(ntStatus)) {
-                               ntStatus = SettingsKey->SetValueKey(&KeyName, REG_DWORD, PVOID(&Value), sizeof(DWORD));
-                               if(!NT_SUCCESS(ntStatus)) {
-                                       DBGPRINT(("SetValueKey() failed"));
-                                       break;
-                               }
-                       }
-
-               }
-               if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_MUTE)) {
-                       PropertyItem.Id = KSPROPERTY_AUDIO_MUTE;
-                       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;
-                               }
-                       }
-               }
-               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;
-}
-
-NTSTATUS NTAPI PropertyHandler_OnOff(PPCPROPERTY_REQUEST PropertyRequest)
-{
-       PAGED_CODE();
-       ASSERT(PropertyRequest);
-       DBGPRINT(("[PropertyHandler_OnOff]"));
-
-       CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
-
-       NTSTATUS  ntStatus = STATUS_INVALID_PARAMETER;
-       UInt8     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_CD_L; reg = SBREG_IN_CTRL_L; break;
-                                                       case CHAN_RIGHT: mask = EN_CD_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_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) {
-                                                               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) {
-                                                                       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) && !(that->settingsLoaded)) {
-                                                       if (*LoudnessOn) {
-                                                               that->CMIAdapter->setUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
-                                                       } else {
-                                                               that->CMIAdapter->clearUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
-                                                       }
-                                                       if (that->cm) {
-                                                               that->cm->enableSPDIFInMonitor = *LoudnessOn;
-                                                       }
-                                               }
-                                               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) && !(that->settingsLoaded)) {
-                                                       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 (unsigned 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;
-}
-
-NTSTATUS NTAPI 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 (unsigned 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);
-                                       }
-                                       ntStatus = STATUS_SUCCESS;
-                               }
-                       }
-                       if (PropertyRequest->Node == KSNODE_TOPO_AUX_VOLUME) {
-                               if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
-                                       mixerValue = that->auxVolumeRegister;
-                                       *Level     = that->NodeCache[(2*PropertyRequest->Node)+channel];
-                                       if (channel == CHAN_LEFT) {
-                                               mixerValue >>= 4;
-                                       }
-                                       mixerValue &= 0x0F;
-                                       if (mixerValue != ((*Level >> 18)+0x0F)) {
-                                               *Level = (mixerValue - 0x0F) << 18;
-                                               that->NodeCache[(2*PropertyRequest->Node)+channel] = *Level;
-                                       }
-                               } else
-                               if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
-                                       if (*Level <= (-30 << 16)) {
-                                               mixerValue = 0;
-                                               that->NodeCache[(2*PropertyRequest->Node)+channel] = -30 << 16;
-                                       } else
-                                       if (*Level >= 0) {
-                                               mixerValue = 0x0F;
-                                               that->NodeCache[(2*PropertyRequest->Node)+channel] = 0;
-                                       } else  {
-                                               mixerValue = ((*Level >> 18) + 0x0F) & 0x0F;
-                                               that->NodeCache[(2*PropertyRequest->Node)+channel] = *Level;
-                                       }
-
-                                       if (channel == CHAN_RIGHT) {
-                                               that->auxVolumeRegister = (that->auxVolumeRegister & 0xF0) | mixerValue;
-                                       } else if (channel == CHAN_LEFT) {
-                                               that->auxVolumeRegister = (that->auxVolumeRegister & 0x0F) | (mixerValue << 4);
-                                       }
-                                       that->CMIAdapter->writeUInt8(REG_MIXER3, that->auxVolumeRegister);
-                               }
-                               ntStatus = STATUS_SUCCESS;
-                       }
-                       if ((PropertyRequest->Node == KSNODE_TOPO_MICIN_VOLUME) && (channel == CHAN_LEFT)) {
-                               if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
-                                       *Level     = that->NodeCache[(2*PropertyRequest->Node)];
-                                       mixerValue = that->micVolumeRegister >> 1 & 0x7;
-                                       if (mixerValue != ((*Level >> 19)+0x07)) {
-                                               *Level = (mixerValue - 0x07) << 19;
-                                               that->NodeCache[(2*PropertyRequest->Node)] = *Level;
-                                       }
-                               } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
-                                       if (*Level <= (-56 << 16)) {
-                                               mixerValue = 0;
-                                               that->NodeCache[(2*PropertyRequest->Node)] = -56 << 16;
-                                       } else if (*Level >= 0) {
-                                               mixerValue = 0x07;
-                                               that->NodeCache[(2*PropertyRequest->Node)] = 0;
-                                       } else {
-                                               mixerValue = ((*Level >> 19) + 0x07) & 0x07;
-                                               that->NodeCache[(2*PropertyRequest->Node)] = *Level;
-                                       }
-                                       that->micVolumeRegister &= ~(0x07 << 1);
-                                       that->micVolumeRegister |= mixerValue << 1;
-                                       that->CMIAdapter->writeUInt8(REG_MIXER2, that->micVolumeRegister);
-                               }
-                               ntStatus = STATUS_SUCCESS;
-                       }
-                       if ((NT_SUCCESS(ntStatus)) && (PropertyRequest->Verb & KSPROPERTY_TYPE_GET)) {
-                               PropertyRequest->ValueSize = sizeof(LONG);
-                       }
-               }
-       } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) {
-               switch(PropertyRequest->Node) {
-                       case KSNODE_TOPO_LINEOUT_VOLUME:
-                       case KSNODE_TOPO_WAVEOUT_VOLUME:
-                       case KSNODE_TOPO_CD_VOLUME:
-                       case KSNODE_TOPO_LINEIN_VOLUME:
-                       case KSNODE_TOPO_MICOUT_VOLUME:
-                       case KSNODE_TOPO_MICIN_VOLUME:
-                       case KSNODE_TOPO_AUX_VOLUME:
-                               ntStatus = BasicSupportHandler(PropertyRequest);
-                               break;
-               }
-       }
-
-       return ntStatus;
-}
-
-NTSTATUS NTAPI PropertyHandler_CpuResources(PPCPROPERTY_REQUEST   PropertyRequest)
-{
-       PAGED_CODE();
-       ASSERT(PropertyRequest);
-       DBGPRINT(("[PropertyHandler_CpuResources]"));
-
-       NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-
-       if (PropertyRequest->Node == (ULONG)-1) {
-               return ntStatus;
-       }
-       if (PropertyRequest->Node >= KSNODE_TOPO_INVALID) {
-               return ntStatus;
-       }
-
-       if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
-               if (PropertyRequest->ValueSize >= sizeof(LONG)) {
-                       *((PLONG)PropertyRequest->Value) = KSAUDIO_CPU_RESOURCES_NOT_HOST_CPU;
-
-                       PropertyRequest->ValueSize = sizeof(LONG);
-                       ntStatus = STATUS_SUCCESS;
-               } else  {
-                       ntStatus = STATUS_BUFFER_TOO_SMALL;
-               }
-       } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) {
-               if (PropertyRequest->ValueSize >= (sizeof(KSPROPERTY_DESCRIPTION))) {
-                       PKSPROPERTY_DESCRIPTION PropDesc = PKSPROPERTY_DESCRIPTION(PropertyRequest->Value);
-
-                       PropDesc->AccessFlags       = KSPROPERTY_TYPE_BASICSUPPORT |
-                                                     KSPROPERTY_TYPE_GET;
-                       PropDesc->DescriptionSize   = sizeof(KSPROPERTY_DESCRIPTION);
-                       PropDesc->PropTypeSet.Set   = KSPROPTYPESETID_General;
-                       PropDesc->PropTypeSet.Id    = VT_I4;
-                       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_BASICSUPPORT | KSPROPERTY_TYPE_GET;
-
-                       PropertyRequest->ValueSize = sizeof(ULONG);
-                       ntStatus = STATUS_SUCCESS;
-               }
-       }
-
-       return ntStatus;
-}
-
-NTSTATUS NTAPI PropertyHandler_ComponentId(PPCPROPERTY_REQUEST PropertyRequest)
-{
-       PAGED_CODE();
-       ASSERT(PropertyRequest);
-       DBGPRINT(("[PropertyHandler_ComponentId]"));
-
-       NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-       CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
-
-       if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
-               if (PropertyRequest->ValueSize >= sizeof(KSCOMPONENTID)) {
-                       PKSCOMPONENTID pComponentId = (PKSCOMPONENTID)PropertyRequest->Value;
-
-                       pComponentId->Manufacturer = MANUFACTURER_CM8738;
-                       pComponentId->Product      = PRODUCT_CM8738;
-                       pComponentId->Component    = COMPONENT_CM8738;
-                       pComponentId->Name         = GUID_NULL;
-                       pComponentId->Version      = CMIPCI_VERSION;
-                       pComponentId->Revision     = that->cm->chipVersion;
-
-                       PropertyRequest->ValueSize = sizeof(KSCOMPONENTID);
-                       ntStatus = STATUS_SUCCESS;
-               } else if (PropertyRequest->ValueSize == 0) {
-                       PropertyRequest->ValueSize = sizeof(KSCOMPONENTID);
-                       ntStatus = STATUS_BUFFER_OVERFLOW;
-               } else {
-                       PropertyRequest->ValueSize = 0;
-                       ntStatus = STATUS_BUFFER_TOO_SMALL;
-               }
-       } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) {
-               if (PropertyRequest->ValueSize >= sizeof(ULONG)) {
-                       PULONG AccessFlags = PULONG(PropertyRequest->Value);
-
-                       *AccessFlags = KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET;
-
-                       PropertyRequest->ValueSize = sizeof(ULONG);
-                       ntStatus = STATUS_SUCCESS;
-               } else {
-                       PropertyRequest->ValueSize = 0;
-                       ntStatus = STATUS_BUFFER_TOO_SMALL;
-               }
-       }
-
-       return ntStatus;
-}
-
-NTSTATUS NTAPI PropertyHandler_Private(PPCPROPERTY_REQUEST PropertyRequest)
-{
-       PAGED_CODE();
-       ASSERT(PropertyRequest);
-       DBGPRINT(("[PropertyHandler_Private]"));
-
-       NTSTATUS     ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-       CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
-
-       if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
-               if (PropertyRequest->PropertyItem->Id != KSPROPERTY_CMI_GET) {
-                       return STATUS_INVALID_DEVICE_REQUEST;
-               }
-
-               if (PropertyRequest->ValueSize == 0) {
-                       PropertyRequest->ValueSize = sizeof(CMIDATA);
-                       return STATUS_BUFFER_OVERFLOW;
-               } else if (PropertyRequest->ValueSize < sizeof (CMIDATA)) {
-                       PropertyRequest->ValueSize = 0;
-                       return STATUS_BUFFER_TOO_SMALL;
-               }
-
-               CMIDATA* cmiData = (CMIDATA*)PropertyRequest->Value;
-#ifdef WAVERT
-               RtlStringCbPrintfA(cmiData->driverVersion, sizeof(cmiData->driverVersion), CMIVERSION "-WaveRT");
-#else
-               RtlStringCbPrintfA(cmiData->driverVersion, sizeof(cmiData->driverVersion), CMIVERSION);
-#endif
-               cmiData->hardwareRevision    = that->cm->chipVersion;
-               cmiData->maxChannels         = that->cm->maxChannels;
-               cmiData->IOBase              = (USHORT)((ULONG_PTR)that->cm->IOBase);
-               cmiData->MPUBase             = (USHORT)((ULONG_PTR)that->cm->MPUBase);
-               cmiData->enableSPDO          = that->cm->enableSPDIFOut;
-               cmiData->enableSPDIMonitor   = that->cm->enableSPDIFInMonitor;
-               cmiData->enableSPDI          = that->cm->enableSPDIFIn;
-               cmiData->formatMask          = that->cm->formatMask;
-               cmiData->exchangeFrontBack   = (that->CMIAdapter->readUInt8(REG_MIXER1) & REAR2FRONT);
-               cmiData->enableSPDO5V        = (that->CMIAdapter->readUInt32(REG_MISCCTRL) & EN_SPDO5V);
-               cmiData->enableBass2Line     = (that->CMIAdapter->readUInt32(REG_LEGACY) & BASS2LINE);
-               cmiData->enableCenter2Line   = (that->CMIAdapter->readUInt32(REG_LEGACY) & CENTER2LINE);
-               cmiData->enableRear2Line     = (that->CMIAdapter->readUInt8(REG_MIXER1) & REAR2LINE);
-               cmiData->enableCenter2Mic    = (that->CMIAdapter->readUInt8(REG_MIXER4) & CENTER2MIC) && (that->cm->chipVersion > 37);
-               cmiData->enableSPDOCopyright = (that->CMIAdapter->readUInt32(REG_LEGACY) & EN_SPDCOPYRHT);
-               cmiData->invertValidBitSPDI  = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & POLVALID);
-               cmiData->loopSPDI            = (that->CMIAdapter->readUInt32(REG_FUNCTRL1) & LOOP_SPDF);
-               if (that->cm->chipVersion <= 37) {
-                       cmiData->select2ndSPDI   = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & SEL_SPDIFI1);
-                       cmiData->invertPhaseSPDI = (that->CMIAdapter->readUInt8(REG_MIXER4) & INV_SPDIFI1);
-               } else {
-                       cmiData->select2ndSPDI   = (that->CMIAdapter->readUInt32(REG_MISCCTRL) & SEL_SPDIFI2);
-                       cmiData->invertPhaseSPDI = (that->CMIAdapter->readUInt32(REG_CHFORMAT) & INV_SPDIFI2);
-               }
-
-               PropertyRequest->ValueSize = sizeof(CMIDATA);
-               ntStatus = STATUS_SUCCESS;
-       } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_SET) {
-               if (PropertyRequest->PropertyItem->Id != KSPROPERTY_CMI_SET) {
-                       return STATUS_INVALID_DEVICE_REQUEST;
-               }
-
-               if (PropertyRequest->ValueSize == 0) {
-                       PropertyRequest->ValueSize = sizeof(CMIDATA);
-                       return STATUS_BUFFER_OVERFLOW;
-               } else if (PropertyRequest->ValueSize < sizeof (CMIDATA)) {
-                       PropertyRequest->ValueSize = 0;
-                       return STATUS_BUFFER_TOO_SMALL;
-               }
-               CMIDATA* cmiData = (CMIDATA*)PropertyRequest->Value;
-               that->cm->enableSPDIFIn         = cmiData->enableSPDI;
-               that->cm->enableSPDIFOut        = cmiData->enableSPDO;
-               that->cm->formatMask            = cmiData->formatMask;
-               that->cm->enableSPDIFInMonitor  = cmiData->enableSPDIMonitor;
-
-               if (cmiData->enableSPDI) {
-                       that->CMIAdapter->setUInt8Bit(REG_MIXER1, EN_WAVEIN_L | EN_WAVEIN_R);
-               } else {
-                       that->CMIAdapter->clearUInt8Bit(REG_MIXER1, EN_WAVEIN_L | EN_WAVEIN_R);
-               }
-
-               if (cmiData->exchangeFrontBack) {
-                       that->CMIAdapter->setUInt8Bit(REG_MIXER1, REAR2FRONT);
-               } else {
-                       that->CMIAdapter->clearUInt8Bit(REG_MIXER1, REAR2FRONT);
-               }
-               if (cmiData->enableSPDO5V) {
-                       that->CMIAdapter->setUInt32Bit(REG_MISCCTRL, EN_SPDO5V);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_MISCCTRL, EN_SPDO5V);
-               }
-               if (cmiData->enableSPDIMonitor) {
-                       that->CMIAdapter->setUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
-               } else {
-                       that->CMIAdapter->clearUInt8Bit(REG_MIXER1, EN_SPDI2DAC);
-               }
-               if (cmiData->enableBass2Line) {
-                       that->CMIAdapter->setUInt32Bit(REG_LEGACY, BASS2LINE);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_LEGACY, BASS2LINE);
-               }
-               if (cmiData->enableCenter2Line) {
-                       that->CMIAdapter->setUInt32Bit(REG_LEGACY, CENTER2LINE);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_LEGACY, CENTER2LINE);
-               }
-               if (cmiData->enableRear2Line) {
-                       that->CMIAdapter->setUInt8Bit(REG_MIXER1, REAR2LINE);
-               } else {
-                       that->CMIAdapter->clearUInt8Bit(REG_MIXER1, REAR2LINE);
-               }
-               if (that->cm->chipVersion > 37) {
-                       if (cmiData->enableCenter2Mic) {
-                               that->CMIAdapter->setUInt8Bit(REG_MIXER4, CENTER2MIC);
-                       } else {
-                               that->CMIAdapter->clearUInt8Bit(REG_MIXER4, CENTER2MIC);
-                       }
-               }
-               if (cmiData->enableSPDOCopyright) {
-                       that->CMIAdapter->setUInt32Bit(REG_LEGACY, EN_SPDCOPYRHT);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_LEGACY, EN_SPDCOPYRHT);
-               }
-               if (cmiData->invertValidBitSPDI) {
-                       that->CMIAdapter->setUInt32Bit(REG_CHFORMAT, POLVALID);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_CHFORMAT, POLVALID);
-               }
-               if (cmiData->loopSPDI) {
-                       that->CMIAdapter->setUInt32Bit(REG_FUNCTRL1, LOOP_SPDF);
-               } else {
-                       that->CMIAdapter->clearUInt32Bit(REG_FUNCTRL1, LOOP_SPDF);
-               }
-               if (cmiData->select2ndSPDI) {
-                       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);
-                       }
-               }
-               if (cmiData->invertPhaseSPDI) {
-                       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) {
-                               that->CMIAdapter->clearUInt8Bit(REG_MIXER4, INV_SPDIFI1);
-                       } else {
-                               that->CMIAdapter->clearUInt32Bit(REG_CHFORMAT, INV_SPDIFI2);
-                       }
-               }
-
-               that->storeMixerSettingsToRegistry();
-
-               ntStatus = STATUS_SUCCESS;
-       } else if (PropertyRequest->Verb & KSPROPERTY_TYPE_BASICSUPPORT) {
-               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;
-               } else {
-                       PropertyRequest->ValueSize = 0;
-                       ntStatus = STATUS_BUFFER_TOO_SMALL;
-               }
-       }
-
-       return ntStatus;
-}