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"
52 #include "dsound_private.h"
54 WINE_DEFAULT_DEBUG_CHANNEL(dsound);
57 /*******************************************************************************
58 * IKsBufferPropertySet
61 /* IUnknown methods */
62 static HRESULT WINAPI IKsBufferPropertySetImpl_QueryInterface(
63 LPKSPROPERTYSET iface,
67 ICOM_THIS(IKsBufferPropertySetImpl,iface);
68 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
70 return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj);
73 static ULONG WINAPI IKsBufferPropertySetImpl_AddRef(LPKSPROPERTYSET iface)
75 ICOM_THIS(IKsBufferPropertySetImpl,iface);
78 TRACE("(%p) ref was %ld\n", This, This->ref);
79 ulReturn = InterlockedIncrement(&(This->ref));
83 static ULONG WINAPI IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface)
85 ICOM_THIS(IKsBufferPropertySetImpl,iface);
88 TRACE("(%p) ref was %ld\n", This, This->ref);
89 ulReturn = InterlockedDecrement(&This->ref);
92 IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
93 HeapFree(GetProcessHeap(),0,This);
94 TRACE("(%p) released\n",This);
99 static HRESULT WINAPI IKsBufferPropertySetImpl_Get(
100 LPKSPROPERTYSET iface,
103 LPVOID pInstanceData,
104 ULONG cbInstanceData,
109 ICOM_THIS(IKsBufferPropertySetImpl,iface);
110 PIDSDRIVERPROPERTYSET ps;
111 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
112 This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
114 IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
120 prop.s.Set = *guidPropSet;
121 prop.s.Id = dwPropID;
122 prop.s.Flags = 0; /* unused */
123 prop.s.InstanceId = (ULONG)This->dsb->dsound;
125 hres = IDsDriverPropertySet_Get(ps, &prop, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned);
127 IDsDriverPropertySet_Release(ps);
132 return E_PROP_ID_UNSUPPORTED;
135 static HRESULT WINAPI IKsBufferPropertySetImpl_Set(
136 LPKSPROPERTYSET iface,
139 LPVOID pInstanceData,
140 ULONG cbInstanceData,
144 ICOM_THIS(IKsBufferPropertySetImpl,iface);
145 PIDSDRIVERPROPERTYSET ps;
146 TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
148 IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
154 prop.s.Set = *guidPropSet;
155 prop.s.Id = dwPropID;
156 prop.s.Flags = 0; /* unused */
157 prop.s.InstanceId = (ULONG)This->dsb->dsound;
158 hres = IDsDriverPropertySet_Set(ps,&prop,pInstanceData,cbInstanceData,pPropData,cbPropData);
160 IDsDriverPropertySet_Release(ps);
165 return E_PROP_ID_UNSUPPORTED;
168 static HRESULT WINAPI IKsBufferPropertySetImpl_QuerySupport(
169 LPKSPROPERTYSET iface,
172 PULONG pTypeSupport )
174 ICOM_THIS(IKsBufferPropertySetImpl,iface);
175 PIDSDRIVERPROPERTYSET ps;
176 TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
178 IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
183 hres = IDsDriverPropertySet_QuerySupport(ps,guidPropSet, dwPropID,pTypeSupport);
185 IDsDriverPropertySet_Release(ps);
190 return E_PROP_ID_UNSUPPORTED;
193 static ICOM_VTABLE(IKsPropertySet) iksbvt = {
194 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
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 = (IKsBufferPropertySetImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*iks));
214 iks->lpVtbl = &iksbvt;
216 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
222 /*******************************************************************************
223 * IKsPrivatePropertySet
226 /* IUnknown methods */
227 static HRESULT WINAPI IKsPrivatePropertySetImpl_QueryInterface(
228 LPKSPROPERTYSET iface,
232 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
233 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
236 return DSERR_INVALIDPARAM;
239 static ULONG WINAPI IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface)
241 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
244 TRACE("(%p) ref was %ld\n", This, This->ref);
245 ulReturn = InterlockedIncrement(&This->ref);
249 static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
251 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
254 TRACE("(%p) ref was %ld\n", This, This->ref);
255 ulReturn = InterlockedDecrement(&This->ref);
259 static HRESULT WINAPI DSPROPERTY_WaveDeviceMappingA(
265 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd;
266 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
267 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
269 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA) pPropData;
272 WARN("invalid parameter: pPropData\n");
273 return DSERR_INVALIDPARAM;
276 FIXME("DeviceName=%s\n",ppd->DeviceName);
277 FIXME("DataFlow=%s\n",
278 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
279 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
281 /* FIXME: match the name to a wave device somehow. */
282 ppd->DeviceId = GUID_NULL;
285 *pcbReturned = cbPropData;
286 FIXME("*pcbReturned=%ld\n", *pcbReturned);
292 static HRESULT WINAPI DSPROPERTY_WaveDeviceMappingW(
298 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd;
299 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
300 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
302 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA) pPropData;
305 WARN("invalid parameter: pPropData\n");
306 return DSERR_INVALIDPARAM;
309 FIXME("DeviceName=%s\n",debugstr_w(ppd->DeviceName));
310 FIXME("DataFlow=%s\n",
311 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
312 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
314 /* FIXME: match the name to a wave device somehow. */
315 ppd->DeviceId = GUID_NULL;
318 *pcbReturned = cbPropData;
319 FIXME("*pcbReturned=%ld\n", *pcbReturned);
325 static HRESULT WINAPI DSPROPERTY_Description1(
333 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd;
334 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
335 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
337 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA) pPropData;
340 WARN("invalid parameter: pPropData\n");
341 return DSERR_INVALIDPARAM;
344 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
345 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
346 /* default device of type specified by ppd->DataFlow */
347 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
348 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
349 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
350 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
352 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
354 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
355 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
356 return E_PROP_ID_UNSUPPORTED;
359 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
360 GetDeviceID(&ppd->DeviceId, &dev_guid);
362 if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) ||
363 IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) {
366 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
367 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
368 wodn = waveOutGetNumDevs();
369 for (wod = 0; wod < wodn; wod++) {
370 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
372 if (IsEqualGUID( &dev_guid, &guid) ) {
374 ppd->WaveDeviceId = wod;
376 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
378 PIDSDRIVER drv = NULL;
379 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
380 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
381 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
382 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
383 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
384 if (err == DS_OK && drv)
385 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
388 WARN("waveOutMessage failed\n");
389 return E_PROP_ID_UNSUPPORTED;
393 WARN("waveOutMessage failed\n");
394 return E_PROP_ID_UNSUPPORTED;
397 } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
398 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
401 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
402 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
403 widn = waveInGetNumDevs();
404 for (wid = 0; wid < widn; wid++) {
405 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
407 if (IsEqualGUID( &dev_guid, &guid) ) {
409 ppd->WaveDeviceId = wid;
411 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
414 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
415 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
416 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
417 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
418 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
419 if (err == DS_OK && drv)
420 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
423 WARN("waveInMessage failed\n");
424 return E_PROP_ID_UNSUPPORTED;
429 WARN("waveInMessage failed\n");
430 return E_PROP_ID_UNSUPPORTED;
437 /* given specific device so try the render devices first */
438 wodn = waveOutGetNumDevs();
439 for (wod = 0; wod < wodn; wod++) {
440 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
442 if (IsEqualGUID( &ppd->DeviceId, &guid) ) {
444 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
445 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
446 ppd->WaveDeviceId = wod;
448 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
450 PIDSDRIVER drv = NULL;
451 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
452 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
453 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
454 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
455 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
456 if (err == DS_OK && drv)
457 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
461 WARN("waveOutMessage failed\n");
462 return E_PROP_ID_UNSUPPORTED;
466 WARN("waveOutMessage failed\n");
467 return E_PROP_ID_UNSUPPORTED;
471 if (found == FALSE) {
472 WARN("device not found\n");
473 return E_PROP_ID_UNSUPPORTED;
478 *pcbReturned = cbPropData;
479 TRACE("*pcbReturned=%ld\n", *pcbReturned);
485 static HRESULT WINAPI DSPROPERTY_DescriptionA(
491 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA) pPropData;
494 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
495 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
497 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
498 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
499 /* default device of type specified by ppd->DataFlow */
500 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
501 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
502 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
503 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
505 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
507 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
508 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
509 return E_PROP_ID_UNSUPPORTED;
512 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
513 GetDeviceID(&ppd->DeviceId, &dev_guid);
515 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
516 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
519 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
520 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
521 wodn = waveOutGetNumDevs();
522 for (wod = 0; wod < wodn; wod++) {
523 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
525 if (IsEqualGUID( &dev_guid, &guid) ) {
527 ppd->WaveDeviceId = wod;
528 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
530 PIDSDRIVER drv = NULL;
531 /* FIXME: this is a memory leak */
532 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
533 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
534 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
536 strcpy(szDescription, desc.szDesc);
537 strcpy(szModule, desc.szDrvName);
538 strcpy(szInterface, "Interface");
540 ppd->Description = szDescription;
541 ppd->Module = szModule;
542 ppd->Interface = szInterface;
543 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
544 if (err == DS_OK && drv)
545 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
548 WARN("waveOutMessage failed\n");
549 return E_PROP_ID_UNSUPPORTED;
553 WARN("waveOutMessage failed\n");
554 return E_PROP_ID_UNSUPPORTED;
557 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
558 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
561 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
562 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
563 widn = waveInGetNumDevs();
564 for (wid = 0; wid < widn; wid++) {
565 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
567 if (IsEqualGUID( &dev_guid, &guid) ) {
569 ppd->WaveDeviceId = wid;
570 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
573 /* FIXME: this is a memory leak */
574 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
575 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
576 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
578 strcpy(szDescription, desc.szDesc);
579 strcpy(szModule, desc.szDrvName);
580 strcpy(szInterface, "Interface");
582 ppd->Description = szDescription;
583 ppd->Module = szModule;
584 ppd->Interface = szInterface;
585 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
586 if (err == DS_OK && drv)
587 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
590 WARN("waveInMessage failed\n");
591 return E_PROP_ID_UNSUPPORTED;
596 WARN("waveOutMessage failed\n");
597 return E_PROP_ID_UNSUPPORTED;
603 *pcbReturned = cbPropData;
604 TRACE("*pcbReturned=%ld\n", *pcbReturned);
610 static HRESULT WINAPI DSPROPERTY_DescriptionW(
616 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA) pPropData;
619 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
620 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
622 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
623 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
624 /* default device of type specified by ppd->DataFlow */
625 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
626 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
627 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
628 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
630 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
632 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
633 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
634 return E_PROP_ID_UNSUPPORTED;
637 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
638 GetDeviceID(&ppd->DeviceId, &dev_guid);
640 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
641 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
644 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
645 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
646 wodn = waveOutGetNumDevs();
647 for (wod = 0; wod < wodn; wod++) {
648 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
650 if (IsEqualGUID( &dev_guid, &guid) ) {
652 ppd->WaveDeviceId = wod;
653 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
655 PIDSDRIVER drv = NULL;
656 /* FIXME: this is a memory leak */
657 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
658 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
659 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
661 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
662 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
663 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
665 ppd->Description = wDescription;
666 ppd->Module = wModule;
667 ppd->Interface = wInterface;
668 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
669 if (err == DS_OK && drv)
670 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
673 WARN("waveOutMessage failed\n");
674 return E_PROP_ID_UNSUPPORTED;
678 WARN("waveOutMessage failed\n");
679 return E_PROP_ID_UNSUPPORTED;
682 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
683 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
686 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
687 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
688 widn = waveInGetNumDevs();
689 for (wid = 0; wid < widn; wid++) {
690 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
692 if (IsEqualGUID( &dev_guid, &guid) ) {
694 ppd->WaveDeviceId = wid;
695 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
698 /* FIXME: this is a memory leak */
699 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
700 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
701 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
703 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
704 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
705 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
707 ppd->Description = wDescription;
708 ppd->Module = wModule;
709 ppd->Interface = wInterface;
710 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
711 if (err == DS_OK && drv)
712 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
715 WARN("waveInMessage failed\n");
716 return E_PROP_ID_UNSUPPORTED;
721 WARN("waveInMessage failed\n");
722 return E_PROP_ID_UNSUPPORTED;
726 FIXME("DeviceId=Unknown\n");
727 return E_PROP_ID_UNSUPPORTED;
731 *pcbReturned = cbPropData;
732 TRACE("*pcbReturned=%ld\n", *pcbReturned);
738 static HRESULT WINAPI DSPROPERTY_Enumerate1(
744 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
745 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
746 return E_PROP_ID_UNSUPPORTED;
749 static HRESULT WINAPI DSPROPERTY_EnumerateA(
755 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA) pPropData;
757 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
758 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
760 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
763 unsigned devs, wod, wid;
766 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
768 devs = waveOutGetNumDevs();
769 for (wod = 0; wod < devs; ++wod) {
770 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
772 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
774 memset(&data, 0, sizeof(data));
775 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
776 data.WaveDeviceId = wod;
777 data.DeviceId = guid;
778 data.Description = desc.szDesc;
779 data.Module = desc.szDrvName;
780 data.Interface = "Interface";
781 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
782 (ppd->Callback)(&data, ppd->Context);
787 devs = waveInGetNumDevs();
788 for (wid = 0; wid < devs; ++wid) {
789 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
791 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
793 memset(&data, 0, sizeof(data));
794 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
795 data.WaveDeviceId = wid;
796 data.DeviceId = guid;
797 data.Description = desc.szDesc;
798 data.Module = desc.szDrvName;
799 data.Interface = "Interface";
800 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
801 (ppd->Callback)(&data, ppd->Context);
810 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
815 FIXME("*pcbReturned=%ld\n", *pcbReturned);
818 return E_PROP_ID_UNSUPPORTED;
821 static HRESULT WINAPI DSPROPERTY_EnumerateW(
827 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA) pPropData;
829 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
830 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
832 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
835 unsigned devs, wod, wid;
838 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
840 devs = waveOutGetNumDevs();
841 for (wod = 0; wod < devs; ++wod) {
842 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
844 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
846 /* FIXME: this is a memory leak */
847 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
848 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
849 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
851 memset(&data, 0, sizeof(data));
852 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
853 data.WaveDeviceId = wod;
854 data.DeviceId = guid;
856 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
857 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
858 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
860 data.Description = wDescription;
861 data.Module = wModule;
862 data.Interface = wInterface;
863 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
864 (ppd->Callback)(&data, ppd->Context);
869 devs = waveInGetNumDevs();
870 for (wid = 0; wid < devs; ++wid) {
871 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
873 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
875 /* FIXME: this is a memory leak */
876 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
877 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
878 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
880 memset(&data, 0, sizeof(data));
881 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
882 data.WaveDeviceId = wid;
883 data.DeviceId = guid;
885 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
886 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
887 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
889 data.Description = wDescription;
890 data.Module = wModule;
891 data.Interface = wInterface;
892 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
893 (ppd->Callback)(&data, ppd->Context);
902 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
907 FIXME("*pcbReturned=%ld\n", *pcbReturned);
910 return E_PROP_ID_UNSUPPORTED;
913 static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
914 LPKSPROPERTYSET iface,
917 LPVOID pInstanceData,
918 ULONG cbInstanceData,
923 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
924 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
925 This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
927 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
929 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
930 return DSPROPERTY_WaveDeviceMappingA(guidPropSet,pPropData,cbPropData,pcbReturned);
931 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
932 return DSPROPERTY_Description1(guidPropSet,pPropData,cbPropData,pcbReturned);
933 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
934 return DSPROPERTY_Enumerate1(guidPropSet,pPropData,cbPropData,pcbReturned);
935 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
936 return DSPROPERTY_WaveDeviceMappingW(guidPropSet,pPropData,cbPropData,pcbReturned);
937 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
938 return DSPROPERTY_DescriptionA(guidPropSet,pPropData,cbPropData,pcbReturned);
939 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
940 return DSPROPERTY_DescriptionW(guidPropSet,pPropData,cbPropData,pcbReturned);
941 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
942 return DSPROPERTY_EnumerateA(guidPropSet,pPropData,cbPropData,pcbReturned);
943 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
944 return DSPROPERTY_EnumerateW(guidPropSet,pPropData,cbPropData,pcbReturned);
946 FIXME("unsupported ID: %ld\n",dwPropID);
950 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
955 FIXME("*pcbReturned=%ld\n", *pcbReturned);
958 return E_PROP_ID_UNSUPPORTED;
961 static HRESULT WINAPI IKsPrivatePropertySetImpl_Set(
962 LPKSPROPERTYSET iface,
965 LPVOID pInstanceData,
966 ULONG cbInstanceData,
970 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
972 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
973 return E_PROP_ID_UNSUPPORTED;
976 static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
977 LPKSPROPERTYSET iface,
980 PULONG pTypeSupport )
982 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
983 TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
985 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
987 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
988 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
990 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
991 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
993 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
994 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
996 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
997 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
999 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
1000 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1002 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
1003 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1005 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
1006 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1008 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
1009 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1012 FIXME("unsupported ID: %ld\n",dwPropID);
1016 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
1019 return E_PROP_ID_UNSUPPORTED;
1022 static ICOM_VTABLE(IKsPropertySet) ikspvt = {
1023 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1024 IKsPrivatePropertySetImpl_QueryInterface,
1025 IKsPrivatePropertySetImpl_AddRef,
1026 IKsPrivatePropertySetImpl_Release,
1027 IKsPrivatePropertySetImpl_Get,
1028 IKsPrivatePropertySetImpl_Set,
1029 IKsPrivatePropertySetImpl_QuerySupport
1032 HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
1033 IKsPrivatePropertySetImpl **piks)
1035 IKsPrivatePropertySetImpl *iks;
1037 iks = (IKsPrivatePropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
1039 iks->lpVtbl = &ikspvt;