windows-nt/Source/XPSP1/NT/drivers/wdm/audio/sysaudio/vsd.cpp

94 lines
2.4 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//---------------------------------------------------------------------------
//
// Module: vsd.cpp
//
// Description:
//
// Virtual Source Data Class
//
//@@BEGIN_MSINTERNAL
// Development Team:
// Mike McLaughlin
//
// History: Date Author Comment
//
// To Do: Date Author Comment
//
//@@END_MSINTERNAL
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1996-1999 Microsoft Corporation. All Rights Reserved.
//
//---------------------------------------------------------------------------
#include "common.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
CVirtualSourceData::CVirtualSourceData(
PDEVICE_NODE pDeviceNode
)
{
LONG lLevel, i;
cChannels = 2;
MinimumValue = (-96 * 65536);
MaximumValue = 0;
Steps = (65536/2);
GetVirtualSourceDefault(pDeviceNode, &lLevel);
for(i = 0; i < MAX_NUM_CHANNELS; i++) {
this->lLevel[i] = lLevel;
}
}
NTSTATUS
GetVirtualSourceDefault(
IN PDEVICE_NODE pDeviceNode,
IN PLONG plLevel
)
{
PKEY_VALUE_FULL_INFORMATION pkvfi = NULL;
NTSTATUS Status = STATUS_SUCCESS;
UNICODE_STRING ustrName;
HANDLE hkey = NULL;
// Set the default volume level on virtualized pins. (0 dB attenuation)
*plLevel = (0 * 65536);
// Need to convert the filtername (symbolic link name) to a unicode string
RtlInitUnicodeString(&ustrName, pDeviceNode->GetDeviceInterface());
Status = IoOpenDeviceInterfaceRegistryKey(&ustrName, KEY_READ, &hkey);
if(!NT_SUCCESS(Status)) {
goto exit;
}
// Now we can go get the FriendlyName value
Status = QueryRegistryValue(hkey, L"VirtualSourceDefault", &pkvfi);
if(!NT_SUCCESS(Status)) {
goto exit;
}
if(pkvfi->Type != REG_DWORD && pkvfi->Type != REG_BINARY) {
Trap();
Status = STATUS_INVALID_PARAMETER;
goto exit;
}
if(pkvfi->Type == REG_BINARY && pkvfi->DataLength < sizeof(LONG)) {
Trap();
Status = STATUS_INVALID_PARAMETER;
goto exit;
}
*plLevel = *((PLONG)(((PUCHAR)pkvfi) + pkvfi->DataOffset));
exit:
if(hkey != NULL) {
ZwClose(hkey);
}
delete pkvfi;
return(Status);
}