2 * Unit tests for CLSID_DirectSoundPrivate property set functions (used by dxdiag)
4 * Copyright (c) 2003 Robert Reif
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #define NONAMELESSSTRUCT
22 #define NONAMELESSUNION
28 #include "wine/test.h"
36 DEFINE_GUID(DSPROPSETID_VoiceManager
,0x62A69BAE,0xDF9D,0x11D1,0x99,0xA6,0x00,0xC0,0x4F,0xC9,0x9D,0x46);
37 DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties
,0x306a6a8,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
38 DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties
,0x306a6a7,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
39 DEFINE_GUID(DSPROPSETID_I3DL2_ListenerProperties
,0xDA0F0520,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
40 DEFINE_GUID(DSPROPSETID_I3DL2_BufferProperties
,0xDA0F0521,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
41 DEFINE_GUID(DSPROPSETID_ZOOMFX_BufferProperties
,0xCD5368E0,0x3450,0x11D3,0x8B,0x6E,0x00,0x10,0x5A,0x9B,0x7B,0xBC);
43 typedef HRESULT (CALLBACK
* MYPROC
)(REFCLSID
, REFIID
, LPVOID
*);
45 BOOL CALLBACK
callback(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA data
, LPVOID context
)
47 trace("found device:\n");
49 data
->Type
== DIRECTSOUNDDEVICE_TYPE_EMULATED
? "Emulated" :
50 data
->Type
== DIRECTSOUNDDEVICE_TYPE_VXD
? "VxD" :
51 data
->Type
== DIRECTSOUNDDEVICE_TYPE_WDM
? "WDM" : "Unknown");
52 trace("\tDataFlow: %s\n",
53 data
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "Render" :
54 data
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "Capture" : "Unknown");
55 trace("\tDeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
56 data
->DeviceId
.Data1
,data
->DeviceId
.Data2
,data
->DeviceId
.Data3
,
57 data
->DeviceId
.Data4
[0],data
->DeviceId
.Data4
[1],data
->DeviceId
.Data4
[2],data
->DeviceId
.Data4
[3],
58 data
->DeviceId
.Data4
[4],data
->DeviceId
.Data4
[5],data
->DeviceId
.Data4
[6],data
->DeviceId
.Data4
[7]);
59 trace("\tDescription: %s\n", data
->Description
);
60 trace("\tModule: %s\n", data
->Module
);
61 trace("\tInterface: %s\n", data
->Interface
);
62 trace("\tWaveDeviceId: %ld\n", data
->WaveDeviceId
);
67 static void propset_private_tests()
76 hDsound
= LoadLibrary("dsound.dll");
77 ok(hDsound
!=0,"LoadLibrary(dsound.dll) failed\n");
81 fProc
= (MYPROC
)GetProcAddress(hDsound
, "DllGetClassObject");
83 /* try direct sound first */
84 hr
= (fProc
)(&CLSID_DirectSound
, &IID_IClassFactory
, (void **)0);
85 ok(hr
==DSERR_INVALIDPARAM
,"DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) should have failed: 0x%lx\n",hr
);
87 hr
= (fProc
)(&CLSID_DirectSound
, &IID_IClassFactory
, (void **)(&pcf
));
88 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) failed: 0x%lx\n",hr
);
92 /* direct sound doesn't have an IKsPropertySet */
93 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)0);
94 ok(hr
==DSERR_INVALIDPARAM
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
96 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
97 ok(hr
==E_NOINTERFACE
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
99 /* and the direct sound 8 version */
100 hr
= (fProc
)(&CLSID_DirectSound8
, &IID_IClassFactory
, (void **)(&pcf
));
101 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSound8, IID_IClassFactory) failed: 0x%lx\n",hr
);
105 /* direct sound 8 doesn't have an IKsPropertySet */
106 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
107 ok(hr
==E_NOINTERFACE
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
109 /* try direct sound capture next */
110 hr
= (fProc
)(&CLSID_DirectSoundCapture
, &IID_IClassFactory
, (void **)(&pcf
));
111 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSoundCapture, IID_IClassFactory) failed: 0x%lx\n",hr
);
115 /* direct sound capture doesn't have an IKsPropertySet */
116 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
117 ok(hr
==E_NOINTERFACE
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
119 /* and the direct sound capture 8 version */
120 hr
= (fProc
)(&CLSID_DirectSoundCapture8
, &IID_IClassFactory
, (void **)(&pcf
));
121 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSoundCapture8, IID_IClassFactory) failed: 0x%lx\n",hr
);
125 /* direct sound capture 8 doesn't have an IKsPropertySet */
126 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
127 ok(hr
==E_NOINTERFACE
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
129 /* try direct sound full duplex next */
130 hr
= (fProc
)(&CLSID_DirectSoundFullDuplex
, &IID_IClassFactory
, (void **)(&pcf
));
131 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSoundFullDuplex, IID_IClassFactory) failed: 0x%lx\n",hr
);
135 /* direct sound full duplex doesn't have an IKsPropertySet */
136 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
137 ok(hr
==E_NOINTERFACE
, "CreateInstance(IID_IKsPropertySet) should have failed: 0x%lx\n",hr
);
139 /* try direct sound private last */
140 hr
= (fProc
)(&CLSID_DirectSoundPrivate
, &IID_IClassFactory
, (void **)(&pcf
));
141 ok(pcf
!=0, "DllGetClassObject(CLSID_DirectSoundPrivate, IID_IClassFactory) failed: 0x%lx\n",hr
);
145 /* direct sound private does have an IKsPropertySet */
146 hr
= pcf
->lpVtbl
->CreateInstance(pcf
, NULL
, &IID_IKsPropertySet
, (void **)(&pps
));
147 ok(hr
==DS_OK
, "CreateInstance(IID_IKsPropertySet) failed: 0x%lx\n",hr
);
151 hr
= pps
->lpVtbl
->QuerySupport(pps
, &DSPROPSETID_DirectSoundDevice
, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION
, &support
);
152 ok(hr
==DS_OK
, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION) failed: 0x%lx\n",hr
);
156 ok (support
& KSPROPERTY_SUPPORT_GET
, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: support = 0x%lx\n",support
);
157 ok (!(support
& KSPROPERTY_SUPPORT_SET
), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: support = 0x%lx\n",support
);
159 hr
= pps
->lpVtbl
->QuerySupport(pps
, &DSPROPSETID_DirectSoundDevice
, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING
, &support
);
160 ok(hr
==DS_OK
, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING) failed: 0x%lx\n",hr
);
164 ok (support
& KSPROPERTY_SUPPORT_GET
, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = 0x%lx\n",support
);
165 ok (!(support
& KSPROPERTY_SUPPORT_SET
), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = 0x%lx\n",support
);
167 hr
= pps
->lpVtbl
->QuerySupport(pps
, &DSPROPSETID_DirectSoundDevice
, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE
, &support
);
168 ok(hr
==DS_OK
, "QuerySupport(DSPROPSETID_DirectSoundDevice, DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE) failed: 0x%lx\n",hr
);
172 ok (support
& KSPROPERTY_SUPPORT_GET
, "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%lx\n",support
);
173 ok (!(support
& KSPROPERTY_SUPPORT_SET
), "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%lx\n",support
);
175 if (support
& KSPROPERTY_SUPPORT_GET
)
177 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data
;
180 data
.Callback
= callback
;
183 hr
= pps
->lpVtbl
->Get(pps
, &DSPROPSETID_DirectSoundDevice
,
184 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE
,
190 ok(hr
==DS_OK
, "Couldn't enumerate: 0x%lx\n",hr
);
194 FreeLibrary(hDsound
);
197 static HWND
get_hwnd()
199 HWND hwnd
=GetForegroundWindow();
201 hwnd
=GetDesktopWindow();
205 static BOOL WINAPI
dsenum_callback(LPGUID lpGuid
, LPCSTR lpcstrDescription
,
206 LPCSTR lpcstrModule
, LPVOID lpContext
)
209 LPDIRECTSOUND dso
=NULL
;
210 LPDIRECTSOUNDBUFFER primary
=NULL
,secondary
=NULL
;
211 DSBUFFERDESC bufdesc
;
215 rc
=DirectSoundCreate(lpGuid
,&dso
,NULL
);
216 ok(rc
==DS_OK
,"DirectSoundCreate failed: 0x%lx\n",rc
);
220 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
221 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
222 rc
=IDirectSound_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
223 ok(rc
==DS_OK
,"SetCooperativeLevel failed: 0x%lx\n",rc
);
227 /* Testing 3D buffers */
229 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
230 bufdesc
.dwSize
=sizeof(bufdesc
);
231 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
|DSBCAPS_LOCHARDWARE
|DSBCAPS_CTRL3D
;
232 rc
=IDirectSound_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
233 ok(rc
==DS_OK
&&primary
!=NULL
,"CreateSoundBuffer failed to create a hardware 3D primary buffer: 0x%lx\n",rc
);
234 if (rc
==DS_OK
&&primary
!=NULL
) {
235 ZeroMemory(&wfx
, sizeof(wfx
));
236 wfx
.wFormatTag
=WAVE_FORMAT_PCM
;
238 wfx
.wBitsPerSample
=16;
239 wfx
.nSamplesPerSec
=44100;
240 wfx
.nBlockAlign
=wfx
.nChannels
*wfx
.wBitsPerSample
/8;
241 wfx
.nAvgBytesPerSec
=wfx
.nSamplesPerSec
*wfx
.nBlockAlign
;
242 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
243 bufdesc
.dwSize
=sizeof(bufdesc
);
244 bufdesc
.dwFlags
=DSBCAPS_CTRLDEFAULT
|DSBCAPS_GETCURRENTPOSITION2
;
245 bufdesc
.dwBufferBytes
=wfx
.nAvgBytesPerSec
;
246 bufdesc
.lpwfxFormat
=&wfx
;
247 trace(" Testing a secondary buffer at %ldx%dx%d\n",
248 wfx
.nSamplesPerSec
,wfx
.wBitsPerSample
,wfx
.nChannels
);
249 rc
=IDirectSound_CreateSoundBuffer(dso
,&bufdesc
,&secondary
,NULL
);
250 ok(rc
==DS_OK
&&secondary
!=NULL
,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc
);
251 if (rc
==DS_OK
&&secondary
!=NULL
) {
252 IKsPropertySet
* pPropertySet
=NULL
;
253 rc
=IDirectSoundBuffer_QueryInterface(secondary
,&IID_IKsPropertySet
,(void **)&pPropertySet
);
254 /* it's not an error for this to fail */
257 trace(" Supports property sets\n");
258 /* it's not an error for these to fail */
259 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_VoiceManager
,0,&ulTypeSupport
);
260 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
261 trace(" DSPROPSETID_VoiceManager supported\n");
263 trace(" DSPROPSETID_VoiceManager not supported\n");
264 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_EAX20_ListenerProperties
,0,&ulTypeSupport
);
265 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
266 trace(" DSPROPSETID_EAX20_ListenerProperties supported\n");
268 trace(" DSPROPSETID_EAX20_ListenerProperties not supported\n");
269 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_EAX20_BufferProperties
,0,&ulTypeSupport
);
270 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
271 trace(" DSPROPSETID_EAX20_BufferProperties supported\n");
273 trace(" DSPROPSETID_EAX20_BufferProperties not supported\n");
274 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_I3DL2_ListenerProperties
,0,&ulTypeSupport
);
275 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
276 trace(" DSPROPSETID_I3DL2_ListenerProperties supported\n");
278 trace(" DSPROPSETID_I3DL2_ListenerProperties not supported\n");
279 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_I3DL2_BufferProperties
,0,&ulTypeSupport
);
280 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
281 trace(" DSPROPSETID_I3DL2_BufferProperties supported\n");
283 trace(" DSPROPSETID_I3DL2_BufferProperties not supported\n");
284 rc
=IKsPropertySet_QuerySupport(pPropertySet
,&DSPROPSETID_ZOOMFX_BufferProperties
,0,&ulTypeSupport
);
285 if((rc
==DS_OK
)&&(ulTypeSupport
&(KSPROPERTY_SUPPORT_GET
|KSPROPERTY_SUPPORT_SET
)))
286 trace(" DSPROPSETID_ZOOMFX_BufferProperties supported\n");
288 trace(" DSPROPSETID_ZOOMFX_BufferProperties not supported\n");
289 ref
=IKsPropertySet_Release(pPropertySet
);
290 /* try a few common ones */
291 ok(ref
==0,"IKsPropertySet_Release secondary has %d references, should have 0\n",ref
);
293 trace(" Doesn't support property sets\n");
294 ref
=IDirectSoundBuffer_Release(secondary
);
295 ok(ref
==0,"IDirectSoundBuffer_Release secondary has %d references, should have 0\n",ref
);
298 ref
=IDirectSoundBuffer_Release(primary
);
299 ok(ref
==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref
);
304 ref
=IDirectSound_Release(dso
);
305 ok(ref
==0,"IDirectSound_Release has %d references, should have 0\n",ref
);
310 static void propset_buffer_tests()
313 rc
=DirectSoundEnumerateA(&dsenum_callback
,NULL
);
314 ok(rc
==DS_OK
,"DirectSoundEnumerate failed: %ld\n",rc
);
319 propset_private_tests();
320 propset_buffer_tests();