mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 15:51:49 +00:00
Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers into modules, and delete rossubsys.
This commit is contained in:
parent
b94e2d8ca0
commit
c2c66aff7d
24198 changed files with 0 additions and 37285 deletions
202
sdk/lib/drivers/sound/mment4/detect.c
Normal file
202
sdk/lib/drivers/sound/mment4/detect.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Sound System "MME Buddy" NT4 Library
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: lib/drivers/sound/mment4/detect.c
|
||||
*
|
||||
* PURPOSE: Assists in locating Windows NT4 compatible sound devices,
|
||||
* which mostly use the same device naming convention and/or
|
||||
* store their created device names within their service key
|
||||
* within the registry.
|
||||
*
|
||||
* PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
|
||||
#include <mment4.h>
|
||||
#include <mmebuddy_debug.h>
|
||||
|
||||
/*
|
||||
This is the "nice" way to discover audio devices in NT4 - go into the
|
||||
service registry key and enumerate the Parameters\Device*\Devices
|
||||
values. The value names represent the device name, whereas the data
|
||||
assigned to them identifies the type of device.
|
||||
*/
|
||||
MMRESULT
|
||||
EnumerateNt4ServiceSoundDevices(
|
||||
IN LPWSTR ServiceName,
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc)
|
||||
{
|
||||
HKEY Key;
|
||||
DWORD KeyIndex = 0;
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( ServiceName );
|
||||
|
||||
/* Device type zero means "all" */
|
||||
VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceType(DeviceType) ||
|
||||
DeviceType == 0 );
|
||||
|
||||
while ( OpenSoundDeviceRegKey(ServiceName, KeyIndex, &Key) == MMSYSERR_NOERROR )
|
||||
{
|
||||
HKEY DevicesKey;
|
||||
DWORD ValueType = REG_NONE, ValueIndex = 0;
|
||||
DWORD MaxNameLength = 0, ValueNameLength = 0;
|
||||
PWSTR DevicePath = NULL, ValueName = NULL;
|
||||
DWORD ValueDataLength = sizeof(DWORD);
|
||||
DWORD ValueData;
|
||||
|
||||
if ( RegOpenKeyEx(Key,
|
||||
REG_DEVICES_KEY_NAME_U,
|
||||
0,
|
||||
KEY_READ,
|
||||
&DevicesKey) == ERROR_SUCCESS )
|
||||
{
|
||||
/* Find out how much memory is needed for the key name */
|
||||
if ( RegQueryInfoKey(DevicesKey,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
&MaxNameLength,
|
||||
NULL, NULL, NULL) != ERROR_SUCCESS )
|
||||
{
|
||||
SND_ERR(L"Failed to query registry key information\n");
|
||||
RegCloseKey(DevicesKey);
|
||||
RegCloseKey(Key);
|
||||
|
||||
return MMSYSERR_ERROR;
|
||||
}
|
||||
|
||||
DevicePath = AllocateWideString(MaxNameLength +
|
||||
strlen("\\\\.\\"));
|
||||
|
||||
/* Check that the memory allocation was successful */
|
||||
if ( ! DevicePath )
|
||||
{
|
||||
/* There's no point in going further */
|
||||
RegCloseKey(DevicesKey);
|
||||
RegCloseKey(Key);
|
||||
|
||||
return MMSYSERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Insert the device path prefix */
|
||||
wsprintf(DevicePath, L"\\\\.\\");
|
||||
|
||||
/* The offset of the string following this prefix */
|
||||
ValueName = DevicePath + strlen("\\\\.\\");
|
||||
|
||||
/* Copy this so that it may be overwritten - include NULL */
|
||||
ValueNameLength = MaxNameLength + sizeof(WCHAR);
|
||||
|
||||
SND_TRACE(L"Interested in devices beginning with %wS\n", DevicePath);
|
||||
|
||||
while ( RegEnumValue(DevicesKey,
|
||||
ValueIndex,
|
||||
ValueName,
|
||||
&ValueNameLength,
|
||||
NULL,
|
||||
&ValueType,
|
||||
(LPBYTE) &ValueData,
|
||||
&ValueDataLength) == ERROR_SUCCESS )
|
||||
{
|
||||
/* Device types are stored as DWORDs */
|
||||
if ( ( ValueType == REG_DWORD ) &&
|
||||
( ValueDataLength == sizeof(DWORD) ) )
|
||||
{
|
||||
if ( ( DeviceType == 0 ) ||
|
||||
( DeviceType == ValueData ) )
|
||||
{
|
||||
SND_TRACE(L"Found device: %wS\n", DevicePath);
|
||||
SoundDeviceDetectedProc(ValueData, DevicePath);
|
||||
}
|
||||
}
|
||||
|
||||
/* Reset variables for the next iteration */
|
||||
ValueNameLength = MaxNameLength + sizeof(WCHAR);
|
||||
ZeroMemory(ValueName, (MaxNameLength+1)*sizeof(WCHAR));
|
||||
/*ZeroWideString(ValueName);*/
|
||||
ValueDataLength = sizeof(DWORD);
|
||||
ValueData = 0;
|
||||
ValueType = REG_NONE;
|
||||
|
||||
++ ValueIndex;
|
||||
}
|
||||
|
||||
FreeMemory(DevicePath);
|
||||
|
||||
RegCloseKey(DevicesKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
SND_WARN(L"Unable to open the Devices key!\n");
|
||||
}
|
||||
|
||||
++ KeyIndex;
|
||||
|
||||
RegCloseKey(Key);
|
||||
}
|
||||
|
||||
return MMSYSERR_NOERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
Brute-force device detection, using a base device name (eg: \\.\WaveOut).
|
||||
|
||||
This will add the device number as a suffix to the end of the string and
|
||||
attempt to open the device based on that name. On success, it will
|
||||
increment the device number and repeat this process.
|
||||
|
||||
When it runs out of devices, it will give up.
|
||||
*/
|
||||
MMRESULT
|
||||
DetectNt4SoundDevices(
|
||||
IN MMDEVICE_TYPE DeviceType,
|
||||
IN PWSTR BaseDeviceName,
|
||||
IN SOUND_DEVICE_DETECTED_PROC SoundDeviceDetectedProc)
|
||||
{
|
||||
ULONG DeviceNameLength = 0;
|
||||
PWSTR DeviceName = NULL;
|
||||
ULONG Index = 0;
|
||||
HANDLE DeviceHandle;
|
||||
BOOLEAN DoSearch = TRUE;
|
||||
|
||||
VALIDATE_MMSYS_PARAMETER( IsValidSoundDeviceType(DeviceType) );
|
||||
|
||||
DeviceNameLength = wcslen(BaseDeviceName);
|
||||
/* Consider the length of the number */
|
||||
DeviceNameLength += GetDigitCount(Index);
|
||||
|
||||
DeviceName = AllocateWideString(DeviceNameLength);
|
||||
|
||||
if ( ! DeviceName )
|
||||
{
|
||||
return MMSYSERR_NOMEM;
|
||||
}
|
||||
|
||||
while ( DoSearch )
|
||||
{
|
||||
/* Nothing like a nice clean device name */
|
||||
ZeroWideString(DeviceName);
|
||||
wsprintf(DeviceName, L"%ls%d", BaseDeviceName, Index);
|
||||
|
||||
if ( OpenKernelSoundDeviceByName(DeviceName,
|
||||
TRUE,
|
||||
&DeviceHandle) == MMSYSERR_NOERROR )
|
||||
{
|
||||
/* Notify the callback function */
|
||||
SND_TRACE(L"Found device: %wS\n", DeviceName);
|
||||
SoundDeviceDetectedProc(DeviceType, DeviceName);
|
||||
|
||||
CloseHandle(DeviceHandle);
|
||||
|
||||
++ Index;
|
||||
}
|
||||
else
|
||||
{
|
||||
DoSearch = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
FreeMemory(DeviceName);
|
||||
|
||||
return MMSYSERR_NOERROR;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue