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
36 #include "wine/debug.h"
40 #include "dsound_private.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(dsound
);
51 #include "dsound_private.h"
55 DIRECTSOUNDDEVICE_DATAFLOW_RENDER
,
56 DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
57 } DIRECTSOUNDDEVICE_DATAFLOW
;
59 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
62 DIRECTSOUNDDEVICE_DATAFLOW DataFlow
;
64 } DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
;
66 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
69 DIRECTSOUNDDEVICE_DATAFLOW DataFlow
;
71 } DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
;
75 DIRECTSOUNDDEVICE_TYPE_EMULATED
,
76 DIRECTSOUNDDEVICE_TYPE_VXD
,
77 DIRECTSOUNDDEVICE_TYPE_WDM
78 } DIRECTSOUNDDEVICE_TYPE
;
80 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
83 CHAR DescriptionA
[0x100];
84 WCHAR DescriptionW
[0x100];
85 CHAR ModuleA
[MAX_PATH
];
86 WCHAR ModuleW
[MAX_PATH
];
87 DIRECTSOUNDDEVICE_TYPE Type
;
88 DIRECTSOUNDDEVICE_DATAFLOW DataFlow
;
91 } DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
;
93 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
95 DIRECTSOUNDDEVICE_TYPE Type
;
96 DIRECTSOUNDDEVICE_DATAFLOW DataFlow
;
102 } DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
;
104 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
106 DIRECTSOUNDDEVICE_TYPE Type
;
107 DIRECTSOUNDDEVICE_DATAFLOW DataFlow
;
113 } DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
;
115 typedef struct _DSDRIVERDESC
125 LPVOID pvDirectDrawHeap
;
126 DWORD dwMemStartAddress
;
127 DWORD dwMemEndAddress
;
128 DWORD dwMemAllocExtra
;
131 } DSDRIVERDESC
,*PDSDRIVERDESC
;
133 #ifndef E_PROP_ID_UNSUPPORTED
134 #define E_PROP_ID_UNSUPPORTED ((HRESULT)0x80070490)
137 #ifndef DRV_QUERYDSOUNDDESC
138 #define DRV_QUERYDSOUNDDESC (DRV_RESERVED + 21)
141 typedef BOOL (CALLBACK
*LPFNDIRECTSOUNDDEVICEENUMERATECALLBACK1
)(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
, LPVOID
);
142 typedef BOOL (CALLBACK
*LPFNDIRECTSOUNDDEVICEENUMERATECALLBACKA
)(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
, LPVOID
);
143 typedef BOOL (CALLBACK
*LPFNDIRECTSOUNDDEVICEENUMERATECALLBACKW
)(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
, LPVOID
);
145 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
147 LPFNDIRECTSOUNDDEVICEENUMERATECALLBACK1 Callback
;
149 } DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
;
151 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
153 LPFNDIRECTSOUNDDEVICEENUMERATECALLBACKA Callback
;
155 } DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
;
157 typedef struct _DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
159 LPFNDIRECTSOUNDDEVICEENUMERATECALLBACKW Callback
;
161 } DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
, *PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
;
163 DEFINE_GUID(DSPROPSETID_DirectSoundDevice
,0x84624f82,0x25ec,0x11d1,0xa4,0xd8,0x00,0xc0,0x4f,0xc2,0x8a,0xca);
167 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
= 1,
168 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
= 2,
169 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
= 3,
170 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
= 4,
171 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
= 5,
172 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
= 6,
173 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
= 7,
174 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
= 8,
175 } DSPROPERTY_DIRECTSOUNDDEVICE
;
177 #ifndef ULongToHandle
178 #define ULongToHandle(ul) ((HANDLE)(ULONG_PTR)(ul))
180 #ifndef UlongToHandle
181 #define UlongToHandle(ul) ULongToHandle(ul)
186 typedef struct IKsPrivatePropertySetImpl
{
187 IKsPropertySet IKsPropertySet_iface
;
189 } IKsPrivatePropertySetImpl
;
191 /*******************************************************************************
192 * IKsPrivatePropertySet
195 /* IUnknown methods */
196 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
197 LPKSPROPERTYSET iface
,
201 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
202 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
204 if (IsEqualIID(riid
, &IID_IUnknown
) ||
205 IsEqualIID(riid
, &IID_IKsPropertySet
)) {
207 IUnknown_AddRef(iface
);
211 return E_NOINTERFACE
;
214 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
216 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
217 ULONG ref
= InterlockedIncrement(&(This
->ref
));
218 TRACE("(%p) ref was %u\n", This
, (UINT
)ref
- 1);
222 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
224 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
225 ULONG ref
= InterlockedDecrement(&(This
->ref
));
226 TRACE("(%p) ref was %u\n", This
, (UINT
)ref
+ 1);
229 HeapFree(GetProcessHeap(), 0, This
);
230 TRACE("(%p) released\n", This
);
235 static HRESULT
DSPROPERTY_WaveDeviceMappingW(
240 HRESULT hr
= DSERR_INVALIDPARAM
;
241 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd
;
242 TRACE("(pPropData=%p,cbPropData=%u,pcbReturned=%p)\n",
243 pPropData
,(UINT
)cbPropData
,pcbReturned
);
248 WARN("invalid parameter: pPropData\n");
249 return DSERR_INVALIDPARAM
;
252 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
255 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
256 wodn
= waveOutGetNumDevs();
257 for (wod
= 0; wod
< wodn
; wod
++) {
260 res
= waveOutGetDevCapsW(wod
, &capsW
, sizeof(capsW
));
261 if (res
== MMSYSERR_NOERROR
) {
262 if (lstrcmpW(capsW
.szPname
, ppd
->DeviceName
) == 0) {
263 ppd
->DeviceId
= DSOUND_renderer_guid
;
264 ppd
->DeviceId
.Data4
[7] = wod
;
266 TRACE("found %s for %s\n", debugstr_guid(&ppd
->DeviceId
),
267 debugstr_w(ppd
->DeviceName
));
272 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
275 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
276 widn
= waveInGetNumDevs();
277 for (wid
= 0; wid
< widn
; wid
++) {
280 res
= waveInGetDevCapsW(wid
, &capsW
, sizeof(capsW
));
281 if (res
== MMSYSERR_NOERROR
) {
282 if (lstrcmpW(capsW
.szPname
, ppd
->DeviceName
) == 0) {
283 ppd
->DeviceId
= DSOUND_capture_guid
;
284 ppd
->DeviceId
.Data4
[7] = wid
;
286 TRACE("found %s for %s\n", debugstr_guid(&ppd
->DeviceId
),
287 debugstr_w(ppd
->DeviceName
));
295 *pcbReturned
= cbPropData
;
300 static HRESULT
DSPROPERTY_WaveDeviceMappingA(
305 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
*ppd
= pPropData
;
306 DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA data
;
310 TRACE("(pPropData=%p,cbPropData=%u,pcbReturned=%p)\n",
311 pPropData
,(UINT
)cbPropData
,pcbReturned
);
313 if (!ppd
|| !ppd
->DeviceName
) {
314 WARN("invalid parameter: ppd=%p\n", ppd
);
315 return DSERR_INVALIDPARAM
;
318 data
.DataFlow
= ppd
->DataFlow
;
319 len
= strlen(ppd
->DeviceName
)+1;
320 data
.DeviceName
= HeapAlloc(GetProcessHeap(), 0, len
);
321 if (!data
.DeviceName
)
322 return E_OUTOFMEMORY
;
323 MultiByteToWideChar(CP_ACP
, 0, ppd
->DeviceName
, -1, data
.DeviceName
, len
);
325 hr
= DSPROPERTY_WaveDeviceMappingW(&data
, cbPropData
, pcbReturned
);
326 HeapFree(GetProcessHeap(), 0, data
.DeviceName
);
327 ppd
->DeviceId
= data
.DeviceId
;
330 *pcbReturned
= cbPropData
;
335 static HRESULT
DSPROPERTY_DescriptionW(
340 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd
= pPropData
;
343 ULONG wod
, wid
, wodn
, widn
;
346 TRACE("pPropData=%p,cbPropData=%u,pcbReturned=%p)\n",
347 pPropData
,(UINT
)cbPropData
,pcbReturned
);
349 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
350 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
351 /* default device of type specified by ppd->DataFlow */
352 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
353 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
354 ppd
->DeviceId
= DSDEVID_DefaultCapture
;
355 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
356 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
357 ppd
->DeviceId
= DSDEVID_DefaultPlayback
;
359 WARN("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
360 return E_PROP_ID_UNSUPPORTED
;
364 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
366 wodn
= waveOutGetNumDevs();
367 widn
= waveInGetNumDevs();
368 wid
= wod
= dev_guid
.Data4
[7];
369 if (!memcmp(&dev_guid
, &DSOUND_renderer_guid
, sizeof(GUID
)-1)
372 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
373 ppd
->WaveDeviceId
= wod
;
375 else if (!memcmp(&dev_guid
, &DSOUND_capture_guid
, sizeof(GUID
)-1)
378 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
379 ppd
->WaveDeviceId
= wid
;
383 WARN("Device not found\n");
384 return E_PROP_ID_UNSUPPORTED
;
387 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
)
388 err
= waveOutMessage(UlongToHandle(wod
),DRV_QUERYDSOUNDDESC
,(DWORD_PTR
)&desc
,0);
390 err
= waveInMessage(UlongToHandle(wod
),DRV_QUERYDSOUNDDESC
,(DWORD_PTR
)&desc
,0);
392 if (err
!= MMSYSERR_NOERROR
)
394 WARN("waveMessage(DRV_QUERYDSOUNDDESC) failed!\n");
395 return E_PROP_ID_UNSUPPORTED
;
399 /* FIXME: Still a memory leak.. */
401 static WCHAR wInterface
[] = { 'I','n','t','e','r','f','a','c','e',0 };
403 modlen
= strlen(desc
.szDrvname
)+1;
404 desclen
= strlen(desc
.szDesc
)+1;
405 ppd
->Module
= HeapAlloc(GetProcessHeap(),0,modlen
*sizeof(WCHAR
));
406 ppd
->Description
= HeapAlloc(GetProcessHeap(),0,desclen
*sizeof(WCHAR
));
407 ppd
->Interface
= wInterface
;
408 if (!ppd
->Description
|| !ppd
->Module
)
410 WARN("Out of memory\n");
411 HeapFree(GetProcessHeap(), 0, ppd
->Description
);
412 HeapFree(GetProcessHeap(), 0, ppd
->Module
);
413 ppd
->Description
= ppd
->Module
= NULL
;
414 return E_OUTOFMEMORY
;
417 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, ppd
->Module
, modlen
);
418 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->Description
, desclen
);
421 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
424 *pcbReturned
= sizeof(*ppd
);
425 TRACE("*pcbReturned=%u\n", (UINT
)*pcbReturned
);
431 static HRESULT
DSPROPERTY_EnumerateW(
436 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= pPropData
;
437 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
440 TRACE("(pPropData=%p,cbPropData=%u,pcbReturned=%p)\n",
441 pPropData
,(UINT
)cbPropData
,pcbReturned
);
446 if (!ppd
|| !ppd
->Callback
)
448 WARN("Invalid ppd %p\n", ppd
);
449 return E_PROP_ID_UNSUPPORTED
;
452 wodn
= waveOutGetNumDevs();
453 widn
= waveInGetNumDevs();
455 data
.DeviceId
= DSOUND_renderer_guid
;
456 for (i
= 0; i
< wodn
; ++i
)
459 data
.DeviceId
.Data4
[7] = i
;
460 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
463 ERR("DescriptionW failed!\n");
466 ret
= ppd
->Callback(&data
, ppd
->Context
);
467 HeapFree(GetProcessHeap(), 0, data
.Module
);
468 HeapFree(GetProcessHeap(), 0, data
.Description
);
473 data
.DeviceId
= DSOUND_capture_guid
;
474 for (i
= 0; i
< widn
; ++i
)
477 data
.DeviceId
.Data4
[7] = i
;
478 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
481 ERR("DescriptionW failed!\n");
484 ret
= ppd
->Callback(&data
, ppd
->Context
);
485 HeapFree(GetProcessHeap(), 0, data
.Module
);
486 HeapFree(GetProcessHeap(), 0, data
.Description
);
493 static void DSPROPERTY_descWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*dataW
,
494 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
*dataA
)
496 DWORD modlen
, desclen
;
497 static char Interface
[] = "Interface";
499 modlen
= lstrlenW(dataW
->Module
)+1;
500 desclen
= lstrlenW(dataW
->Description
)+1;
501 dataA
->Type
= dataW
->Type
;
502 dataA
->DataFlow
= dataW
->DataFlow
;
503 dataA
->DeviceId
= dataW
->DeviceId
;
504 dataA
->WaveDeviceId
= dataW
->WaveDeviceId
;
505 dataA
->Interface
= Interface
;
506 dataA
->Module
= HeapAlloc(GetProcessHeap(), 0, modlen
);
507 dataA
->Description
= HeapAlloc(GetProcessHeap(), 0, desclen
);
509 WideCharToMultiByte(CP_ACP
, 0, dataW
->Module
, -1, dataA
->Module
, modlen
, NULL
, NULL
);
510 if (dataA
->Description
)
511 WideCharToMultiByte(CP_ACP
, 0, dataW
->Description
, -1, dataA
->Description
, desclen
, NULL
, NULL
);
514 static void DSPROPERTY_descWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*dataW
,
515 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
*data1
)
517 data1
->DeviceId
= dataW
->DeviceId
;
518 lstrcpynW(data1
->ModuleW
, dataW
->Module
, sizeof(data1
->ModuleW
)/sizeof(*data1
->ModuleW
));
519 lstrcpynW(data1
->DescriptionW
, dataW
->Description
, sizeof(data1
->DescriptionW
)/sizeof(*data1
->DescriptionW
));
520 WideCharToMultiByte(CP_ACP
, 0, data1
->DescriptionW
, -1, data1
->DescriptionA
, sizeof(data1
->DescriptionA
), NULL
, NULL
);
521 WideCharToMultiByte(CP_ACP
, 0, data1
->ModuleW
, -1, data1
->ModuleA
, sizeof(data1
->ModuleA
), NULL
, NULL
);
522 data1
->Type
= dataW
->Type
;
523 data1
->DataFlow
= dataW
->DataFlow
;
524 data1
->WaveDeviceId
= data1
->Devnode
= dataW
->WaveDeviceId
;
527 static BOOL CALLBACK
DSPROPERTY_enumWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*descW
, void *data
)
529 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA descA
;
530 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
*ppd
= data
;
533 DSPROPERTY_descWtoA(descW
, &descA
);
534 ret
= ppd
->Callback(&descA
, ppd
->Context
);
535 HeapFree(GetProcessHeap(), 0, descA
.Module
);
536 HeapFree(GetProcessHeap(), 0, descA
.Description
);
540 static HRESULT
DSPROPERTY_EnumerateA(
545 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
*ppd
= pPropData
;
546 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data
;
548 if (!ppd
|| !ppd
->Callback
)
550 WARN("Invalid ppd %p\n", ppd
);
551 return E_PROP_ID_UNSUPPORTED
;
554 data
.Callback
= DSPROPERTY_enumWtoA
;
557 return DSPROPERTY_EnumerateW(&data
, cbPropData
, pcbReturned
);
560 static BOOL CALLBACK
DSPROPERTY_enumWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
*descW
, void *data
)
562 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA desc1
;
563 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
*ppd
= data
;
566 DSPROPERTY_descWto1(descW
, &desc1
);
567 ret
= ppd
->Callback(&desc1
, ppd
->Context
);
571 static HRESULT
DSPROPERTY_Enumerate1(
576 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA
*ppd
= pPropData
;
577 DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data
;
579 if (!ppd
|| !ppd
->Callback
)
581 WARN("Invalid ppd %p\n", ppd
);
582 return E_PROP_ID_UNSUPPORTED
;
585 data
.Callback
= DSPROPERTY_enumWto1
;
588 return DSPROPERTY_EnumerateW(&data
, cbPropData
, pcbReturned
);
591 static HRESULT
DSPROPERTY_DescriptionA(
596 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
597 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
*ppd
= pPropData
;
601 *pcbReturned
= sizeof(*ppd
);
605 data
.DeviceId
= ppd
->DeviceId
;
606 data
.DataFlow
= ppd
->DataFlow
;
607 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
610 DSPROPERTY_descWtoA(&data
, ppd
);
611 HeapFree(GetProcessHeap(), 0, data
.Module
);
612 HeapFree(GetProcessHeap(), 0, data
.Interface
);
616 static HRESULT
DSPROPERTY_Description1(
621 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
622 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
*ppd
= pPropData
;
626 *pcbReturned
= sizeof(*ppd
);
630 data
.DeviceId
= ppd
->DeviceId
;
631 data
.DataFlow
= ppd
->DataFlow
;
632 hr
= DSPROPERTY_DescriptionW(&data
, sizeof(data
), NULL
);
635 DSPROPERTY_descWto1(&data
, ppd
);
636 HeapFree(GetProcessHeap(), 0, data
.Module
);
637 HeapFree(GetProcessHeap(), 0, data
.Interface
);
641 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
642 LPKSPROPERTYSET iface
,
645 LPVOID pInstanceData
,
646 ULONG cbInstanceData
,
651 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
652 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%u,pInstanceData=%p,cbInstanceData=%u,pPropData=%p,cbPropData=%u,pcbReturned=%p)\n",
653 This
,debugstr_guid(guidPropSet
),(UINT
)dwPropID
,
654 pInstanceData
,(UINT
)cbInstanceData
,
655 pPropData
,(UINT
)cbPropData
,pcbReturned
);
657 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
659 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
660 return DSPROPERTY_WaveDeviceMappingA(pPropData
,cbPropData
,pcbReturned
);
661 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
662 return DSPROPERTY_Description1(pPropData
,cbPropData
,pcbReturned
);
663 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
664 return DSPROPERTY_Enumerate1(pPropData
,cbPropData
,pcbReturned
);
665 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
666 return DSPROPERTY_WaveDeviceMappingW(pPropData
,cbPropData
,pcbReturned
);
667 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
668 return DSPROPERTY_DescriptionA(pPropData
,cbPropData
,pcbReturned
);
669 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
670 return DSPROPERTY_DescriptionW(pPropData
,cbPropData
,pcbReturned
);
671 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
672 return DSPROPERTY_EnumerateA(pPropData
,cbPropData
,pcbReturned
);
673 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
674 return DSPROPERTY_EnumerateW(pPropData
,cbPropData
,pcbReturned
);
676 FIXME("unsupported ID: %u\n",(UINT
)dwPropID
);
680 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
685 FIXME("*pcbReturned=%u\n", (UINT
)*pcbReturned
);
688 return E_PROP_ID_UNSUPPORTED
;
691 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
692 LPKSPROPERTYSET iface
,
695 LPVOID pInstanceData
,
696 ULONG cbInstanceData
,
700 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
702 FIXME("(%p)->(%s,%u,%p,%u,%p,%u), stub!\n",This
,
703 debugstr_guid(guidPropSet
),(UINT
)dwPropID
,
704 pInstanceData
,(UINT
)cbInstanceData
,pPropData
,(UINT
)cbPropData
);
705 return E_PROP_ID_UNSUPPORTED
;
708 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
709 LPKSPROPERTYSET iface
,
712 PULONG pTypeSupport
)
714 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
715 TRACE("(%p,%s,%u,%p)\n",This
,debugstr_guid(guidPropSet
),(UINT
)dwPropID
,pTypeSupport
);
717 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
719 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
720 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
722 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
723 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
725 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
726 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
728 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
729 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
731 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
732 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
734 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
735 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
737 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
738 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
740 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
741 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
744 FIXME("unsupported ID: %u\n",(UINT
)dwPropID
);
748 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
751 return E_PROP_ID_UNSUPPORTED
;
754 static const IKsPropertySetVtbl ikspvt
= {
755 IKsPrivatePropertySetImpl_QueryInterface
,
756 IKsPrivatePropertySetImpl_AddRef
,
757 IKsPrivatePropertySetImpl_Release
,
758 IKsPrivatePropertySetImpl_Get
,
759 IKsPrivatePropertySetImpl_Set
,
760 IKsPrivatePropertySetImpl_QuerySupport
763 HRESULT
IKsPrivatePropertySetImpl_Create(
767 IKsPrivatePropertySetImpl
*iks
;
768 TRACE("(%s, %p)\n", debugstr_guid(riid
), piks
);
770 if (!IsEqualIID(riid
, &IID_IUnknown
) &&
771 !IsEqualIID(riid
, &IID_IKsPropertySet
)) {
773 return E_NOINTERFACE
;
776 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
778 iks
->IKsPropertySet_iface
.lpVtbl
= &ikspvt
;