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 ICOM_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 ICOM_THIS(IKsBufferPropertySetImpl
,iface
);
79 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
80 ulReturn
= InterlockedIncrement(&(This
->ref
));
84 static ULONG WINAPI
IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface
)
86 ICOM_THIS(IKsBufferPropertySetImpl
,iface
);
89 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
90 ulReturn
= InterlockedDecrement(&This
->ref
);
93 IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER
)This
->dsb
);
94 HeapFree(GetProcessHeap(),0,This
);
95 TRACE("(%p) released\n",This
);
100 static HRESULT WINAPI
IKsBufferPropertySetImpl_Get(
101 LPKSPROPERTYSET iface
,
104 LPVOID pInstanceData
,
105 ULONG cbInstanceData
,
110 ICOM_THIS(IKsBufferPropertySetImpl
,iface
);
111 PIDSDRIVERPROPERTYSET ps
;
112 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
113 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
115 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
121 prop
.s
.Set
= *guidPropSet
;
122 prop
.s
.Id
= dwPropID
;
123 prop
.s
.Flags
= 0; /* unused */
124 prop
.s
.InstanceId
= (ULONG
)This
->dsb
->dsound
;
126 hres
= IDsDriverPropertySet_Get(ps
, &prop
, pInstanceData
, cbInstanceData
, pPropData
, cbPropData
, pcbReturned
);
128 IDsDriverPropertySet_Release(ps
);
133 return E_PROP_ID_UNSUPPORTED
;
136 static HRESULT WINAPI
IKsBufferPropertySetImpl_Set(
137 LPKSPROPERTYSET iface
,
140 LPVOID pInstanceData
,
141 ULONG cbInstanceData
,
145 ICOM_THIS(IKsBufferPropertySetImpl
,iface
);
146 PIDSDRIVERPROPERTYSET ps
;
147 TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
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
);
166 return E_PROP_ID_UNSUPPORTED
;
169 static HRESULT WINAPI
IKsBufferPropertySetImpl_QuerySupport(
170 LPKSPROPERTYSET iface
,
173 PULONG pTypeSupport
)
175 ICOM_THIS(IKsBufferPropertySetImpl
,iface
);
176 PIDSDRIVERPROPERTYSET ps
;
177 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
179 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
184 hres
= IDsDriverPropertySet_QuerySupport(ps
,guidPropSet
, dwPropID
,pTypeSupport
);
186 IDsDriverPropertySet_Release(ps
);
191 return E_PROP_ID_UNSUPPORTED
;
194 static IKsPropertySetVtbl iksbvt
= {
195 IKsBufferPropertySetImpl_QueryInterface
,
196 IKsBufferPropertySetImpl_AddRef
,
197 IKsBufferPropertySetImpl_Release
,
198 IKsBufferPropertySetImpl_Get
,
199 IKsBufferPropertySetImpl_Set
,
200 IKsBufferPropertySetImpl_QuerySupport
203 HRESULT WINAPI
IKsBufferPropertySetImpl_Create(
204 IDirectSoundBufferImpl
*dsb
,
205 IKsBufferPropertySetImpl
**piks
)
207 IKsBufferPropertySetImpl
*iks
;
208 TRACE("(%p,%p)\n",dsb
,piks
);
210 iks
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(*iks
));
214 iks
->lpVtbl
= &iksbvt
;
216 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER
)dsb
);
222 HRESULT WINAPI
IKsBufferPropertySetImpl_Destroy(
223 IKsBufferPropertySetImpl
*piks
)
225 TRACE("(%p)\n",piks
);
227 while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET
)piks
) > 0);
232 /*******************************************************************************
233 * IKsPrivatePropertySet
236 /* IUnknown methods */
237 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
238 LPKSPROPERTYSET iface
,
242 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
243 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
246 return DSERR_INVALIDPARAM
;
249 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
251 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
254 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
255 ulReturn
= InterlockedIncrement(&This
->ref
);
259 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
261 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
264 TRACE("(%p) ref was %ld\n", This
, This
->ref
);
265 ulReturn
= InterlockedDecrement(&This
->ref
);
269 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingA(
275 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd
;
276 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
277 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
279 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA
) pPropData
;
282 WARN("invalid parameter: pPropData\n");
283 return DSERR_INVALIDPARAM
;
286 FIXME("DeviceName=%s\n",ppd
->DeviceName
);
287 FIXME("DataFlow=%s\n",
288 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
289 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
291 /* FIXME: match the name to a wave device somehow. */
292 ppd
->DeviceId
= GUID_NULL
;
295 *pcbReturned
= cbPropData
;
296 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
302 static HRESULT WINAPI
DSPROPERTY_WaveDeviceMappingW(
308 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd
;
309 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
310 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
312 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA
) pPropData
;
315 WARN("invalid parameter: pPropData\n");
316 return DSERR_INVALIDPARAM
;
319 FIXME("DeviceName=%s\n",debugstr_w(ppd
->DeviceName
));
320 FIXME("DataFlow=%s\n",
321 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
322 ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
324 /* FIXME: match the name to a wave device somehow. */
325 ppd
->DeviceId
= GUID_NULL
;
328 *pcbReturned
= cbPropData
;
329 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
335 static HRESULT WINAPI
DSPROPERTY_Description1(
343 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd
;
344 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
345 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
347 ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA
) pPropData
;
350 WARN("invalid parameter: pPropData\n");
351 return DSERR_INVALIDPARAM
;
354 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
355 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
356 /* default device of type specified by ppd->DataFlow */
357 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
358 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
359 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
360 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
362 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
364 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
365 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
366 return E_PROP_ID_UNSUPPORTED
;
369 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
370 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
372 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
373 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
376 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
377 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
378 wodn
= waveOutGetNumDevs();
379 for (wod
= 0; wod
< wodn
; wod
++) {
380 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
382 ppd
->WaveDeviceId
= wod
;
384 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
386 PIDSDRIVER drv
= NULL
;
387 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
388 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
389 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
390 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
391 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
392 if (err
== DS_OK
&& drv
)
393 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
396 WARN("waveOutMessage failed\n");
397 return E_PROP_ID_UNSUPPORTED
;
401 } else if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
402 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
405 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
406 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
407 widn
= waveInGetNumDevs();
408 for (wid
= 0; wid
< widn
; wid
++) {
409 if (IsEqualGUID( &dev_guid
, &guid
) ) {
411 ppd
->WaveDeviceId
= wid
;
413 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
416 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
417 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
418 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
419 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
420 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
421 if (err
== DS_OK
&& drv
)
422 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
425 WARN("waveInMessage failed\n");
426 return E_PROP_ID_UNSUPPORTED
;
434 /* given specific device so try the render devices first */
435 wodn
= waveOutGetNumDevs();
436 for (wod
= 0; wod
< wodn
; wod
++) {
437 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
439 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
440 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
441 ppd
->WaveDeviceId
= wod
;
443 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
445 PIDSDRIVER drv
= NULL
;
446 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
447 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
448 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
449 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
450 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
451 if (err
== DS_OK
&& drv
)
452 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
456 WARN("waveOutMessage failed\n");
457 return E_PROP_ID_UNSUPPORTED
;
462 if (found
== FALSE
) {
465 /* given specific device so try the capture devices next */
466 widn
= waveInGetNumDevs();
467 for (wid
= 0; wid
< widn
; wid
++) {
468 if (IsEqualGUID( &ppd
->DeviceId
, &capture_guids
[wid
] ) ) {
470 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
471 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
472 ppd
->WaveDeviceId
= wid
;
474 err
= mmErr(waveInMessage((HWAVEIN
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
476 PIDSDRIVER drv
= NULL
;
477 strncpy(ppd
->DescriptionA
, desc
.szDesc
, sizeof(ppd
->DescriptionA
) - 1);
478 strncpy(ppd
->ModuleA
, desc
.szDrvName
, sizeof(ppd
->ModuleA
) - 1);
479 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, ppd
->DescriptionW
, sizeof(ppd
->DescriptionW
)/sizeof(WCHAR
) );
480 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, ppd
->ModuleW
, sizeof(ppd
->ModuleW
)/sizeof(WCHAR
) );
481 err
= mmErr(waveInMessage((HWAVEIN
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
482 if (err
== DS_OK
&& drv
)
483 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
487 WARN("waveInMessage failed\n");
488 return E_PROP_ID_UNSUPPORTED
;
493 if (found
== FALSE
) {
494 WARN("device not found\n");
495 return E_PROP_ID_UNSUPPORTED
;
501 *pcbReturned
= cbPropData
;
502 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
508 static HRESULT WINAPI
DSPROPERTY_DescriptionA(
514 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA
) pPropData
;
517 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
518 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
520 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
521 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
522 /* default device of type specified by ppd->DataFlow */
523 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
524 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
525 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
526 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
528 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
530 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
531 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
532 return E_PROP_ID_UNSUPPORTED
;
535 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
536 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
538 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
539 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
542 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
543 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
544 wodn
= waveOutGetNumDevs();
545 for (wod
= 0; wod
< wodn
; wod
++) {
546 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
548 ppd
->WaveDeviceId
= wod
;
549 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
551 PIDSDRIVER drv
= NULL
;
552 /* FIXME: this is a memory leak */
553 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
554 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
555 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
557 strcpy(szDescription
, desc
.szDesc
);
558 strcpy(szModule
, desc
.szDrvName
);
559 strcpy(szInterface
, "Interface");
561 ppd
->Description
= szDescription
;
562 ppd
->Module
= szModule
;
563 ppd
->Interface
= szInterface
;
564 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
565 if (err
== DS_OK
&& drv
)
566 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
569 WARN("waveOutMessage failed\n");
570 return E_PROP_ID_UNSUPPORTED
;
574 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
575 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
578 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
579 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
580 widn
= waveInGetNumDevs();
581 for (wid
= 0; wid
< widn
; wid
++) {
582 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
584 ppd
->WaveDeviceId
= wid
;
585 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
588 /* FIXME: this is a memory leak */
589 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
590 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
591 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
593 strcpy(szDescription
, desc
.szDesc
);
594 strcpy(szModule
, desc
.szDrvName
);
595 strcpy(szInterface
, "Interface");
597 ppd
->Description
= szDescription
;
598 ppd
->Module
= szModule
;
599 ppd
->Interface
= szInterface
;
600 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
601 if (err
== DS_OK
&& drv
)
602 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
605 WARN("waveInMessage failed\n");
606 return E_PROP_ID_UNSUPPORTED
;
615 /* given specific device so try the render devices first */
616 wodn
= waveOutGetNumDevs();
617 for (wod
= 0; wod
< wodn
; wod
++) {
618 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
620 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
621 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
622 ppd
->WaveDeviceId
= wod
;
623 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
625 PIDSDRIVER drv
= NULL
;
626 /* FIXME: this is a memory leak */
627 CHAR
* szDescription
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDesc
) + 1);
628 CHAR
* szModule
= HeapAlloc(GetProcessHeap(),0,strlen(desc
.szDrvName
) + 1);
629 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
631 strcpy(szDescription
, desc
.szDesc
);
632 strcpy(szModule
, desc
.szDrvName
);
633 strcpy(szInterface
, "Interface");
635 ppd
->Description
= szDescription
;
636 ppd
->Module
= szModule
;
637 ppd
->Interface
= szInterface
;
638 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
639 if (err
== DS_OK
&& drv
)
640 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
644 WARN("waveOutMessage failed\n");
645 return E_PROP_ID_UNSUPPORTED
;
650 if (found
== FALSE
) {
651 WARN("device not found\n");
652 return E_PROP_ID_UNSUPPORTED
;
657 *pcbReturned
= cbPropData
;
658 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
664 static HRESULT WINAPI
DSPROPERTY_DescriptionW(
670 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA
) pPropData
;
673 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
674 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
676 TRACE("DeviceId=%s\n",debugstr_guid(&ppd
->DeviceId
));
677 if ( IsEqualGUID( &ppd
->DeviceId
, &GUID_NULL
) ) {
678 /* default device of type specified by ppd->DataFlow */
679 if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
) {
680 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
681 } else if (ppd
->DataFlow
== DIRECTSOUNDDEVICE_DATAFLOW_RENDER
) {
682 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
684 TRACE("DataFlow=Unknown(%d)\n", ppd
->DataFlow
);
686 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
687 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
688 return E_PROP_ID_UNSUPPORTED
;
691 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_EMULATED
;
692 GetDeviceID(&ppd
->DeviceId
, &dev_guid
);
694 if ( IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultPlayback
) ||
695 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoicePlayback
) ) {
698 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
699 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
700 wodn
= waveOutGetNumDevs();
701 for (wod
= 0; wod
< wodn
; wod
++) {
702 if (IsEqualGUID( &dev_guid
, &renderer_guids
[wod
] ) ) {
704 ppd
->WaveDeviceId
= wod
;
705 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
707 PIDSDRIVER drv
= NULL
;
708 /* FIXME: this is a memory leak */
709 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
710 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
711 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
713 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
714 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
715 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
717 ppd
->Description
= wDescription
;
718 ppd
->Module
= wModule
;
719 ppd
->Interface
= wInterface
;
720 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
721 if (err
== DS_OK
&& drv
)
722 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
725 WARN("waveOutMessage failed\n");
726 return E_PROP_ID_UNSUPPORTED
;
730 } else if (IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultCapture
) ||
731 IsEqualGUID( &ppd
->DeviceId
, &DSDEVID_DefaultVoiceCapture
) ) {
734 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
735 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
736 widn
= waveInGetNumDevs();
737 for (wid
= 0; wid
< widn
; wid
++) {
738 if (IsEqualGUID( &dev_guid
, &capture_guids
[wid
] ) ) {
740 ppd
->WaveDeviceId
= wid
;
741 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
744 /* FIXME: this is a memory leak */
745 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
746 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
747 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
749 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
750 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
751 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
753 ppd
->Description
= wDescription
;
754 ppd
->Module
= wModule
;
755 ppd
->Interface
= wInterface
;
756 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDIFACE
,(DWORD
)&drv
,0));
757 if (err
== DS_OK
&& drv
)
758 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
761 WARN("waveInMessage failed\n");
762 return E_PROP_ID_UNSUPPORTED
;
771 /* given specific device so try the render devices first */
772 wodn
= waveOutGetNumDevs();
773 for (wod
= 0; wod
< wodn
; wod
++) {
774 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
776 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
777 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
778 ppd
->WaveDeviceId
= wod
;
779 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
781 PIDSDRIVER drv
= NULL
;
782 /* FIXME: this is a memory leak */
783 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
784 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
785 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
787 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
788 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
789 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
791 ppd
->Description
= wDescription
;
792 ppd
->Module
= wModule
;
793 ppd
->Interface
= wInterface
;
794 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
795 if (err
== DS_OK
&& drv
)
796 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
800 WARN("waveOutMessage failed\n");
801 return E_PROP_ID_UNSUPPORTED
;
806 if (found
== FALSE
) {
807 WARN("device not found\n");
808 return E_PROP_ID_UNSUPPORTED
;
813 *pcbReturned
= cbPropData
;
814 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
820 static HRESULT WINAPI
DSPROPERTY_Enumerate1(
826 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
827 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
828 return E_PROP_ID_UNSUPPORTED
;
831 static HRESULT WINAPI
DSPROPERTY_EnumerateA(
837 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
) pPropData
;
839 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
840 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
842 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
845 unsigned devs
, wod
, wid
;
847 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data
;
849 devs
= waveOutGetNumDevs();
850 for (wod
= 0; wod
< devs
; ++wod
) {
851 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
853 memset(&data
, 0, sizeof(data
));
854 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
855 data
.WaveDeviceId
= wod
;
856 data
.DeviceId
= renderer_guids
[wod
];
857 data
.Description
= desc
.szDesc
;
858 data
.Module
= desc
.szDrvName
;
859 data
.Interface
= "Interface";
860 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
861 (ppd
->Callback
)(&data
, ppd
->Context
);
865 devs
= waveInGetNumDevs();
866 for (wid
= 0; wid
< devs
; ++wid
) {
867 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
869 memset(&data
, 0, sizeof(data
));
870 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
871 data
.WaveDeviceId
= wid
;
872 data
.DeviceId
= capture_guids
[wid
];
873 data
.Description
= desc
.szDesc
;
874 data
.Module
= desc
.szDrvName
;
875 data
.Interface
= "Interface";
876 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
877 (ppd
->Callback
)(&data
, ppd
->Context
);
885 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
890 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
893 return E_PROP_ID_UNSUPPORTED
;
896 static HRESULT WINAPI
DSPROPERTY_EnumerateW(
902 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
) pPropData
;
904 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
905 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
907 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
910 unsigned devs
, wod
, wid
;
912 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
914 devs
= waveOutGetNumDevs();
915 for (wod
= 0; wod
< devs
; ++wod
) {
916 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
918 /* FIXME: this is a memory leak */
919 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
920 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
921 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
923 memset(&data
, 0, sizeof(data
));
924 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
925 data
.WaveDeviceId
= wod
;
926 data
.DeviceId
= renderer_guids
[wod
];
928 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
929 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
930 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
932 data
.Description
= wDescription
;
933 data
.Module
= wModule
;
934 data
.Interface
= wInterface
;
935 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
936 (ppd
->Callback
)(&data
, ppd
->Context
);
940 devs
= waveInGetNumDevs();
941 for (wid
= 0; wid
< devs
; ++wid
) {
942 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
944 /* FIXME: this is a memory leak */
945 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
946 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
947 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
949 memset(&data
, 0, sizeof(data
));
950 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
951 data
.WaveDeviceId
= wid
;
952 data
.DeviceId
= capture_guids
[wid
];
954 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
955 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvName
, -1, wModule
, 0x100 );
956 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
958 data
.Description
= wDescription
;
959 data
.Module
= wModule
;
960 data
.Interface
= wInterface
;
961 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
962 (ppd
->Callback
)(&data
, ppd
->Context
);
970 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
975 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
978 return E_PROP_ID_UNSUPPORTED
;
981 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
982 LPKSPROPERTYSET iface
,
985 LPVOID pInstanceData
,
986 ULONG cbInstanceData
,
991 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
992 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
993 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
995 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
997 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
998 return DSPROPERTY_WaveDeviceMappingA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
999 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1000 return DSPROPERTY_Description1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1001 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1002 return DSPROPERTY_Enumerate1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1003 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1004 return DSPROPERTY_WaveDeviceMappingW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1005 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1006 return DSPROPERTY_DescriptionA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1007 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1008 return DSPROPERTY_DescriptionW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1009 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1010 return DSPROPERTY_EnumerateA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1011 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1012 return DSPROPERTY_EnumerateW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1014 FIXME("unsupported ID: %ld\n",dwPropID
);
1018 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1023 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
1026 return E_PROP_ID_UNSUPPORTED
;
1029 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
1030 LPKSPROPERTYSET iface
,
1031 REFGUID guidPropSet
,
1033 LPVOID pInstanceData
,
1034 ULONG cbInstanceData
,
1038 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
1040 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
1041 return E_PROP_ID_UNSUPPORTED
;
1044 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
1045 LPKSPROPERTYSET iface
,
1046 REFGUID guidPropSet
,
1048 PULONG pTypeSupport
)
1050 ICOM_THIS(IKsPrivatePropertySetImpl
,iface
);
1051 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
1053 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1055 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1056 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1058 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1059 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1061 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1062 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1064 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1065 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1067 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1068 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1070 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1071 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1073 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1074 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1076 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1077 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1080 FIXME("unsupported ID: %ld\n",dwPropID
);
1084 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1087 return E_PROP_ID_UNSUPPORTED
;
1090 static IKsPropertySetVtbl ikspvt
= {
1091 IKsPrivatePropertySetImpl_QueryInterface
,
1092 IKsPrivatePropertySetImpl_AddRef
,
1093 IKsPrivatePropertySetImpl_Release
,
1094 IKsPrivatePropertySetImpl_Get
,
1095 IKsPrivatePropertySetImpl_Set
,
1096 IKsPrivatePropertySetImpl_QuerySupport
1099 HRESULT WINAPI
IKsPrivatePropertySetImpl_Create(
1100 IKsPrivatePropertySetImpl
**piks
)
1102 IKsPrivatePropertySetImpl
*iks
;
1104 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
1106 iks
->lpVtbl
= &ikspvt
;