fork
Configure Feed
Select the types of activity you want to include in your feed.
Reactos
fork
Configure Feed
Select the types of activity you want to include in your feed.
1/*
2 * Unit tests for CLSID_DirectSoundPrivate property set functions
3 * (used by dxdiag)
4 *
5 * Copyright (c) 2003 Robert Reif
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "dsound_test.h"
23
24#include <winnls.h>
25
26#ifndef DSBCAPS_CTRLDEFAULT
27#define DSBCAPS_CTRLDEFAULT \
28 DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME
29#endif
30
31#include <initguid.h>
32
33DEFINE_GUID(DSPROPSETID_VoiceManager,
34 0x62A69BAE,0xDF9D,0x11D1,0x99,0xA6,0x00,0xC0,0x4F,0xC9,0x9D,0x46);
35DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties,
36 0x306a6a8,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
37DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties,
38 0x306a6a7,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
39DEFINE_GUID(DSPROPSETID_I3DL2_ListenerProperties,
40 0xDA0F0520,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
41DEFINE_GUID(DSPROPSETID_I3DL2_BufferProperties,
42 0xDA0F0521,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
43DEFINE_GUID(DSPROPSETID_ZOOMFX_BufferProperties,
44 0xCD5368E0,0x3450,0x11D3,0x8B,0x6E,0x00,0x10,0x5A,0x9B,0x7B,0xBC);
45
46static HRESULT (WINAPI *pDirectSoundEnumerateA)(LPDSENUMCALLBACKA,LPVOID)=NULL;
47static HRESULT (WINAPI *pDllGetClassObject)(REFCLSID,REFIID,LPVOID*)=NULL;
48static HRESULT (WINAPI *pDirectSoundCreate)(LPCGUID,LPDIRECTSOUND*,
49 LPUNKNOWN)=NULL;
50static HRESULT (WINAPI *pDirectSoundCreate8)(LPCGUID,LPDIRECTSOUND8*,
51 LPUNKNOWN)=NULL;
52static HRESULT (WINAPI *pDirectSoundCaptureCreate)(LPCGUID,
53 LPDIRECTSOUNDCAPTURE*,LPUNKNOWN)=NULL;
54static HRESULT (WINAPI *pDirectSoundCaptureCreate8)(LPCGUID,
55 LPDIRECTSOUNDCAPTURE8*,LPUNKNOWN)=NULL;
56static HRESULT (WINAPI *pDirectSoundFullDuplexCreate)(LPCGUID,LPCGUID,
57 LPCDSCBUFFERDESC,LPCDSBUFFERDESC,HWND,DWORD,LPDIRECTSOUNDFULLDUPLEX*,
58 LPDIRECTSOUNDCAPTUREBUFFER8*,LPDIRECTSOUNDBUFFER8*,LPUNKNOWN)=NULL;
59
60static BOOL CALLBACK callback(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA data,
61 LPVOID context)
62{
63 trace(" found device:\n");
64 trace(" Type: %s\n",
65 data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
66 data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
67 data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
68 trace(" DataFlow: %s\n",
69 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
70 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
71 "Capture" : "Unknown");
72 trace(" DeviceId: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
73 data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
74 data->DeviceId.Data4[0],data->DeviceId.Data4[1],
75 data->DeviceId.Data4[2],data->DeviceId.Data4[3],
76 data->DeviceId.Data4[4],data->DeviceId.Data4[5],
77 data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
78 trace(" Description: %s\n", data->Description);
79 trace(" Module: %s\n", data->Module);
80 trace(" Interface: %s\n", data->Interface);
81 trace(" WaveDeviceId: %d\n", data->WaveDeviceId);
82
83 return TRUE;
84}
85
86static BOOL CALLBACK callback1(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA data,
87 LPVOID context)
88{
89 char descriptionA[0x100];
90 char moduleA[MAX_PATH];
91
92 trace(" found device:\n");
93 trace(" Type: %s\n",
94 data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
95 data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
96 data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
97 trace(" DataFlow: %s\n",
98 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
99 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
100 "Capture" : "Unknown");
101 trace(" DeviceId: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
102 data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
103 data->DeviceId.Data4[0],data->DeviceId.Data4[1],
104 data->DeviceId.Data4[2],data->DeviceId.Data4[3],
105 data->DeviceId.Data4[4],data->DeviceId.Data4[5],
106 data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
107 trace(" DescriptionA: %s\n", data->DescriptionA);
108 WideCharToMultiByte(CP_ACP, 0, data->DescriptionW, -1, descriptionA, sizeof(descriptionA), NULL, NULL);
109 trace(" DescriptionW: %s\n", descriptionA);
110 trace(" ModuleA: %s\n", data->ModuleA);
111 WideCharToMultiByte(CP_ACP, 0, data->ModuleW, -1, moduleA, sizeof(moduleA), NULL, NULL);
112 trace(" ModuleW: %s\n", moduleA);
113 trace(" WaveDeviceId: %d\n", data->WaveDeviceId);
114
115 return TRUE;
116}
117
118static BOOL CALLBACK callbackA(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data,
119 LPVOID context)
120{
121 trace(" found device:\n");
122 trace(" Type: %s\n",
123 data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
124 data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
125 data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
126 trace(" DataFlow: %s\n",
127 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
128 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
129 "Capture" : "Unknown");
130 trace(" DeviceId: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
131 data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
132 data->DeviceId.Data4[0],data->DeviceId.Data4[1],
133 data->DeviceId.Data4[2],data->DeviceId.Data4[3],
134 data->DeviceId.Data4[4],data->DeviceId.Data4[5],
135 data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
136 trace(" Description: %s\n", data->Description);
137 trace(" Module: %s\n", data->Module);
138 trace(" Interface: %s\n", data->Interface);
139 trace(" WaveDeviceId: %d\n", data->WaveDeviceId);
140
141 return TRUE;
142}
143
144static BOOL CALLBACK callbackW(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data,
145 LPVOID context)
146{
147 char descriptionA[0x100];
148 char moduleA[MAX_PATH];
149 char interfaceA[MAX_PATH];
150
151 trace("found device:\n");
152 trace("\tType: %s\n",
153 data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
154 data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
155 data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
156 trace("\tDataFlow: %s\n",
157 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
158 data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
159 "Capture" : "Unknown");
160 trace("\tDeviceId: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
161 data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
162 data->DeviceId.Data4[0],data->DeviceId.Data4[1],
163 data->DeviceId.Data4[2],data->DeviceId.Data4[3],
164 data->DeviceId.Data4[4],data->DeviceId.Data4[5],
165 data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
166 WideCharToMultiByte(CP_ACP, 0, data->Description, -1, descriptionA, sizeof(descriptionA), NULL, NULL);
167 WideCharToMultiByte(CP_ACP, 0, data->Module, -1, moduleA, sizeof(moduleA), NULL, NULL);
168 WideCharToMultiByte(CP_ACP, 0, data->Interface, -1, interfaceA, sizeof(interfaceA), NULL, NULL);
169 trace("\tDescription: %s\n", descriptionA);
170 trace("\tModule: %s\n", moduleA);
171 trace("\tInterface: %s\n", interfaceA);
172 trace("\tWaveDeviceId: %d\n", data->WaveDeviceId);
173
174 return TRUE;
175}
176
177static void propset_private_tests(void)
178{
179 HRESULT rc;
180 IClassFactory * pcf;
181 IKsPropertySet * pps;
182 ULONG support;
183
184 /* try direct sound first */
185 /* DSOUND: Error: Invalid interface buffer */
186 rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IClassFactory, NULL);
187 ok(rc==DSERR_INVALIDPARAM,"DllGetClassObject(CLSID_DirectSound, "
188 "IID_IClassFactory) should have returned DSERR_INVALIDPARAM, "
189 "returned: %08x\n",rc);
190
191 rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IDirectSound, (void **)(&pcf));
192 ok(rc==E_NOINTERFACE,"DllGetClassObject(CLSID_DirectSound, "
193 "IID_IDirectSound) should have returned E_NOINTERFACE, "
194 "returned: %08x\n",rc);
195
196 rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IUnknown, (void **)(&pcf));
197 ok(rc==DS_OK,"DllGetClassObject(CLSID_DirectSound, "
198 "IID_IUnknown) failed: %08x\n",rc);
199
200 rc = (pDllGetClassObject)(&CLSID_DirectSound, &IID_IClassFactory, (void **)(&pcf));
201 ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) "
202 "failed: %08x\n",rc);
203 if (pcf==0)
204 return;
205
206 /* direct sound doesn't have an IKsPropertySet */
207 /* DSOUND: Error: Invalid interface buffer */
208 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
209 NULL);
210 ok(rc==DSERR_INVALIDPARAM, "CreateInstance(IID_IKsPropertySet) should have "
211 "returned DSERR_INVALIDPARAM, returned: %08x\n",rc);
212
213 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
214 (void **)(&pps));
215 ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
216 "returned E_NOINTERFACE, returned: %08x\n",rc);
217
218 /* and the direct sound 8 version */
219 if (pDirectSoundCreate8) {
220 rc = (pDllGetClassObject)(&CLSID_DirectSound8, &IID_IClassFactory, (void **)(&pcf));
221 ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound8, IID_IClassFactory) "
222 "failed: %08x\n",rc);
223 if (pcf==0)
224 return;
225
226 /* direct sound 8 doesn't have an IKsPropertySet */
227 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
228 (void **)(&pps));
229 ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
230 "returned E_NOINTERFACE, returned: %08x\n",rc);
231 }
232
233 /* try direct sound capture next */
234 if (pDirectSoundCaptureCreate) {
235 rc = (pDllGetClassObject)(&CLSID_DirectSoundCapture, &IID_IClassFactory,
236 (void **)(&pcf));
237 ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture, IID_IClassFactory) "
238 "failed: %08x\n",rc);
239 if (pcf==0)
240 return;
241
242 /* direct sound capture doesn't have an IKsPropertySet */
243 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
244 (void **)(&pps));
245 ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
246 "returned E_NOINTERFACE,returned: %08x\n",rc);
247 }
248
249 /* and the direct sound capture 8 version */
250 if (pDirectSoundCaptureCreate8) {
251 rc = (pDllGetClassObject)(&CLSID_DirectSoundCapture8, &IID_IClassFactory,
252 (void **)(&pcf));
253 ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture8, "
254 "IID_IClassFactory) failed: %08x\n",rc);
255 if (pcf==0)
256 return;
257
258 /* direct sound capture 8 doesn't have an IKsPropertySet */
259 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
260 (void **)(&pps));
261 ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
262 "returned E_NOINTERFACE, returned: %08x\n",rc);
263 }
264
265 /* try direct sound full duplex next */
266 if (pDirectSoundFullDuplexCreate) {
267 rc = (pDllGetClassObject)(&CLSID_DirectSoundFullDuplex, &IID_IClassFactory,
268 (void **)(&pcf));
269 ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundFullDuplex, "
270 "IID_IClassFactory) failed: %08x\n",rc);
271 if (pcf==0)
272 return;
273
274 /* direct sound full duplex doesn't have an IKsPropertySet */
275 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
276 (void **)(&pps));
277 ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
278 "returned NOINTERFACE, returned: %08x\n",rc);
279 }
280
281 /* try direct sound private last */
282 rc = (pDllGetClassObject)(&CLSID_DirectSoundPrivate, &IID_IClassFactory,
283 (void **)(&pcf));
284
285 /* some early versions of Direct Sound do not have this */
286 if (rc==CLASS_E_CLASSNOTAVAILABLE)
287 return;
288
289 /* direct sound private does have an IKsPropertySet */
290 rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
291 (void **)(&pps));
292 ok(rc==DS_OK, "CreateInstance(IID_IKsPropertySet) failed: %08x\n",
293 rc);
294 if (rc!=DS_OK)
295 return;
296
297 /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION */
298 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
299 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
300 &support);
301 ok(rc==DS_OK||rc==E_INVALIDARG,
302 "QuerySupport(DSPROPSETID_DirectSoundDevice, "
303 "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION) failed: %08x\n",
304 rc);
305 if (rc!=DS_OK) {
306 if (rc==E_INVALIDARG)
307 trace(" Not Supported\n");
308 return;
309 }
310
311 ok(support & KSPROPERTY_SUPPORT_GET,
312 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: "
313 "support = 0x%x\n",support);
314 ok(!(support & KSPROPERTY_SUPPORT_SET),
315 "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: "
316 "support = 0x%x\n",support);
317
318 /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1 */
319 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
320 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1,
321 &support);
322 ok(rc==DS_OK||rc==E_INVALIDARG,
323 "QuerySupport(DSPROPSETID_DirectSoundDevice, "
324 "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1) failed: %08x\n",
325 rc);
326 if (rc!=DS_OK) {
327 if (rc==E_INVALIDARG)
328 trace(" Not Supported\n");
329 return;
330 }
331
332 ok(support & KSPROPERTY_SUPPORT_GET,
333 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: "
334 "support = 0x%x\n",support);
335 ok(!(support & KSPROPERTY_SUPPORT_SET),
336 "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: "
337 "support = 0x%x\n",support);
338
339 /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A */
340 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
341 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A,
342 &support);
343 ok(rc==DS_OK||rc==E_INVALIDARG,
344 "QuerySupport(DSPROPSETID_DirectSoundDevice, "
345 "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A) failed: %08x\n",
346 rc);
347 if (rc!=DS_OK) {
348 if (rc==E_INVALIDARG)
349 trace(" Not Supported\n");
350 return;
351 }
352
353 ok(support & KSPROPERTY_SUPPORT_GET,
354 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: "
355 "support = 0x%x\n",support);
356 ok(!(support & KSPROPERTY_SUPPORT_SET),
357 "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: "
358 "support = 0x%x\n",support);
359
360 /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W */
361 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
362 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W,
363 &support);
364 ok(rc==DS_OK||rc==E_INVALIDARG,
365 "QuerySupport(DSPROPSETID_DirectSoundDevice, "
366 "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W) failed: %08x\n",
367 rc);
368 if (rc!=DS_OK) {
369 if (rc==E_INVALIDARG)
370 trace(" Not Supported\n");
371 return;
372 }
373
374 ok(support & KSPROPERTY_SUPPORT_GET,
375 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: "
376 "support = 0x%x\n",support);
377 ok(!(support & KSPROPERTY_SUPPORT_SET),
378 "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: "
379 "support = 0x%x\n",support);
380
381 /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING */
382 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
383 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING, &support);
384 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
385 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING) failed: %08x\n",
386 rc);
387 if (rc!=DS_OK)
388 return;
389
390 ok(support & KSPROPERTY_SUPPORT_GET,
391 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: "
392 "support = 0x%x\n",support);
393 ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
394 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = "
395 "0x%x\n",support);
396
397 /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A */
398 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
399 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A, &support);
400 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
401 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A) failed: %08x\n",
402 rc);
403 if (rc!=DS_OK)
404 return;
405
406 ok(support & KSPROPERTY_SUPPORT_GET,
407 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: "
408 "support = 0x%x\n",support);
409 ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
410 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: support = "
411 "0x%x\n",support);
412
413 /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W */
414 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
415 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W, &support);
416 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
417 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W) failed: %08x\n",
418 rc);
419 if (rc!=DS_OK)
420 return;
421
422 ok(support & KSPROPERTY_SUPPORT_GET,
423 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: "
424 "support = 0x%x\n",support);
425 ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
426 "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: support = "
427 "0x%x\n",support);
428
429 /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE */
430 trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE ***\n");
431 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
432 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE,
433 &support);
434 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
435 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE) failed: %08x\n",
436 rc);
437 if (rc!=DS_OK)
438 return;
439
440 ok(support & KSPROPERTY_SUPPORT_GET,
441 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: "
442 "support = 0x%x\n",support);
443 ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
444 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%x\n",support);
445
446 if (support & KSPROPERTY_SUPPORT_GET) {
447 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data;
448 ULONG bytes;
449
450 data.Callback = callback;
451 data.Context = 0;
452
453 rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
454 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE,
455 NULL, 0, &data, sizeof(data), &bytes);
456 ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc);
457 }
458
459 /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 */
460 trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 ***\n");
461 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
462 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1,
463 &support);
464 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
465 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1) failed: %08x\n",
466 rc);
467 if (rc!=DS_OK)
468 return;
469
470 ok(support & KSPROPERTY_SUPPORT_GET,
471 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: "
472 "support = 0x%x\n",support);
473 ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
474 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: support = 0x%x\n",support);
475
476 if (support & KSPROPERTY_SUPPORT_GET) {
477 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA data;
478 ULONG bytes;
479
480 data.Callback = callback1;
481 data.Context = 0;
482
483 rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
484 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1,
485 NULL, 0, &data, sizeof(data), &bytes);
486 ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc);
487 }
488
489 /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A */
490 trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A ***\n");
491 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
492 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A,
493 &support);
494 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
495 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A) failed: %08x\n",
496 rc);
497 if (rc!=DS_OK)
498 return;
499
500 ok(support & KSPROPERTY_SUPPORT_GET,
501 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: "
502 "support = 0x%x\n",support);
503 ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
504 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: support = 0x%x\n",support);
505
506 if (support & KSPROPERTY_SUPPORT_GET) {
507 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA data;
508 ULONG bytes;
509
510 data.Callback = callbackA;
511 data.Context = 0;
512
513 rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
514 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A,
515 NULL, 0, &data, sizeof(data), &bytes);
516 ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc);
517 }
518
519 /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W */
520 trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W ***\n");
521 rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
522 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W,
523 &support);
524 ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
525 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W) failed: %08x\n",
526 rc);
527 if (rc!=DS_OK)
528 return;
529
530 ok(support & KSPROPERTY_SUPPORT_GET,
531 "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: "
532 "support = 0x%x\n",support);
533 ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
534 "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: support = 0x%x\n",support);
535
536 if (support & KSPROPERTY_SUPPORT_GET) {
537 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
538 ULONG bytes;
539
540 data.Callback = callbackW;
541 data.Context = 0;
542
543 rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
544 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W,
545 NULL, 0, &data, sizeof(data), &bytes);
546 ok(rc==DS_OK, "Couldn't enumerate: 0x%x\n",rc);
547 }
548 IKsPropertySet_Release(pps);
549}
550
551static unsigned driver_count = 0;
552
553static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
554 LPCSTR lpcstrModule, LPVOID lpContext)
555{
556 HRESULT rc;
557 LPDIRECTSOUND dso=NULL;
558 LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
559 DSBUFFERDESC bufdesc;
560 WAVEFORMATEX wfx;
561 int ref;
562
563 trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
564 driver_count++;
565
566 rc=pDirectSoundCreate(lpGuid,&dso,NULL);
567 ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
568 "DirectSoundCreate() failed: %08x\n",rc);
569 if (rc!=DS_OK) {
570 if (rc==DSERR_NODRIVER)
571 trace(" No Driver\n");
572 else if (rc == DSERR_ALLOCATED)
573 trace(" Already In Use\n");
574 else if (rc == E_FAIL)
575 trace(" No Device\n");
576 goto EXIT;
577 }
578
579 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
580 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
581 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
582 ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %08x\n",
583 rc);
584 if (rc!=DS_OK)
585 goto EXIT;
586
587 /* Testing 3D buffers */
588 primary=NULL;
589 ZeroMemory(&bufdesc, sizeof(bufdesc));
590 bufdesc.dwSize=sizeof(bufdesc);
591 bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_LOCHARDWARE|DSBCAPS_CTRL3D;
592 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
593 ok((rc==DS_OK&&primary!=NULL)
594 || broken(rc==DSERR_INVALIDPARAM),
595 "IDirectSound_CreateSoundBuffer() failed to "
596 "create a hardware 3D primary buffer: %08x\n",rc);
597 if(rc==DSERR_INVALIDPARAM) {
598 skip("broken driver\n");
599 goto EXIT;
600 }
601 if (rc==DS_OK&&primary!=NULL) {
602 ZeroMemory(&wfx, sizeof(wfx));
603 wfx.wFormatTag=WAVE_FORMAT_PCM;
604 wfx.nChannels=1;
605 wfx.wBitsPerSample=16;
606 wfx.nSamplesPerSec=44100;
607 wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8;
608 wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
609 ZeroMemory(&bufdesc, sizeof(bufdesc));
610 bufdesc.dwSize=sizeof(bufdesc);
611 bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2;
612 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
613 bufdesc.lpwfxFormat=&wfx;
614 trace(" Testing a secondary buffer at %dx%dx%d\n",
615 wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
616 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
617 ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */
618 "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer: %08x\n",rc);
619 if (rc==DS_OK&&secondary!=NULL) {
620 IKsPropertySet * pPropertySet=NULL;
621 rc=IDirectSoundBuffer_QueryInterface(secondary,
622 &IID_IKsPropertySet,
623 (void **)&pPropertySet);
624 /* it's not an error for this to fail */
625 if(rc==DS_OK) {
626 ULONG ulTypeSupport;
627 trace(" Supports property sets\n");
628 /* it's not an error for these to fail */
629 rc=IKsPropertySet_QuerySupport(pPropertySet,
630 &DSPROPSETID_VoiceManager,
631 0,&ulTypeSupport);
632 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
633 KSPROPERTY_SUPPORT_SET)))
634 trace(" DSPROPSETID_VoiceManager supported\n");
635 else
636 trace(" DSPROPSETID_VoiceManager not supported\n");
637 rc=IKsPropertySet_QuerySupport(pPropertySet,
638 &DSPROPSETID_EAX20_ListenerProperties,0,&ulTypeSupport);
639 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
640 KSPROPERTY_SUPPORT_SET)))
641 trace(" DSPROPSETID_EAX20_ListenerProperties "
642 "supported\n");
643 else
644 trace(" DSPROPSETID_EAX20_ListenerProperties not "
645 "supported\n");
646 rc=IKsPropertySet_QuerySupport(pPropertySet,
647 &DSPROPSETID_EAX20_BufferProperties,0,&ulTypeSupport);
648 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
649 KSPROPERTY_SUPPORT_SET)))
650 trace(" DSPROPSETID_EAX20_BufferProperties supported\n");
651 else
652 trace(" DSPROPSETID_EAX20_BufferProperties not "
653 "supported\n");
654 rc=IKsPropertySet_QuerySupport(pPropertySet,
655 &DSPROPSETID_I3DL2_ListenerProperties,0,&ulTypeSupport);
656 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
657 KSPROPERTY_SUPPORT_SET)))
658 trace(" DSPROPSETID_I3DL2_ListenerProperties "
659 "supported\n");
660 else
661 trace(" DSPROPSETID_I3DL2_ListenerProperties not "
662 "supported\n");
663 rc=IKsPropertySet_QuerySupport(pPropertySet,
664 &DSPROPSETID_I3DL2_BufferProperties,0,&ulTypeSupport);
665 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
666 KSPROPERTY_SUPPORT_SET)))
667 trace(" DSPROPSETID_I3DL2_BufferProperties supported\n");
668 else
669 trace(" DSPROPSETID_I3DL2_BufferProperties not "
670 "supported\n");
671 rc=IKsPropertySet_QuerySupport(pPropertySet,
672 &DSPROPSETID_ZOOMFX_BufferProperties,0,&ulTypeSupport);
673 if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
674 KSPROPERTY_SUPPORT_SET)))
675 trace(" DSPROPSETID_ZOOMFX_BufferProperties "
676 "supported\n");
677 else
678 trace(" DSPROPSETID_ZOOMFX_BufferProperties not "
679 "supported\n");
680 ref=IKsPropertySet_Release(pPropertySet);
681 /* try a few common ones */
682 ok(ref==0,"IKsPropertySet_Release() secondary has %d "
683 "references, should have 0\n",ref);
684 } else
685 trace(" Doesn't support property sets\n");
686
687 ref=IDirectSoundBuffer_Release(secondary);
688 ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d "
689 "references, should have 0\n",ref);
690 }
691
692 ref=IDirectSoundBuffer_Release(primary);
693 ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
694 "should have 0\n",ref);
695 }
696
697EXIT:
698 if (dso!=NULL) {
699 ref=IDirectSound_Release(dso);
700 ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",
701 ref);
702 }
703 return 1;
704}
705
706static void propset_buffer_tests(void)
707{
708 HRESULT rc;
709 rc=pDirectSoundEnumerateA(&dsenum_callback,NULL);
710 ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc);
711 trace("tested %u DirectSound drivers\n", driver_count);
712}
713
714START_TEST(propset)
715{
716 HMODULE hDsound;
717
718 CoInitialize(NULL);
719
720 hDsound = LoadLibrary("dsound.dll");
721 if (hDsound)
722 {
723
724 pDirectSoundEnumerateA = (void*)GetProcAddress(hDsound,
725 "DirectSoundEnumerateA");
726 pDllGetClassObject = (void *)GetProcAddress(hDsound,
727 "DllGetClassObject");
728 pDirectSoundCreate = (void*)GetProcAddress(hDsound,
729 "DirectSoundCreate");
730 pDirectSoundCreate8 = (void*)GetProcAddress(hDsound,
731 "DirectSoundCreate8");
732 pDirectSoundCaptureCreate=(void*)GetProcAddress(hDsound,
733 "DirectSoundCaptureCreate");
734 pDirectSoundCaptureCreate8=(void*)GetProcAddress(hDsound,
735 "DirectSoundCaptureCreate8");
736 pDirectSoundFullDuplexCreate=(void*)GetProcAddress(hDsound,
737 "DirectSoundFullDuplexCreate");
738
739 propset_private_tests();
740 propset_buffer_tests();
741
742 FreeLibrary(hDsound);
743 }
744 else
745 skip("dsound.dll not found - skipping all tests\n");
746
747 CoUninitialize();
748}