3 * Copyright 1998 Marcus Meissner
4 * Copyright 1998 Rob Riggs
5 * Copyright 2000-2002 TransGaming Technologies, Inc.
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.
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.
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
33 #include "wine/debug.h"
36 #include "dsound_private.h"
39 #ifdef NONAMELESSSTRUCT
45 WINE_DEFAULT_DEBUG_CHANNEL(dsound
);
47 /*******************************************************************************
48 * IKsPrivatePropertySet
51 /* IUnknown methods */
52 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
53 LPKSPROPERTYSET iface
,
57 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
58 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
60 if (IsEqualIID(riid
, &IID_IUnknown
) ||
61 IsEqualIID(riid
, &IID_IKsPropertySet
)) {
63 IUnknown_AddRef(iface
);
70 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
72 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
73 ULONG ref
= InterlockedIncrement(&(This
->ref
));
74 TRACE("(%p) ref was %d\n", This
, ref
- 1);
78 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
80 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
81 ULONG ref
= InterlockedDecrement(&(This
->ref
));
82 TRACE("(%p) ref was %d\n", This
, ref
+ 1);
85 HeapFree(GetProcessHeap(), 0, This
);
86 TRACE("(%p) released\n", This
);
91 static HRESULT
DSPROPERTY_WaveDeviceMappingW(
96 HRESULT hr
= DSERR_INVALIDPARAM
;
97 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd
;
98 TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
99 pPropData
,cbPropData
,pcbReturned
);
104 WARN("invalid parameter: pPropData\n");
105 return DSERR_INVALIDPARAM
;
108 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
111 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
112 wodn
= waveOutGetNumDevs();
113 for (wod
= 0; wod
< wodn
; wod
++) {
116 res
= waveOutGetDevCapsW(wod
, &capsW
, sizeof(capsW
));
117 if (res
== MMSYSERR_NOERROR
) {
118 if (lstrcmpW(capsW
.szPname
, ppd
->DeviceName
) == 0) {
119 ppd
->DeviceId
= DSOUND_renderer_guid
;
120 ppd
->DeviceId
.Data4
[7] = wod
;
122 TRACE("found %s for %s\n", debugstr_guid(&ppd
->DeviceId
),
123 debugstr_w(ppd
->DeviceName
));
128 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
131 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
132 widn
= waveInGetNumDevs();
133 for (wid
= 0; wid
< widn
; wid
++) {
136 res
= waveInGetDevCapsW(wid
, &capsW
, sizeof(capsW
));
137 if (res
== MMSYSERR_NOERROR
) {
138 if (lstrcmpW(capsW
.szPname
, ppd
->DeviceName
) == 0) {
139 ppd
->DeviceId
= DSOUND_capture_guid
;
140 ppd
->DeviceId
.Data4
[7] = wid
;
142 TRACE("found %s for %s\n", debugstr_guid(&ppd
->DeviceId
),
143 debugstr_w(ppd
->DeviceName
));
151 *pcbReturned
= cbPropData
;
156 static HRESULT
DSPROPERTY_WaveDeviceMappingA(
161 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
*ppd
= pPropData
;
162 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA data
;
166 TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
167 pPropData
,cbPropData
,pcbReturned
);
169 if (!ppd
|| !ppd
->DeviceName
) {
170 WARN("invalid parameter: ppd=%p\n", ppd
);
171 return DSERR_INVALIDPARAM
;
174 data
.DataFlow
= ppd
->DataFlow
;
175 len
= MultiByteToWideChar(CP_ACP
, 0, ppd
->DeviceName
, -1, NULL
, 0);
176 data
.DeviceName
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
177 if (!data
.DeviceName
)
178 return E_OUTOFMEMORY
;
179 MultiByteToWideChar(CP_ACP
, 0, ppd
->DeviceName
, -1, data
.DeviceName
, len
);
181 hr
= DSPROPERTY_WaveDeviceMappingW(&data
, cbPropData
, pcbReturned
);
182 HeapFree(GetProcessHeap(), 0, data
.DeviceName
);
183 ppd
->DeviceId
= data
.DeviceId
;
186 *pcbReturned
= cbPropData
;
191 static HRESULT
DSPROPERTY_DescriptionW(
196 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd
= pPropData
;
199 ULONG wod
, wid
, wodn
, widn
;
202 TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
203 pPropData
,cbPropData
,pcbReturned
);
205 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
206 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
207 /* default device of type specified by ppd->DataFlow */
208 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
209 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
210 ppd
->DeviceId
= DSDEVID_DefaultCapture
;
211 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
212 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
213 ppd
->DeviceId
= DSDEVID_DefaultPlayback
;
215 WARN("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
216 return E_PROP_ID_UNSUPPORTED
;
220 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
222 wodn
= waveOutGetNumDevs();
223 widn
= waveInGetNumDevs();
224 wid
= wod
= dev_guid
.Data4
[7];
225 if (!memcmp(&dev_guid
, &DSOUND_renderer_guid
, sizeof(GUID
)-1)
228 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
229 ppd
->WaveDeviceId
= wod
;
231 else if (!memcmp(&dev_guid
, &DSOUND_capture_guid
, sizeof(GUID
)-1)
234 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
235 ppd
->WaveDeviceId
= wid
;
239 WARN("Device not found\n");
240 return E_PROP_ID_UNSUPPORTED
;
243 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
)
244 err
= waveOutMessage(UlongToHandle(wod
),DRV_QUERYDSOUNDDESC
,(DWORD_PTR
)&desc
,0);
246 err
= waveInMessage(UlongToHandle(wod
),DRV_QUERYDSOUNDDESC
,(DWORD_PTR
)&desc
,0);
248 if (err
!= MMSYSERR_NOERROR
)
250 WARN("waveMessage(DRV_QUERYDSOUNDDESC) failed!\n");
251 return E_PROP_ID_UNSUPPORTED
;
255 /* FIXME: Still a memory leak.. */
257 static WCHAR wInterface
[] = { 'I','n','t','e','r','f','a','c','e',0 };
259 modlen
= MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, NULL
, 0 );
260 desclen
= MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, NULL
, 0 );
261 ppd
->Module
= HeapAlloc(GetProcessHeap(),0,modlen
*sizeof(WCHAR
));
262 ppd
->Description
= HeapAlloc(GetProcessHeap(),0,desclen
*sizeof(WCHAR
));
263 ppd
->Interface
= wInterface
;
264 if (!ppd
->Description
|| !ppd
->Module
)
266 WARN("Out of memory\n");
267 HeapFree(GetProcessHeap(), 0, ppd
->Description
);
268 HeapFree(GetProcessHeap(), 0, ppd
->Module
);
269 ppd
->Description
= ppd
->Module
= NULL
;
270 return E_OUTOFMEMORY
;
273 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, ppd
->Module
, modlen
);
274 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->Description
, desclen
);
277 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
280 *pcbReturned
= sizeof(*ppd
);
281 TRACE("*pcbReturned=%d\n", *pcbReturned
);
287 static HRESULT
DSPROPERTY_EnumerateW(
292 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= pPropData
;
293 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
296 TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
297 pPropData
,cbPropData
,pcbReturned
);
302 if (!ppd
|| !ppd
->Callback
)
304 WARN("Invalid ppd %p\n", ppd
);
305 return E_PROP_ID_UNSUPPORTED
;
308 wodn
= waveOutGetNumDevs();
309 widn
= waveInGetNumDevs();
311 data
.DeviceId
= DSOUND_renderer_guid
;
312 for (i
= 0; i
< wodn
; ++i
)
315 data
.DeviceId
.Data4
[7] = i
;
316 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
319 ERR("DescriptionW failed!\n");
322 ret
= ppd
->Callback(&data
, ppd
->Context
);
323 HeapFree(GetProcessHeap(), 0, data
.Module
);
324 HeapFree(GetProcessHeap(), 0, data
.Description
);
329 data
.DeviceId
= DSOUND_capture_guid
;
330 for (i
= 0; i
< widn
; ++i
)
333 data
.DeviceId
.Data4
[7] = i
;
334 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
337 ERR("DescriptionW failed!\n");
340 ret
= ppd
->Callback(&data
, ppd
->Context
);
341 HeapFree(GetProcessHeap(), 0, data
.Module
);
342 HeapFree(GetProcessHeap(), 0, data
.Description
);
349 static BOOL
DSPROPERTY_descWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*dataW
,
350 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
*dataA
)
352 DWORD modlen
, desclen
;
353 static char Interface
[] = "Interface";
355 modlen
= WideCharToMultiByte(CP_ACP
, 0, dataW
->Module
, -1, NULL
, 0, NULL
, NULL
);
356 desclen
= WideCharToMultiByte(CP_ACP
, 0, dataW
->Description
, -1, NULL
, 0, NULL
, NULL
);
357 dataA
->Type
= dataW
->Type
;
358 dataA
->DataFlow
= dataW
->DataFlow
;
359 dataA
->DeviceId
= dataW
->DeviceId
;
360 dataA
->WaveDeviceId
= dataW
->WaveDeviceId
;
361 dataA
->Interface
= Interface
;
362 dataA
->Module
= HeapAlloc(GetProcessHeap(), 0, modlen
);
363 dataA
->Description
= HeapAlloc(GetProcessHeap(), 0, desclen
);
364 if (!dataA
->Module
|| !dataA
->Description
)
366 HeapFree(GetProcessHeap(), 0, dataA
->Module
);
367 HeapFree(GetProcessHeap(), 0, dataA
->Description
);
368 dataA
->Module
= dataA
->Description
= NULL
;
372 WideCharToMultiByte(CP_ACP
, 0, dataW
->Module
, -1, dataA
->Module
, modlen
, NULL
, NULL
);
373 WideCharToMultiByte(CP_ACP
, 0, dataW
->Description
, -1, dataA
->Description
, desclen
, NULL
, NULL
);
377 static void DSPROPERTY_descWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*dataW
,
378 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
*data1
)
380 data1
->DeviceId
= dataW
->DeviceId
;
381 lstrcpynW(data1
->ModuleW
, dataW
->Module
, sizeof(data1
->ModuleW
)/sizeof(*data1
->ModuleW
));
382 lstrcpynW(data1
->DescriptionW
, dataW
->Description
, sizeof(data1
->DescriptionW
)/sizeof(*data1
->DescriptionW
));
383 WideCharToMultiByte(CP_ACP
, 0, data1
->DescriptionW
, -1, data1
->DescriptionA
, sizeof(data1
->DescriptionA
)-1, NULL
, NULL
);
384 WideCharToMultiByte(CP_ACP
, 0, data1
->ModuleW
, -1, data1
->ModuleA
, sizeof(data1
->ModuleA
)-1, NULL
, NULL
);
385 data1
->DescriptionA
[sizeof(data1
->DescriptionA
)-1] = 0;
386 data1
->ModuleA
[sizeof(data1
->ModuleA
)-1] = 0;
387 data1
->Type
= dataW
->Type
;
388 data1
->DataFlow
= dataW
->DataFlow
;
389 data1
->WaveDeviceId
= data1
->Devnode
= dataW
->WaveDeviceId
;
392 static BOOL CALLBACK
DSPROPERTY_enumWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*descW
, void *data
)
394 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA descA
;
395 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
*ppd
= data
;
398 ret
= DSPROPERTY_descWtoA(descW
, &descA
);
401 ret
= ppd
->Callback(&descA
, ppd
->Context
);
402 HeapFree(GetProcessHeap(), 0, descA
.Module
);
403 HeapFree(GetProcessHeap(), 0, descA
.Description
);
407 static HRESULT
DSPROPERTY_EnumerateA(
412 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
*ppd
= pPropData
;
413 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data
;
415 if (!ppd
|| !ppd
->Callback
)
417 WARN("Invalid ppd %p\n", ppd
);
418 return E_PROP_ID_UNSUPPORTED
;
421 data
.Callback
= DSPROPERTY_enumWtoA
;
424 return DSPROPERTY_EnumerateW(&data
, cbPropData
, pcbReturned
);
427 static BOOL CALLBACK
DSPROPERTY_enumWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*descW
, void *data
)
429 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA desc1
;
430 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
*ppd
= data
;
433 DSPROPERTY_descWto1(descW
, &desc1
);
434 ret
= ppd
->Callback(&desc1
, ppd
->Context
);
438 static HRESULT
DSPROPERTY_Enumerate1(
443 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
*ppd
= pPropData
;
444 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data
;
446 if (!ppd
|| !ppd
->Callback
)
448 WARN("Invalid ppd %p\n", ppd
);
449 return E_PROP_ID_UNSUPPORTED
;
452 data
.Callback
= DSPROPERTY_enumWto1
;
455 return DSPROPERTY_EnumerateW(&data
, cbPropData
, pcbReturned
);
458 static HRESULT
DSPROPERTY_DescriptionA(
463 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
464 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
*ppd
= pPropData
;
468 *pcbReturned
= sizeof(*ppd
);
472 data
.DeviceId
= ppd
->DeviceId
;
473 data
.DataFlow
= ppd
->DataFlow
;
474 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
477 if (!DSPROPERTY_descWtoA(&data
, ppd
))
479 HeapFree(GetProcessHeap(), 0, data
.Module
);
480 HeapFree(GetProcessHeap(), 0, data
.Interface
);
484 static HRESULT
DSPROPERTY_Description1(
489 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
490 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
*ppd
= pPropData
;
494 *pcbReturned
= sizeof(*ppd
);
498 data
.DeviceId
= ppd
->DeviceId
;
499 data
.DataFlow
= ppd
->DataFlow
;
500 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
503 DSPROPERTY_descWto1(&data
, ppd
);
504 HeapFree(GetProcessHeap(), 0, data
.Module
);
505 HeapFree(GetProcessHeap(), 0, data
.Interface
);
509 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
510 LPKSPROPERTYSET iface
,
513 LPVOID pInstanceData
,
514 ULONG cbInstanceData
,
519 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
520 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%d,pInstanceData=%p,cbInstanceData=%d,pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
521 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
523 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
525 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
526 return DSPROPERTY_WaveDeviceMappingA(pPropData
,cbPropData
,pcbReturned
);
527 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
528 return DSPROPERTY_Description1(pPropData
,cbPropData
,pcbReturned
);
529 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
530 return DSPROPERTY_Enumerate1(pPropData
,cbPropData
,pcbReturned
);
531 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
532 return DSPROPERTY_WaveDeviceMappingW(pPropData
,cbPropData
,pcbReturned
);
533 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
534 return DSPROPERTY_DescriptionA(pPropData
,cbPropData
,pcbReturned
);
535 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
536 return DSPROPERTY_DescriptionW(pPropData
,cbPropData
,pcbReturned
);
537 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
538 return DSPROPERTY_EnumerateA(pPropData
,cbPropData
,pcbReturned
);
539 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
540 return DSPROPERTY_EnumerateW(pPropData
,cbPropData
,pcbReturned
);
542 FIXME("unsupported ID: %d\n",dwPropID
);
546 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
551 FIXME("*pcbReturned=%d\n", *pcbReturned
);
554 return E_PROP_ID_UNSUPPORTED
;
557 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
558 LPKSPROPERTYSET iface
,
561 LPVOID pInstanceData
,
562 ULONG cbInstanceData
,
566 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
568 FIXME("(%p,%s,%d,%p,%d,%p,%d), stub!\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
569 return E_PROP_ID_UNSUPPORTED
;
572 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
573 LPKSPROPERTYSET iface
,
576 PULONG pTypeSupport
)
578 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
579 TRACE("(%p,%s,%d,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
581 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
583 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
584 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
586 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
587 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
589 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
590 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
592 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
593 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
595 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
596 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
598 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
599 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
601 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
602 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
604 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
605 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
608 FIXME("unsupported ID: %d\n",dwPropID
);
612 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
615 return E_PROP_ID_UNSUPPORTED
;
618 static const IKsPropertySetVtbl ikspvt
= {
619 IKsPrivatePropertySetImpl_QueryInterface
,
620 IKsPrivatePropertySetImpl_AddRef
,
621 IKsPrivatePropertySetImpl_Release
,
622 IKsPrivatePropertySetImpl_Get
,
623 IKsPrivatePropertySetImpl_Set
,
624 IKsPrivatePropertySetImpl_QuerySupport
627 HRESULT
IKsPrivatePropertySetImpl_Create(
629 IKsPrivatePropertySetImpl
**piks
)
631 IKsPrivatePropertySetImpl
*iks
;
632 TRACE("(%s, %p)\n", debugstr_guid(riid
), piks
);
634 if (!IsEqualIID(riid
, &IID_IUnknown
) &&
635 !IsEqualIID(riid
, &IID_IKsPropertySet
)) {
637 return E_NOINTERFACE
;
640 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
642 iks
->lpVtbl
= &ikspvt
;