ReactOS 0.4.16-dev-300-g2aadf2e
pnp.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Audio Service Plug and Play
5 * COPYRIGHT: Copyright 2007 Andrew Greenwood
6 */
7
8#include "audiosrv.h"
9
10#include <winreg.h>
11#include <winuser.h>
12#include <mmsystem.h>
13#include <setupapi.h>
14#include <ks.h>
15#include <ksmedia.h>
16
17#define NDEBUG
18#include <debug.h>
19
20static HDEVNOTIFY device_notification_handle = NULL;
21
22/*
23 Finds all devices within the KSCATEGORY_AUDIO category and puts them
24 in the shared device list.
25*/
26
27BOOL
29{
30 SP_DEVICE_INTERFACE_DATA interface_data;
31 SP_DEVINFO_DATA device_data;
33 HDEVINFO dev_info;
35 int index = 0;
36
37 const GUID category_guid = {STATIC_KSCATEGORY_AUDIO};
38
39 dev_info = SetupDiGetClassDevsExW(&category_guid,
40 NULL,
41 NULL,
43 NULL,
44 NULL,
45 NULL);
46
47 interface_data.cbSize = sizeof(interface_data);
48 interface_data.Reserved = 0;
49
50 /* Enumerate the devices within the category */
51 index = 0;
52
54 + (MAX_PATH * sizeof(WCHAR));
55
58 0,
59 length);
60
61 if ( ! detail_data )
62 {
63 DPRINT("failed to allocate detail_data\n");
64 return TRUE;
65 }
66
67 while (
69 NULL,
70 &category_guid,
71 index,
72 &interface_data) )
73 {
74 PnP_AudioDevice* list_node;
75
77
78 /* NOTE: We don't actually use device_data... */
80 device_data.cbSize = sizeof(device_data);
81 device_data.Reserved = 0;
83 &interface_data,
85 length,
86 NULL,
87 &device_data);
88
89 list_node = CreateDeviceDescriptor(detail_data->DevicePath, TRUE);
90 AppendAudioDeviceToList(list_node);
91 DestroyDeviceDescriptor(list_node);
92
93 /* TODO: Cleanup the device we enumerated? */
94
95 index ++;
96 };
97
99
101
102 return TRUE;
103}
104
105
106/*
107 Add new devices to the list as they arrive.
108*/
109
110DWORD
112{
113 PnP_AudioDevice* list_node;
114 list_node = CreateDeviceDescriptor(device->dbcc_name, TRUE);
115 AppendAudioDeviceToList(list_node);
116 DestroyDeviceDescriptor(list_node);
117
118 return NO_ERROR;
119}
120
121
122/*
123 Request notification of device additions/removals.
124*/
125
126BOOL
128{
129 DEV_BROADCAST_DEVICEINTERFACE notification_filter;
130
131 const GUID wdmaud_guid = {STATIC_KSCATEGORY_AUDIO};
132
133 ZeroMemory(&notification_filter, sizeof(notification_filter));
134 notification_filter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
135 notification_filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
136 notification_filter.dbcc_classguid = wdmaud_guid;
137
140 &notification_filter,
141 DEVICE_NOTIFY_SERVICE_HANDLE
142/* |
143 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES*/);
145 {
146 DPRINT("failed with error %d\n", GetLastError());
147 }
148
149 return ( device_notification_handle != NULL );
150}
151
152
153/*
154 When we're not interested in device notifications any more, this gets
155 called.
156*/
157
158VOID
160{
161 /* TODO -- NOT IMPLEMENTED! */
162
164 {
165 /* TODO */
167 }
168}
169
170
171/*
172 Device events from the main service handler get passed to this.
173*/
174
175DWORD
177 DWORD dwEventType,
178 LPVOID lpEventData)
179{
180 switch (dwEventType)
181 {
183 {
184 DEV_BROADCAST_DEVICEINTERFACE* incoming_device =
185 (DEV_BROADCAST_DEVICEINTERFACE*)lpEventData;
186
187 return ProcessDeviceArrival(incoming_device);
188 }
189
190 default :
191 {
192 break;
193 }
194 }
195
196 return NO_ERROR;
197}
BOOL AppendAudioDeviceToList(PnP_AudioDevice *device)
SERVICE_STATUS_HANDLE service_status_handle
Definition: main.c:13
#define DestroyDeviceDescriptor(descriptor)
Definition: audiosrv.h:30
VOID * CreateDeviceDescriptor(WCHAR *path, BOOL is_enabled)
BOOL RegisterForDeviceNotifications(VOID)
Definition: pnp.c:127
VOID UnregisterDeviceNotifications(VOID)
Definition: pnp.c:159
static HDEVNOTIFY device_notification_handle
Definition: pnp.c:20
DWORD ProcessDeviceArrival(DEV_BROADCAST_DEVICEINTERFACE *device)
Definition: pnp.c:111
DWORD HandleDeviceEvent(DWORD dwEventType, LPVOID lpEventData)
Definition: pnp.c:176
BOOL ProcessExistingDevices(VOID)
Definition: pnp.c:28
#define DBT_DEVICEARRIVAL
Definition: dbt.h:12
#define DBT_DEVTYP_DEVICEINTERFACE
Definition: dbt.h:24
DEV_BROADCAST_DEVICEINTERFACE_A DEV_BROADCAST_DEVICEINTERFACE
Definition: dbt.h:137
#define NO_ERROR
Definition: dderror.h:5
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, CONST GUID *InterfaceClassGuid, DWORD MemberIndex, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
Definition: devinst.c:2780
HDEVINFO WINAPI SetupDiGetClassDevsExW(CONST GUID *class, PCWSTR enumstr, HWND parent, DWORD flags, HDEVINFO deviceset, PCWSTR machine, PVOID reserved)
Definition: devinst.c:2305
BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData)
Definition: devinst.c:3011
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
Definition: devinst.c:2893
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint index
Definition: glext.h:6031
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define STATIC_KSCATEGORY_AUDIO
Definition: ksmedia.h:169
HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE hRecipient, LPVOID NotificationFilter, DWORD Flags)
Definition: resources.c:111
SP_DEVICE_INTERFACE_DETAIL_DATA_A SP_DEVICE_INTERFACE_DETAIL_DATA
Definition: setupapi.h:1149
#define DIGCF_DEVICEINTERFACE
Definition: setupapi.h:174
struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA_W
#define DIGCF_PRESENT
Definition: setupapi.h:171
struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W * PSP_DEVICE_INTERFACE_DETAIL_DATA_W
#define DPRINT
Definition: sndvol32.h:73
ULONG_PTR Reserved
Definition: setupapi.h:838
Definition: devices.h:37
#define ZeroMemory
Definition: winbase.h:1737
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
__wchar_t WCHAR
Definition: xmlstorage.h:180