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
32 #include "wine/debug.h"
35 #include "dsound_private.h"
39 #ifdef NONAMELESSSTRUCT
45 WINE_DEFAULT_DEBUG_CHANNEL(dsound
);
48 /*******************************************************************************
49 * IKsBufferPropertySet
52 /* IUnknown methods */
53 static HRESULT WINAPI
IKsBufferPropertySetImpl_QueryInterface(
54 LPKSPROPERTYSET iface
,
58 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
59 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
61 return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8
)This
->dsb
, riid
, ppobj
);
64 static ULONG WINAPI
IKsBufferPropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
66 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
67 ULONG ref
= InterlockedIncrement(&(This
->ref
));
68 TRACE("(%p) ref was %ld\n", This
, ref
- 1);
72 static ULONG WINAPI
IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface
)
74 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
75 ULONG ref
= InterlockedDecrement(&(This
->ref
));
76 TRACE("(%p) ref was %ld\n", This
, ref
+ 1);
80 IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER
)This
->dsb
);
81 HeapFree(GetProcessHeap(), 0, This
);
82 TRACE("(%p) released\n", This
);
87 static HRESULT WINAPI
IKsBufferPropertySetImpl_Get(
88 LPKSPROPERTYSET iface
,
97 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
98 PIDSDRIVERPROPERTYSET ps
;
99 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
100 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
102 if (This
->dsb
->hwbuf
) {
103 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
109 S(prop
).Set
= *guidPropSet
;
110 S(prop
).Id
= dwPropID
;
111 S(prop
).Flags
= 0; /* unused */
112 S(prop
).InstanceId
= (ULONG
)This
->dsb
->dsound
;
114 hres
= IDsDriverPropertySet_Get(ps
, &prop
, pInstanceData
, cbInstanceData
, pPropData
, cbPropData
, pcbReturned
);
116 IDsDriverPropertySet_Release(ps
);
122 return E_PROP_ID_UNSUPPORTED
;
125 static HRESULT WINAPI
IKsBufferPropertySetImpl_Set(
126 LPKSPROPERTYSET iface
,
129 LPVOID pInstanceData
,
130 ULONG cbInstanceData
,
134 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
135 PIDSDRIVERPROPERTYSET ps
;
136 TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
138 if (This
->dsb
->hwbuf
) {
139 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
145 S(prop
).Set
= *guidPropSet
;
146 S(prop
).Id
= dwPropID
;
147 S(prop
).Flags
= 0; /* unused */
148 S(prop
).InstanceId
= (ULONG
)This
->dsb
->dsound
;
149 hres
= IDsDriverPropertySet_Set(ps
,&prop
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
151 IDsDriverPropertySet_Release(ps
);
157 return E_PROP_ID_UNSUPPORTED
;
160 static HRESULT WINAPI
IKsBufferPropertySetImpl_QuerySupport(
161 LPKSPROPERTYSET iface
,
164 PULONG pTypeSupport
)
166 IKsBufferPropertySetImpl
*This
= (IKsBufferPropertySetImpl
*)iface
;
167 PIDSDRIVERPROPERTYSET ps
;
168 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
170 if (This
->dsb
->hwbuf
) {
171 IDsDriver_QueryInterface(This
->dsb
->hwbuf
, &IID_IDsDriverPropertySet
, (void **)&ps
);
176 hres
= IDsDriverPropertySet_QuerySupport(ps
,guidPropSet
, dwPropID
,pTypeSupport
);
178 IDsDriverPropertySet_Release(ps
);
184 return E_PROP_ID_UNSUPPORTED
;
187 static IKsPropertySetVtbl iksbvt
= {
188 IKsBufferPropertySetImpl_QueryInterface
,
189 IKsBufferPropertySetImpl_AddRef
,
190 IKsBufferPropertySetImpl_Release
,
191 IKsBufferPropertySetImpl_Get
,
192 IKsBufferPropertySetImpl_Set
,
193 IKsBufferPropertySetImpl_QuerySupport
196 HRESULT WINAPI
IKsBufferPropertySetImpl_Create(
197 IDirectSoundBufferImpl
*dsb
,
198 IKsBufferPropertySetImpl
**piks
)
200 IKsBufferPropertySetImpl
*iks
;
201 TRACE("(%p,%p)\n",dsb
,piks
);
203 iks
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(*iks
));
205 WARN("out of memory\n");
207 return DSERR_OUTOFMEMORY
;
213 iks
->lpVtbl
= &iksbvt
;
215 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER
)dsb
);
221 HRESULT WINAPI
IKsBufferPropertySetImpl_Destroy(
222 IKsBufferPropertySetImpl
*piks
)
224 TRACE("(%p)\n",piks
);
226 while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET
)piks
) > 0);
231 /*******************************************************************************
232 * IKsPrivatePropertySet
235 /* IUnknown methods */
236 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QueryInterface(
237 LPKSPROPERTYSET iface
,
241 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
242 TRACE("(%p,%s,%p)\n",This
,debugstr_guid(riid
),ppobj
);
245 return DSERR_INVALIDPARAM
;
248 static ULONG WINAPI
IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface
)
250 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
251 ULONG ref
= InterlockedIncrement(&(This
->ref
));
252 TRACE("(%p) ref was %ld\n", This
, ref
- 1);
256 static ULONG WINAPI
IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface
)
258 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
259 ULONG ref
= InterlockedDecrement(&(This
->ref
));
260 TRACE("(%p) ref was %ld\n", This
, ref
+ 1);
263 HeapFree(GetProcessHeap(), 0, This
);
264 TRACE("(%p) released\n", This
);
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
;
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
;
769 /* given specific device so try the render devices first */
770 wodn
= waveOutGetNumDevs();
771 for (wod
= 0; wod
< wodn
; wod
++) {
772 if (IsEqualGUID( &ppd
->DeviceId
, &renderer_guids
[wod
] ) ) {
774 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
775 ppd
->DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
776 ppd
->WaveDeviceId
= wod
;
777 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&(desc
),0));
779 PIDSDRIVER drv
= NULL
;
780 /* FIXME: this is a memory leak */
781 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
782 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
783 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,0x200);
785 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
786 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, wModule
, 0x100 );
787 MultiByteToWideChar( CP_ACP
, 0, "Interface", -1, wInterface
, 0x100 );
789 ppd
->Description
= wDescription
;
790 ppd
->Module
= wModule
;
791 ppd
->Interface
= wInterface
;
792 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDSOUNDIFACE
, (DWORD
)&drv
, 0));
793 if (err
== DS_OK
&& drv
)
794 ppd
->Type
= DIRECTSOUNDDEVICE_TYPE_VXD
;
798 WARN("waveOutMessage failed\n");
799 return E_PROP_ID_UNSUPPORTED
;
804 if (found
== FALSE
) {
805 WARN("device not found\n");
806 return E_PROP_ID_UNSUPPORTED
;
811 *pcbReturned
= cbPropData
;
812 TRACE("*pcbReturned=%ld\n", *pcbReturned
);
818 static HRESULT WINAPI
DSPROPERTY_Enumerate1(
824 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
825 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
826 return E_PROP_ID_UNSUPPORTED
;
829 static HRESULT WINAPI
DSPROPERTY_EnumerateA(
835 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA
) pPropData
;
837 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
838 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
840 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
843 unsigned devs
, wod
, wid
;
845 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data
;
847 devs
= waveOutGetNumDevs();
848 for (wod
= 0; wod
< devs
; ++wod
) {
849 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
852 ZeroMemory(&data
, 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 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDEVICEINTERFACESIZE
,(DWORD_PTR
)&size
,0));
860 WCHAR
* nameW
= HeapAlloc(GetProcessHeap(),0,size
);
861 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDEVICEINTERFACE
,(DWORD_PTR
)nameW
,size
));
863 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,size
/sizeof(WCHAR
));
864 WideCharToMultiByte( CP_ACP
, 0, nameW
, size
/sizeof(WCHAR
), szInterface
, size
/sizeof(WCHAR
), NULL
, NULL
);
865 data
.Interface
= szInterface
;
867 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
868 (ppd
->Callback
)(&data
, ppd
->Context
);
870 HeapFree(GetProcessHeap(),0,szInterface
);
872 HeapFree(GetProcessHeap(),0,nameW
);
877 devs
= waveInGetNumDevs();
878 for (wid
= 0; wid
< devs
; ++wid
) {
879 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
882 ZeroMemory(&data
, sizeof(data
));
883 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
884 data
.WaveDeviceId
= wid
;
885 data
.DeviceId
= capture_guids
[wid
];
886 data
.Description
= desc
.szDesc
;
887 data
.Module
= desc
.szDrvname
;
888 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDEVICEINTERFACESIZE
,(DWORD_PTR
)&size
,0));
890 WCHAR
* nameW
= HeapAlloc(GetProcessHeap(),0,size
);
891 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDEVICEINTERFACE
,(DWORD_PTR
)nameW
,size
));
893 CHAR
* szInterface
= HeapAlloc(GetProcessHeap(),0,size
/sizeof(WCHAR
));
894 WideCharToMultiByte( CP_ACP
, 0, nameW
, size
/sizeof(WCHAR
), szInterface
, size
/sizeof(WCHAR
), NULL
, NULL
);
895 data
.Interface
= szInterface
;
897 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
898 (ppd
->Callback
)(&data
, ppd
->Context
);
900 HeapFree(GetProcessHeap(),0,szInterface
);
902 HeapFree(GetProcessHeap(),0,nameW
);
911 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
916 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
919 return E_PROP_ID_UNSUPPORTED
;
922 static HRESULT WINAPI
DSPROPERTY_EnumerateW(
928 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd
= (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA
) pPropData
;
930 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
931 debugstr_guid(guidPropSet
),pPropData
,cbPropData
,pcbReturned
);
933 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
936 unsigned devs
, wod
, wid
;
938 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data
;
940 devs
= waveOutGetNumDevs();
941 for (wod
= 0; wod
< devs
; ++wod
) {
942 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
944 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
945 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
947 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
,DRV_QUERYDEVICEINTERFACESIZE
, (DWORD_PTR
)&size
, 0));
949 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,size
);
950 err
= mmErr(waveOutMessage((HWAVEOUT
)wod
, DRV_QUERYDEVICEINTERFACE
, (DWORD_PTR
)wInterface
, size
));
952 ZeroMemory(&data
, sizeof(data
));
953 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_RENDER
;
954 data
.WaveDeviceId
= wod
;
955 data
.DeviceId
= renderer_guids
[wod
];
957 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
958 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, wModule
, 0x100 );
960 data
.Description
= wDescription
;
961 data
.Module
= wModule
;
962 data
.Interface
= wInterface
;
964 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
965 (ppd
->Callback
)(&data
, ppd
->Context
);
967 HeapFree(GetProcessHeap(),0,wInterface
);
969 HeapFree(GetProcessHeap(),0,wDescription
);
970 HeapFree(GetProcessHeap(),0,wModule
);
974 devs
= waveInGetNumDevs();
975 for (wid
= 0; wid
< devs
; ++wid
) {
976 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDSOUNDDESC
,(DWORD
)&desc
,0));
978 WCHAR
* wDescription
= HeapAlloc(GetProcessHeap(),0,0x200);
979 WCHAR
* wModule
= HeapAlloc(GetProcessHeap(),0,0x200);
981 err
= mmErr(waveInMessage((HWAVEIN
)wid
,DRV_QUERYDEVICEINTERFACESIZE
, (DWORD_PTR
)&size
, 0));
983 WCHAR
* wInterface
= HeapAlloc(GetProcessHeap(),0,size
);
984 err
= mmErr(waveInMessage((HWAVEIN
)wod
, DRV_QUERYDEVICEINTERFACE
, (DWORD_PTR
)wInterface
, size
));
986 ZeroMemory(&data
, sizeof(data
));
987 data
.DataFlow
= DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE
;
988 data
.WaveDeviceId
= wid
;
989 data
.DeviceId
= capture_guids
[wid
];
991 MultiByteToWideChar( CP_ACP
, 0, desc
.szDesc
, -1, wDescription
, 0x100 );
992 MultiByteToWideChar( CP_ACP
, 0, desc
.szDrvname
, -1, wModule
, 0x100 );
994 data
.Description
= wDescription
;
995 data
.Module
= wModule
;
996 data
.Interface
= wInterface
;
997 TRACE("calling Callback(%p,%p)\n", &data
, ppd
->Context
);
998 (ppd
->Callback
)(&data
, ppd
->Context
);
1000 HeapFree(GetProcessHeap(),0,wInterface
);
1002 HeapFree(GetProcessHeap(),0,wDescription
);
1003 HeapFree(GetProcessHeap(),0,wModule
);
1011 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1016 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
1019 return E_PROP_ID_UNSUPPORTED
;
1022 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Get(
1023 LPKSPROPERTYSET iface
,
1024 REFGUID guidPropSet
,
1026 LPVOID pInstanceData
,
1027 ULONG cbInstanceData
,
1032 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1033 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
1034 This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
,pcbReturned
);
1036 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1038 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1039 return DSPROPERTY_WaveDeviceMappingA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1040 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1041 return DSPROPERTY_Description1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1042 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1043 return DSPROPERTY_Enumerate1(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1044 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1045 return DSPROPERTY_WaveDeviceMappingW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1046 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1047 return DSPROPERTY_DescriptionA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1048 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1049 return DSPROPERTY_DescriptionW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1050 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1051 return DSPROPERTY_EnumerateA(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1052 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1053 return DSPROPERTY_EnumerateW(guidPropSet
,pPropData
,cbPropData
,pcbReturned
);
1055 FIXME("unsupported ID: %ld\n",dwPropID
);
1059 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1064 FIXME("*pcbReturned=%ld\n", *pcbReturned
);
1067 return E_PROP_ID_UNSUPPORTED
;
1070 static HRESULT WINAPI
IKsPrivatePropertySetImpl_Set(
1071 LPKSPROPERTYSET iface
,
1072 REFGUID guidPropSet
,
1074 LPVOID pInstanceData
,
1075 ULONG cbInstanceData
,
1079 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1081 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pInstanceData
,cbInstanceData
,pPropData
,cbPropData
);
1082 return E_PROP_ID_UNSUPPORTED
;
1085 static HRESULT WINAPI
IKsPrivatePropertySetImpl_QuerySupport(
1086 LPKSPROPERTYSET iface
,
1087 REFGUID guidPropSet
,
1089 PULONG pTypeSupport
)
1091 IKsPrivatePropertySetImpl
*This
= (IKsPrivatePropertySetImpl
*)iface
;
1092 TRACE("(%p,%s,%ld,%p)\n",This
,debugstr_guid(guidPropSet
),dwPropID
,pTypeSupport
);
1094 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice
, guidPropSet
) ) {
1096 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A
:
1097 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1099 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1
:
1100 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1102 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1
:
1103 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1105 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W
:
1106 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1108 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A
:
1109 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1111 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W
:
1112 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1114 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A
:
1115 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1117 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W
:
1118 *pTypeSupport
= KSPROPERTY_SUPPORT_GET
;
1121 FIXME("unsupported ID: %ld\n",dwPropID
);
1125 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet
));
1128 return E_PROP_ID_UNSUPPORTED
;
1131 static IKsPropertySetVtbl ikspvt
= {
1132 IKsPrivatePropertySetImpl_QueryInterface
,
1133 IKsPrivatePropertySetImpl_AddRef
,
1134 IKsPrivatePropertySetImpl_Release
,
1135 IKsPrivatePropertySetImpl_Get
,
1136 IKsPrivatePropertySetImpl_Set
,
1137 IKsPrivatePropertySetImpl_QuerySupport
1140 HRESULT WINAPI
IKsPrivatePropertySetImpl_Create(
1141 IKsPrivatePropertySetImpl
**piks
)
1143 IKsPrivatePropertySetImpl
*iks
;
1145 iks
= HeapAlloc(GetProcessHeap(),0,sizeof(*iks
));
1147 iks
->lpVtbl
= &ikspvt
;