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 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
118 prop
.s
.Set
= *guidPropSet
;
119 prop
.s
.Id
= dwPropID
;
120 prop
.s
.Flags
= 0; /* unused */
121 prop
.s
.InstanceId
= (ULONG
)This
->dsb
->dsound
;
123 hres
= IDsDriverPropertySet_Get(ps
, &prop
, pInstanceData
, cbInstanceData
, pPropData
, cbPropData
, pcbReturned
);
125 IDsDriverPropertySet_Release(ps
);
130 return E_PROP_ID_UNSUPPORTED
;
133 static HRESULT WINAPI
IKsBufferPropertySetImpl_Set(
134 LPKSPROPERTYSET iface
,
137 LPVOID pInstanceData
,
138 ULONG cbInstanceData
,
142 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
143 PIDSDRIVERPROPERTYSET ps
;
144 TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
146 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
152 prop
.s
.Set
= *guidPropSet
;
153 prop
.s
.Id
= dwPropID
;
154 prop
.s
.Flags
= 0; /* unused */
155 prop
.s
.InstanceId
= (ULONG
)This
->dsb
->dsound
;
156 hres
= IDsDriverPropertySet_Set(ps
,&prop
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
158 IDsDriverPropertySet_Release(ps
);
163 return E_PROP_ID_UNSUPPORTED
;
166 static HRESULT WINAPI
IKsBufferPropertySetImpl_QuerySupport(
167 LPKSPROPERTYSET iface
,
170 PULONG pTypeSupport
)
172 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
173 PIDSDRIVERPROPERTYSET ps
;
174 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
176 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
181 hres
= IDsDriverPropertySet_QuerySupport(ps
,guidPropSet
, dwPropID
,pTypeSupport
);
183 IDsDriverPropertySet_Release(ps
);
188 return E_PROP_ID_UNSUPPORTED
;
191 static IKsPropertySetVtbl iksbvt
= {
192 IKsBufferPropertySetImpl_QueryInterface
,
193 IKsBufferPropertySetImpl_AddRef
,
194 IKsBufferPropertySetImpl_Release
,
195 IKsBufferPropertySetImpl_Get
,
196 IKsBufferPropertySetImpl_Set
,
197 IKsBufferPropertySetImpl_QuerySupport
200 HRESULT WINAPI
IKsBufferPropertySetImpl_Create(
201 IDirectSoundBufferImpl
*dsb
,
202 IKsBufferPropertySetImpl
**piks
)
204 IKsBufferPropertySetImpl
*iks
;
205 TRACE("(%p,%p)\n",dsb
,piks
);
207 iks
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(*iks
));
211 iks
->lpVtbl
= &iksbvt
;
213 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER
)dsb
);
219 HRESULT WINAPI
IKsBufferPropertySetImpl_Destroy(
220 IKsBufferPropertySetImpl
*piks
)
222 TRACE("(%p)\n",piks
);
224 while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET
)piks
) > 0);
229 /*******************************************************************************
230 * IKsPrivatePropertySet
233 /* IUnknown methods */
234 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
235 LPKSPROPERTYSET iface
,
239 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
240 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
243 return DSERR_INVALIDPARAM
;
246 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
248 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
250 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
251 return InterlockedIncrement(&(This
->ref
));
254 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
256 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
259 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
260 ulReturn
= InterlockedDecrement(&(This
->ref
));
262 HeapFree(GetProcessHeap(),0,This
);
263 TRACE("(%p) released\n",This
);
268 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingA(
274 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd
;
275 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
276 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
278 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
) pPropData
;
281 WARN("invalid parameter: pPropData\n");
282 return DSERR_INVALIDPARAM
;
285 FIXME("DeviceName=%s\n",ppd
->DeviceName
);
286 FIXME("DataFlow=%s\n",
287 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
288 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
290 /* FIXME: match the name to a wave device somehow. */
291 ppd
->DeviceId
= GUID_NULL
;
294 *pcbReturned
= cbPropData
;
295 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
301 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingW(
307 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd
;
308 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
309 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
311 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
) pPropData
;
314 WARN("invalid parameter: pPropData\n");
315 return DSERR_INVALIDPARAM
;
318 FIXME("DeviceName=%s\n",debugstr_w(ppd
->DeviceName
));
319 FIXME("DataFlow=%s\n",
320 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
321 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
323 /* FIXME: match the name to a wave device somehow. */
324 ppd
->DeviceId
= GUID_NULL
;
327 *pcbReturned
= cbPropData
;
328 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
334 static HRESULT WINAPI
DSPROPERTY_Description1(
342 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd
;
343 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
344 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
346 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
) pPropData
;
349 WARN("invalid parameter: pPropData\n");
350 return DSERR_INVALIDPARAM
;
353 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
354 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
355 /* default device of type specified by ppd->DataFlow */
356 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
357 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
358 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
359 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
361 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
363 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
364 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
365 return E_PROP_ID_UNSUPPORTED
;
368 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
369 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
371 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
372 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
375 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
376 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
377 wodn
= waveOutGetNumDevs();
378 for (wod
= 0; wod
< wodn
; wod
++) {
379 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
381 ppd
->WaveDeviceId
= wod
;
383 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
385 PIDSDRIVER drv
= NULL
;
386 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
387 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
388 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
389 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
390 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
391 if (err
== DS_OK
&& drv
)
392 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
395 WARN("waveOutMessage failed\n");
396 return E_PROP_ID_UNSUPPORTED
;
400 } else if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
401 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
404 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
405 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
406 widn
= waveInGetNumDevs();
407 for (wid
= 0; wid
< widn
; wid
++) {
408 if (IsEqualGUID( &dev_guid
, &guid
) ) {
410 ppd
->WaveDeviceId
= wid
;
412 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
415 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
416 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
417 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
418 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
419 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
420 if (err
== DS_OK
&& drv
)
421 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
424 WARN("waveInMessage failed\n");
425 return E_PROP_ID_UNSUPPORTED
;
433 /* given specific device so try the render devices first */
434 wodn
= waveOutGetNumDevs();
435 for (wod
= 0; wod
< wodn
; wod
++) {
436 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
438 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
439 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
440 ppd
->WaveDeviceId
= wod
;
442 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
444 PIDSDRIVER drv
= NULL
;
445 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
446 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
447 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
448 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
449 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
450 if (err
== DS_OK
&& drv
)
451 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
455 WARN("waveOutMessage failed\n");
456 return E_PROP_ID_UNSUPPORTED
;
461 if (found
== FALSE
) {
464 /* given specific device so try the capture devices next */
465 widn
= waveInGetNumDevs();
466 for (wid
= 0; wid
< widn
; wid
++) {
467 if (IsEqualGUID( &ppd
->DeviceId
, &capture_guids
[wid
] ) ) {
469 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
470 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
471 ppd
->WaveDeviceId
= wid
;
473 err
= mmErr(waveInMessage((HWAVEIN
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
475 PIDSDRIVER drv
= NULL
;
476 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
477 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
478 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
479 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
480 err
= mmErr(waveInMessage((HWAVEIN
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
481 if (err
== DS_OK
&& drv
)
482 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
486 WARN("waveInMessage failed\n");
487 return E_PROP_ID_UNSUPPORTED
;
492 if (found
== FALSE
) {
493 WARN("device not found\n");
494 return E_PROP_ID_UNSUPPORTED
;
500 *pcbReturned
= cbPropData
;
501 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
507 static HRESULT WINAPI
DSPROPERTY_DescriptionA(
513 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
) pPropData
;
516 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
517 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
519 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
520 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
521 /* default device of type specified by ppd->DataFlow */
522 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
523 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
524 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
525 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
527 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
529 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
530 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
531 return E_PROP_ID_UNSUPPORTED
;
534 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
535 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
537 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
538 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
541 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
542 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
543 wodn
= waveOutGetNumDevs();
544 for (wod
= 0; wod
< wodn
; wod
++) {
545 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
547 ppd
->WaveDeviceId
= wod
;
548 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
550 PIDSDRIVER drv
= NULL
;
551 /* FIXME: this is a memory leak */
552 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
553 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
554 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
556 strcpy(szDescription
, desc
.szDesc
);
557 strcpy(szModule
, desc
.szDrvName
);
558 strcpy(szInterface
, "Interface");
560 ppd
->Description
= szDescription
;
561 ppd
->Module
= szModule
;
562 ppd
->Interface
= szInterface
;
563 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
564 if (err
== DS_OK
&& drv
)
565 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
568 WARN("waveOutMessage failed\n");
569 return E_PROP_ID_UNSUPPORTED
;
573 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
574 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
577 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
578 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
579 widn
= waveInGetNumDevs();
580 for (wid
= 0; wid
< widn
; wid
++) {
581 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
583 ppd
->WaveDeviceId
= wid
;
584 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
587 /* FIXME: this is a memory leak */
588 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
589 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
590 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
592 strcpy(szDescription
, desc
.szDesc
);
593 strcpy(szModule
, desc
.szDrvName
);
594 strcpy(szInterface
, "Interface");
596 ppd
->Description
= szDescription
;
597 ppd
->Module
= szModule
;
598 ppd
->Interface
= szInterface
;
599 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
600 if (err
== DS_OK
&& drv
)
601 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
604 WARN("waveInMessage failed\n");
605 return E_PROP_ID_UNSUPPORTED
;
614 /* given specific device so try the render devices first */
615 wodn
= waveOutGetNumDevs();
616 for (wod
= 0; wod
< wodn
; wod
++) {
617 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
619 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
620 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
621 ppd
->WaveDeviceId
= wod
;
622 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
624 PIDSDRIVER drv
= NULL
;
625 /* FIXME: this is a memory leak */
626 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
627 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
628 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
630 strcpy(szDescription
, desc
.szDesc
);
631 strcpy(szModule
, desc
.szDrvName
);
632 strcpy(szInterface
, "Interface");
634 ppd
->Description
= szDescription
;
635 ppd
->Module
= szModule
;
636 ppd
->Interface
= szInterface
;
637 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
638 if (err
== DS_OK
&& drv
)
639 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
643 WARN("waveOutMessage failed\n");
644 return E_PROP_ID_UNSUPPORTED
;
649 if (found
== FALSE
) {
650 WARN("device not found\n");
651 return E_PROP_ID_UNSUPPORTED
;
656 *pcbReturned
= cbPropData
;
657 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
663 static HRESULT WINAPI
DSPROPERTY_DescriptionW(
669 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
) pPropData
;
672 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
673 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
675 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
676 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
677 /* default device of type specified by ppd->DataFlow */
678 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
679 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
680 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
681 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
683 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
685 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
686 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
687 return E_PROP_ID_UNSUPPORTED
;
690 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
691 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
693 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
694 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
697 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
698 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
699 wodn
= waveOutGetNumDevs();
700 for (wod
= 0; wod
< wodn
; wod
++) {
701 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
703 ppd
->WaveDeviceId
= wod
;
704 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
706 PIDSDRIVER drv
= NULL
;
707 /* FIXME: this is a memory leak */
708 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
709 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
710 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
712 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
713 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
714 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
716 ppd
->Description
= wDescription
;
717 ppd
->Module
= wModule
;
718 ppd
->Interface
= wInterface
;
719 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
720 if (err
== DS_OK
&& drv
)
721 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
724 WARN("waveOutMessage failed\n");
725 return E_PROP_ID_UNSUPPORTED
;
729 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
730 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
733 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
734 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
735 widn
= waveInGetNumDevs();
736 for (wid
= 0; wid
< widn
; wid
++) {
737 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
739 ppd
->WaveDeviceId
= wid
;
740 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
743 /* FIXME: this is a memory leak */
744 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
745 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
746 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
748 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
749 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
750 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
752 ppd
->Description
= wDescription
;
753 ppd
->Module
= wModule
;
754 ppd
->Interface
= wInterface
;
755 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
756 if (err
== DS_OK
&& drv
)
757 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
760 WARN("waveInMessage failed\n");
761 return E_PROP_ID_UNSUPPORTED
;
770 /* given specific device so try the render devices first */
771 wodn
= waveOutGetNumDevs();
772 for (wod
= 0; wod
< wodn
; wod
++) {
773 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
775 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
776 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
777 ppd
->WaveDeviceId
= wod
;
778 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
780 PIDSDRIVER drv
= NULL
;
781 /* FIXME: this is a memory leak */
782 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
783 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
784 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
786 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
787 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
788 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
790 ppd
->Description
= wDescription
;
791 ppd
->Module
= wModule
;
792 ppd
->Interface
= wInterface
;
793 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
794 if (err
== DS_OK
&& drv
)
795 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
799 WARN("waveOutMessage failed\n");
800 return E_PROP_ID_UNSUPPORTED
;
805 if (found
== FALSE
) {
806 WARN("device not found\n");
807 return E_PROP_ID_UNSUPPORTED
;
812 *pcbReturned
= cbPropData
;
813 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
819 static HRESULT WINAPI
DSPROPERTY_Enumerate1(
825 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
826 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
827 return E_PROP_ID_UNSUPPORTED
;
830 static HRESULT WINAPI
DSPROPERTY_EnumerateA(
836 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
) pPropData
;
838 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
839 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
841 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
844 unsigned devs
, wod
, wid
;
846 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data
;
848 devs
= waveOutGetNumDevs();
849 for (wod
= 0; wod
< devs
; ++wod
) {
850 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
852 memset(&data
, 0, sizeof(data
));
853 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
854 data
.WaveDeviceId
= wod
;
855 data
.DeviceId
= renderer_guids
[wod
];
856 data
.Description
= desc
.szDesc
;
857 data
.Module
= desc
.szDrvName
;
858 data
.Interface
= "Interface";
859 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
860 (ppd
->Callback
)(&data
, ppd
->Context
);
864 devs
= waveInGetNumDevs();
865 for (wid
= 0; wid
< devs
; ++wid
) {
866 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
868 memset(&data
, 0, sizeof(data
));
869 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
870 data
.WaveDeviceId
= wid
;
871 data
.DeviceId
= capture_guids
[wid
];
872 data
.Description
= desc
.szDesc
;
873 data
.Module
= desc
.szDrvName
;
874 data
.Interface
= "Interface";
875 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
876 (ppd
->Callback
)(&data
, ppd
->Context
);
884 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
889 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
892 return E_PROP_ID_UNSUPPORTED
;
895 static HRESULT WINAPI
DSPROPERTY_EnumerateW(
901 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
) pPropData
;
903 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
904 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
906 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
909 unsigned devs
, wod
, wid
;
911 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
913 devs
= waveOutGetNumDevs();
914 for (wod
= 0; wod
< devs
; ++wod
) {
915 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
917 /* FIXME: this is a memory leak */
918 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
919 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
920 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
922 memset(&data
, 0, sizeof(data
));
923 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
924 data
.WaveDeviceId
= wod
;
925 data
.DeviceId
= renderer_guids
[wod
];
927 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
928 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
929 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
931 data
.Description
= wDescription
;
932 data
.Module
= wModule
;
933 data
.Interface
= wInterface
;
934 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
935 (ppd
->Callback
)(&data
, ppd
->Context
);
939 devs
= waveInGetNumDevs();
940 for (wid
= 0; wid
< devs
; ++wid
) {
941 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
943 /* FIXME: this is a memory leak */
944 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
945 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
946 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
948 memset(&data
, 0, sizeof(data
));
949 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
950 data
.WaveDeviceId
= wid
;
951 data
.DeviceId
= capture_guids
[wid
];
953 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
954 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
955 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
957 data
.Description
= wDescription
;
958 data
.Module
= wModule
;
959 data
.Interface
= wInterface
;
960 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
961 (ppd
->Callback
)(&data
, ppd
->Context
);
969 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
974 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
977 return E_PROP_ID_UNSUPPORTED
;
980 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
981 LPKSPROPERTYSET iface
,
984 LPVOID pInstanceData
,
985 ULONG cbInstanceData
,
990 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
991 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
992 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
994 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
996 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
997 return DSPROPERTY_WaveDeviceMappingA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
998 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
999 return DSPROPERTY_Description1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1000 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1001 return DSPROPERTY_Enumerate1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1002 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1003 return DSPROPERTY_WaveDeviceMappingW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1004 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1005 return DSPROPERTY_DescriptionA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1006 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1007 return DSPROPERTY_DescriptionW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1008 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1009 return DSPROPERTY_EnumerateA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1010 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1011 return DSPROPERTY_EnumerateW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1013 FIXME("unsupported ID: %ld\n",dwPropID
);
1017 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1022 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
1025 return E_PROP_ID_UNSUPPORTED
;
1028 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
1029 LPKSPROPERTYSET iface
,
1030 REFGUID guidPropSet
,
1032 LPVOID pInstanceData
,
1033 ULONG cbInstanceData
,
1037 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1039 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
1040 return E_PROP_ID_UNSUPPORTED
;
1043 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
1044 LPKSPROPERTYSET iface
,
1045 REFGUID guidPropSet
,
1047 PULONG pTypeSupport
)
1049 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1050 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
1052 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1054 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1055 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1057 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1058 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1060 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1061 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1063 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1064 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1066 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1067 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1069 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1070 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1072 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1073 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1075 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1076 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1079 FIXME("unsupported ID: %ld\n",dwPropID
);
1083 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1086 return E_PROP_ID_UNSUPPORTED
;
1089 static IKsPropertySetVtbl ikspvt
= {
1090 IKsPrivatePropertySetImpl_QueryInterface
,
1091 IKsPrivatePropertySetImpl_AddRef
,
1092 IKsPrivatePropertySetImpl_Release
,
1093 IKsPrivatePropertySetImpl_Get
,
1094 IKsPrivatePropertySetImpl_Set
,
1095 IKsPrivatePropertySetImpl_QuerySupport
1098 HRESULT WINAPI
IKsPrivatePropertySetImpl_Create(
1099 IKsPrivatePropertySetImpl
**piks
)
1101 IKsPrivatePropertySetImpl
*iks
;
1103 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
1105 iks
->lpVtbl
= &ikspvt
;