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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <sys/types.h>
27 #include <sys/fcntl.h>
33 #include <math.h> /* Insomnia - pow() function */
35 #define NONAMELESSUNION
36 #define NONAMELESSSTRUCT
47 #include "wine/windef16.h"
48 #include "wine/debug.h"
51 #include "dsound_private.h"
55 WINE_DEFAULT_DEBUG_CHANNEL(dsound
);
58 /*******************************************************************************
59 * IKsBufferPropertySet
62 /* IUnknown methods */
63 static HRESULT WINAPI
IKsBufferPropertySetImpl_QueryInterface(
64 LPKSPROPERTYSET iface
,
68 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
69 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
71 return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8
)This
->dsb
, riid
, ppobj
);
74 static ULONG WINAPI
IKsBufferPropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
76 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
77 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
78 return InterlockedIncrement(&(This
->ref
));
81 static ULONG WINAPI
IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface
)
83 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
86 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
87 ulReturn
= InterlockedDecrement(&(This
->ref
));
90 IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER
)This
->dsb
);
91 HeapFree(GetProcessHeap(),0,This
);
92 TRACE("(%p) released\n",This
);
97 static HRESULT WINAPI
IKsBufferPropertySetImpl_Get(
98 LPKSPROPERTYSET iface
,
101 LPVOID pInstanceData
,
102 ULONG cbInstanceData
,
107 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
108 PIDSDRIVERPROPERTYSET ps
;
109 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
110 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
112 if (This
->dsb
->hwbuf
) {
113 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
119 prop
.s
.Set
= *guidPropSet
;
120 prop
.s
.Id
= dwPropID
;
121 prop
.s
.Flags
= 0; /* unused */
122 prop
.s
.InstanceId
= (ULONG
)This
->dsb
->dsound
;
124 hres
= IDsDriverPropertySet_Get(ps
, &prop
, pInstanceData
, cbInstanceData
, pPropData
, cbPropData
, pcbReturned
);
126 IDsDriverPropertySet_Release(ps
);
132 return E_PROP_ID_UNSUPPORTED
;
135 static HRESULT WINAPI
IKsBufferPropertySetImpl_Set(
136 LPKSPROPERTYSET iface
,
139 LPVOID pInstanceData
,
140 ULONG cbInstanceData
,
144 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
145 PIDSDRIVERPROPERTYSET ps
;
146 TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
148 if (This
->dsb
->hwbuf
) {
149 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
155 prop
.s
.Set
= *guidPropSet
;
156 prop
.s
.Id
= dwPropID
;
157 prop
.s
.Flags
= 0; /* unused */
158 prop
.s
.InstanceId
= (ULONG
)This
->dsb
->dsound
;
159 hres
= IDsDriverPropertySet_Set(ps
,&prop
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
161 IDsDriverPropertySet_Release(ps
);
167 return E_PROP_ID_UNSUPPORTED
;
170 static HRESULT WINAPI
IKsBufferPropertySetImpl_QuerySupport(
171 LPKSPROPERTYSET iface
,
174 PULONG pTypeSupport
)
176 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
177 PIDSDRIVERPROPERTYSET ps
;
178 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
180 if (This
->dsb
->hwbuf
) {
181 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
186 hres
= IDsDriverPropertySet_QuerySupport(ps
,guidPropSet
, dwPropID
,pTypeSupport
);
188 IDsDriverPropertySet_Release(ps
);
194 return E_PROP_ID_UNSUPPORTED
;
197 static IKsPropertySetVtbl iksbvt
= {
198 IKsBufferPropertySetImpl_QueryInterface
,
199 IKsBufferPropertySetImpl_AddRef
,
200 IKsBufferPropertySetImpl_Release
,
201 IKsBufferPropertySetImpl_Get
,
202 IKsBufferPropertySetImpl_Set
,
203 IKsBufferPropertySetImpl_QuerySupport
206 HRESULT WINAPI
IKsBufferPropertySetImpl_Create(
207 IDirectSoundBufferImpl
*dsb
,
208 IKsBufferPropertySetImpl
**piks
)
210 IKsBufferPropertySetImpl
*iks
;
211 TRACE("(%p,%p)\n",dsb
,piks
);
213 iks
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(*iks
));
215 WARN("out of memory\n");
217 return DSERR_OUTOFMEMORY
;
223 iks
->lpVtbl
= &iksbvt
;
225 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER
)dsb
);
231 HRESULT WINAPI
IKsBufferPropertySetImpl_Destroy(
232 IKsBufferPropertySetImpl
*piks
)
234 TRACE("(%p)\n",piks
);
236 while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET
)piks
) > 0);
241 /*******************************************************************************
242 * IKsPrivatePropertySet
245 /* IUnknown methods */
246 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
247 LPKSPROPERTYSET iface
,
251 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
252 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
255 return DSERR_INVALIDPARAM
;
258 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
260 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
261 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
262 return InterlockedIncrement(&(This
->ref
));
265 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
267 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
270 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
271 ulReturn
= InterlockedDecrement(&(This
->ref
));
273 HeapFree(GetProcessHeap(),0,This
);
274 TRACE("(%p) released\n",This
);
279 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingA(
285 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd
;
286 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
287 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
289 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
) pPropData
;
292 WARN("invalid parameter: pPropData\n");
293 return DSERR_INVALIDPARAM
;
296 FIXME("DeviceName=%s\n",ppd
->DeviceName
);
297 FIXME("DataFlow=%s\n",
298 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
299 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
301 /* FIXME: match the name to a wave device somehow. */
302 ppd
->DeviceId
= GUID_NULL
;
305 *pcbReturned
= cbPropData
;
306 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
312 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingW(
318 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd
;
319 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
320 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
322 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
) pPropData
;
325 WARN("invalid parameter: pPropData\n");
326 return DSERR_INVALIDPARAM
;
329 FIXME("DeviceName=%s\n",debugstr_w(ppd
->DeviceName
));
330 FIXME("DataFlow=%s\n",
331 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
332 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
334 /* FIXME: match the name to a wave device somehow. */
335 ppd
->DeviceId
= GUID_NULL
;
338 *pcbReturned
= cbPropData
;
339 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
345 static HRESULT WINAPI
DSPROPERTY_Description1(
353 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd
;
354 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
355 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
357 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
) pPropData
;
360 WARN("invalid parameter: pPropData\n");
361 return DSERR_INVALIDPARAM
;
364 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
365 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
366 /* default device of type specified by ppd->DataFlow */
367 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
368 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
369 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
370 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
372 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
374 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
375 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
376 return E_PROP_ID_UNSUPPORTED
;
379 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
380 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
382 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
383 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
386 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
387 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
388 wodn
= waveOutGetNumDevs();
389 for (wod
= 0; wod
< wodn
; wod
++) {
390 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
392 ppd
->WaveDeviceId
= wod
;
394 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
396 PIDSDRIVER drv
= NULL
;
397 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
398 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
399 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
400 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
401 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
402 if (err
== DS_OK
&& drv
)
403 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
406 WARN("waveOutMessage failed\n");
407 return E_PROP_ID_UNSUPPORTED
;
411 } else if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
412 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
415 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
416 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
417 widn
= waveInGetNumDevs();
418 for (wid
= 0; wid
< widn
; wid
++) {
419 if (IsEqualGUID( &dev_guid
, &guid
) ) {
421 ppd
->WaveDeviceId
= wid
;
423 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
426 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
427 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
428 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
429 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
430 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
431 if (err
== DS_OK
&& drv
)
432 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
435 WARN("waveInMessage failed\n");
436 return E_PROP_ID_UNSUPPORTED
;
444 /* given specific device so try the render devices first */
445 wodn
= waveOutGetNumDevs();
446 for (wod
= 0; wod
< wodn
; wod
++) {
447 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
449 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
450 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
451 ppd
->WaveDeviceId
= wod
;
453 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
455 PIDSDRIVER drv
= NULL
;
456 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
457 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
458 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
459 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
460 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
461 if (err
== DS_OK
&& drv
)
462 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
466 WARN("waveOutMessage failed\n");
467 return E_PROP_ID_UNSUPPORTED
;
472 if (found
== FALSE
) {
475 /* given specific device so try the capture devices next */
476 widn
= waveInGetNumDevs();
477 for (wid
= 0; wid
< widn
; wid
++) {
478 if (IsEqualGUID( &ppd
->DeviceId
, &capture_guids
[wid
] ) ) {
480 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
481 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
482 ppd
->WaveDeviceId
= wid
;
484 err
= mmErr(waveInMessage((HWAVEIN
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
486 PIDSDRIVER drv
= NULL
;
487 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
488 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
489 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
490 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
491 err
= mmErr(waveInMessage((HWAVEIN
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
492 if (err
== DS_OK
&& drv
)
493 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
497 WARN("waveInMessage failed\n");
498 return E_PROP_ID_UNSUPPORTED
;
503 if (found
== FALSE
) {
504 WARN("device not found\n");
505 return E_PROP_ID_UNSUPPORTED
;
511 *pcbReturned
= cbPropData
;
512 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
518 static HRESULT WINAPI
DSPROPERTY_DescriptionA(
524 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
) pPropData
;
527 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
528 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
530 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
531 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
532 /* default device of type specified by ppd->DataFlow */
533 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
534 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
535 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
536 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
538 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
540 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
541 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
542 return E_PROP_ID_UNSUPPORTED
;
545 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
546 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
548 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
549 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
552 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
553 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
554 wodn
= waveOutGetNumDevs();
555 for (wod
= 0; wod
< wodn
; wod
++) {
556 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
558 ppd
->WaveDeviceId
= wod
;
559 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
561 PIDSDRIVER drv
= NULL
;
562 /* FIXME: this is a memory leak */
563 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
564 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
565 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
567 strcpy(szDescription
, desc
.szDesc
);
568 strcpy(szModule
, desc
.szDrvName
);
569 strcpy(szInterface
, "Interface");
571 ppd
->Description
= szDescription
;
572 ppd
->Module
= szModule
;
573 ppd
->Interface
= szInterface
;
574 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
575 if (err
== DS_OK
&& drv
)
576 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
579 WARN("waveOutMessage failed\n");
580 return E_PROP_ID_UNSUPPORTED
;
584 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
585 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
588 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
589 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
590 widn
= waveInGetNumDevs();
591 for (wid
= 0; wid
< widn
; wid
++) {
592 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
594 ppd
->WaveDeviceId
= wid
;
595 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
598 /* FIXME: this is a memory leak */
599 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
600 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
601 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
603 strcpy(szDescription
, desc
.szDesc
);
604 strcpy(szModule
, desc
.szDrvName
);
605 strcpy(szInterface
, "Interface");
607 ppd
->Description
= szDescription
;
608 ppd
->Module
= szModule
;
609 ppd
->Interface
= szInterface
;
610 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
611 if (err
== DS_OK
&& drv
)
612 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
615 WARN("waveInMessage failed\n");
616 return E_PROP_ID_UNSUPPORTED
;
625 /* given specific device so try the render devices first */
626 wodn
= waveOutGetNumDevs();
627 for (wod
= 0; wod
< wodn
; wod
++) {
628 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
630 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
631 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
632 ppd
->WaveDeviceId
= wod
;
633 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
635 PIDSDRIVER drv
= NULL
;
636 /* FIXME: this is a memory leak */
637 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
638 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
639 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
641 strcpy(szDescription
, desc
.szDesc
);
642 strcpy(szModule
, desc
.szDrvName
);
643 strcpy(szInterface
, "Interface");
645 ppd
->Description
= szDescription
;
646 ppd
->Module
= szModule
;
647 ppd
->Interface
= szInterface
;
648 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
649 if (err
== DS_OK
&& drv
)
650 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
654 WARN("waveOutMessage failed\n");
655 return E_PROP_ID_UNSUPPORTED
;
660 if (found
== FALSE
) {
661 WARN("device not found\n");
662 return E_PROP_ID_UNSUPPORTED
;
667 *pcbReturned
= cbPropData
;
668 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
674 static HRESULT WINAPI
DSPROPERTY_DescriptionW(
680 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
) pPropData
;
683 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
684 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
686 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
687 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
688 /* default device of type specified by ppd->DataFlow */
689 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
690 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
691 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
692 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
694 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
696 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
697 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
698 return E_PROP_ID_UNSUPPORTED
;
701 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
702 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
704 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
705 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
708 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
709 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
710 wodn
= waveOutGetNumDevs();
711 for (wod
= 0; wod
< wodn
; wod
++) {
712 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
714 ppd
->WaveDeviceId
= wod
;
715 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
717 PIDSDRIVER drv
= NULL
;
718 /* FIXME: this is a memory leak */
719 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
720 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
721 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
723 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
724 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
725 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
727 ppd
->Description
= wDescription
;
728 ppd
->Module
= wModule
;
729 ppd
->Interface
= wInterface
;
730 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
731 if (err
== DS_OK
&& drv
)
732 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
735 WARN("waveOutMessage failed\n");
736 return E_PROP_ID_UNSUPPORTED
;
740 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
741 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
744 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
745 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
746 widn
= waveInGetNumDevs();
747 for (wid
= 0; wid
< widn
; wid
++) {
748 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
750 ppd
->WaveDeviceId
= wid
;
751 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
754 /* FIXME: this is a memory leak */
755 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
756 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
757 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
759 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
760 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
761 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
763 ppd
->Description
= wDescription
;
764 ppd
->Module
= wModule
;
765 ppd
->Interface
= wInterface
;
766 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
767 if (err
== DS_OK
&& drv
)
768 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
771 WARN("waveInMessage failed\n");
772 return E_PROP_ID_UNSUPPORTED
;
781 /* given specific device so try the render devices first */
782 wodn
= waveOutGetNumDevs();
783 for (wod
= 0; wod
< wodn
; wod
++) {
784 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
786 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
787 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
788 ppd
->WaveDeviceId
= wod
;
789 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
791 PIDSDRIVER drv
= NULL
;
792 /* FIXME: this is a memory leak */
793 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
794 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
795 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
797 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
798 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
799 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
801 ppd
->Description
= wDescription
;
802 ppd
->Module
= wModule
;
803 ppd
->Interface
= wInterface
;
804 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
805 if (err
== DS_OK
&& drv
)
806 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
810 WARN("waveOutMessage failed\n");
811 return E_PROP_ID_UNSUPPORTED
;
816 if (found
== FALSE
) {
817 WARN("device not found\n");
818 return E_PROP_ID_UNSUPPORTED
;
823 *pcbReturned
= cbPropData
;
824 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
830 static HRESULT WINAPI
DSPROPERTY_Enumerate1(
836 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
837 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
838 return E_PROP_ID_UNSUPPORTED
;
841 static HRESULT WINAPI
DSPROPERTY_EnumerateA(
847 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
) pPropData
;
849 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
850 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
852 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
855 unsigned devs
, wod
, wid
;
857 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data
;
859 devs
= waveOutGetNumDevs();
860 for (wod
= 0; wod
< devs
; ++wod
) {
861 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
863 memset(&data
, 0, sizeof(data
));
864 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
865 data
.WaveDeviceId
= wod
;
866 data
.DeviceId
= renderer_guids
[wod
];
867 data
.Description
= desc
.szDesc
;
868 data
.Module
= desc
.szDrvName
;
869 data
.Interface
= "Interface";
870 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
871 (ppd
->Callback
)(&data
, ppd
->Context
);
875 devs
= waveInGetNumDevs();
876 for (wid
= 0; wid
< devs
; ++wid
) {
877 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
879 memset(&data
, 0, sizeof(data
));
880 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
881 data
.WaveDeviceId
= wid
;
882 data
.DeviceId
= capture_guids
[wid
];
883 data
.Description
= desc
.szDesc
;
884 data
.Module
= desc
.szDrvName
;
885 data
.Interface
= "Interface";
886 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
887 (ppd
->Callback
)(&data
, ppd
->Context
);
895 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
900 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
903 return E_PROP_ID_UNSUPPORTED
;
906 static HRESULT WINAPI
DSPROPERTY_EnumerateW(
912 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
) pPropData
;
914 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
915 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
917 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
920 unsigned devs
, wod
, wid
;
922 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
924 devs
= waveOutGetNumDevs();
925 for (wod
= 0; wod
< devs
; ++wod
) {
926 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
928 /* FIXME: this is a memory leak */
929 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
930 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
931 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
933 memset(&data
, 0, sizeof(data
));
934 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
935 data
.WaveDeviceId
= wod
;
936 data
.DeviceId
= renderer_guids
[wod
];
938 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
939 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
940 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
942 data
.Description
= wDescription
;
943 data
.Module
= wModule
;
944 data
.Interface
= wInterface
;
945 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
946 (ppd
->Callback
)(&data
, ppd
->Context
);
950 devs
= waveInGetNumDevs();
951 for (wid
= 0; wid
< devs
; ++wid
) {
952 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
954 /* FIXME: this is a memory leak */
955 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
956 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
957 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
959 memset(&data
, 0, sizeof(data
));
960 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
961 data
.WaveDeviceId
= wid
;
962 data
.DeviceId
= capture_guids
[wid
];
964 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
965 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
966 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
968 data
.Description
= wDescription
;
969 data
.Module
= wModule
;
970 data
.Interface
= wInterface
;
971 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
972 (ppd
->Callback
)(&data
, ppd
->Context
);
980 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
985 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
988 return E_PROP_ID_UNSUPPORTED
;
991 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
992 LPKSPROPERTYSET iface
,
995 LPVOID pInstanceData
,
996 ULONG cbInstanceData
,
1001 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1002 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
1003 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
1005 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1007 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1008 return DSPROPERTY_WaveDeviceMappingA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1009 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1010 return DSPROPERTY_Description1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1011 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1012 return DSPROPERTY_Enumerate1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1013 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1014 return DSPROPERTY_WaveDeviceMappingW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1015 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1016 return DSPROPERTY_DescriptionA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1017 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1018 return DSPROPERTY_DescriptionW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1019 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1020 return DSPROPERTY_EnumerateA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1021 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1022 return DSPROPERTY_EnumerateW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1024 FIXME("unsupported ID: %ld\n",dwPropID
);
1028 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1033 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
1036 return E_PROP_ID_UNSUPPORTED
;
1039 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
1040 LPKSPROPERTYSET iface
,
1041 REFGUID guidPropSet
,
1043 LPVOID pInstanceData
,
1044 ULONG cbInstanceData
,
1048 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1050 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
1051 return E_PROP_ID_UNSUPPORTED
;
1054 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
1055 LPKSPROPERTYSET iface
,
1056 REFGUID guidPropSet
,
1058 PULONG pTypeSupport
)
1060 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1061 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
1063 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1065 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1066 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1068 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1069 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1071 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1072 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1074 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1075 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1077 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1078 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1080 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1081 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1083 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1084 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1086 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1087 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1090 FIXME("unsupported ID: %ld\n",dwPropID
);
1094 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1097 return E_PROP_ID_UNSUPPORTED
;
1100 static IKsPropertySetVtbl ikspvt
= {
1101 IKsPrivatePropertySetImpl_QueryInterface
,
1102 IKsPrivatePropertySetImpl_AddRef
,
1103 IKsPrivatePropertySetImpl_Release
,
1104 IKsPrivatePropertySetImpl_Get
,
1105 IKsPrivatePropertySetImpl_Set
,
1106 IKsPrivatePropertySetImpl_QuerySupport
1109 HRESULT WINAPI
IKsPrivatePropertySetImpl_Create(
1110 IKsPrivatePropertySetImpl
**piks
)
1112 IKsPrivatePropertySetImpl
*iks
;
1114 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
1116 iks
->lpVtbl
= &ikspvt
;