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;
434 FIXME("DeviceId=Unknown\n");
435 return E_PROP_ID_UNSUPPORTED;
439 *pcbReturned = cbPropData;
440 TRACE("*pcbReturned=%ld\n", *pcbReturned);
446 static HRESULT WINAPI DSPROPERTY_DescriptionA(
452 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA) pPropData;
455 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
456 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
458 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
459 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
460 /* default device of type specified by ppd->DataFlow */
461 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
462 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
463 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
464 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
466 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
468 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
469 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
470 return E_PROP_ID_UNSUPPORTED;
473 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
474 GetDeviceID(&ppd->DeviceId, &dev_guid);
476 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
477 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
480 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
481 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
482 wodn = waveOutGetNumDevs();
483 for (wod = 0; wod < wodn; wod++) {
484 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
486 if (IsEqualGUID( &dev_guid, &guid) ) {
488 ppd->WaveDeviceId = wod;
489 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
491 PIDSDRIVER drv = NULL;
492 /* FIXME: this is a memory leak */
493 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
494 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
495 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
497 strcpy(szDescription, desc.szDesc);
498 strcpy(szModule, desc.szDrvName);
499 strcpy(szInterface, "Interface");
501 ppd->Description = szDescription;
502 ppd->Module = szModule;
503 ppd->Interface = szInterface;
504 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
505 if (err == DS_OK && drv)
506 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
509 WARN("waveOutMessage failed\n");
510 return E_PROP_ID_UNSUPPORTED;
514 WARN("waveOutMessage failed\n");
515 return E_PROP_ID_UNSUPPORTED;
518 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
519 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
522 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
523 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
524 widn = waveInGetNumDevs();
525 for (wid = 0; wid < widn; wid++) {
526 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
528 if (IsEqualGUID( &dev_guid, &guid) ) {
530 ppd->WaveDeviceId = wid;
531 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
534 /* FIXME: this is a memory leak */
535 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
536 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
537 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
539 strcpy(szDescription, desc.szDesc);
540 strcpy(szModule, desc.szDrvName);
541 strcpy(szInterface, "Interface");
543 ppd->Description = szDescription;
544 ppd->Module = szModule;
545 ppd->Interface = szInterface;
546 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
547 if (err == DS_OK && drv)
548 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
551 WARN("waveInMessage failed\n");
552 return E_PROP_ID_UNSUPPORTED;
557 WARN("waveOutMessage failed\n");
558 return E_PROP_ID_UNSUPPORTED;
564 *pcbReturned = cbPropData;
565 TRACE("*pcbReturned=%ld\n", *pcbReturned);
571 static HRESULT WINAPI DSPROPERTY_DescriptionW(
577 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA) pPropData;
580 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
581 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
583 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
584 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
585 /* default device of type specified by ppd->DataFlow */
586 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
587 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
588 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
589 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
591 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
593 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
594 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
595 return E_PROP_ID_UNSUPPORTED;
598 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
599 GetDeviceID(&ppd->DeviceId, &dev_guid);
601 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
602 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
605 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
606 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
607 wodn = waveOutGetNumDevs();
608 for (wod = 0; wod < wodn; wod++) {
609 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
611 if (IsEqualGUID( &dev_guid, &guid) ) {
613 ppd->WaveDeviceId = wod;
614 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
616 PIDSDRIVER drv = NULL;
617 /* FIXME: this is a memory leak */
618 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
619 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
620 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
622 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
623 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
624 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
626 ppd->Description = wDescription;
627 ppd->Module = wModule;
628 ppd->Interface = wInterface;
629 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
630 if (err == DS_OK && drv)
631 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
634 WARN("waveOutMessage failed\n");
635 return E_PROP_ID_UNSUPPORTED;
639 WARN("waveOutMessage failed\n");
640 return E_PROP_ID_UNSUPPORTED;
643 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
644 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
647 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
648 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
649 widn = waveInGetNumDevs();
650 for (wid = 0; wid < widn; wid++) {
651 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
653 if (IsEqualGUID( &dev_guid, &guid) ) {
655 ppd->WaveDeviceId = wid;
656 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
659 /* FIXME: this is a memory leak */
660 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
661 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
662 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
664 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
665 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
666 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
668 ppd->Description = wDescription;
669 ppd->Module = wModule;
670 ppd->Interface = wInterface;
671 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
672 if (err == DS_OK && drv)
673 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
676 WARN("waveInMessage failed\n");
677 return E_PROP_ID_UNSUPPORTED;
682 WARN("waveInMessage failed\n");
683 return E_PROP_ID_UNSUPPORTED;
687 FIXME("DeviceId=Unknown\n");
688 return E_PROP_ID_UNSUPPORTED;
692 *pcbReturned = cbPropData;
693 TRACE("*pcbReturned=%ld\n", *pcbReturned);
699 static HRESULT WINAPI DSPROPERTY_Enumerate1(
705 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
706 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
707 return E_PROP_ID_UNSUPPORTED;
710 static HRESULT WINAPI DSPROPERTY_EnumerateA(
716 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA) pPropData;
718 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
719 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
721 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
724 unsigned devs, wod, wid;
727 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
729 devs = waveOutGetNumDevs();
730 for (wod = 0; wod < devs; ++wod) {
731 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
733 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
735 memset(&data, 0, sizeof(data));
736 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
737 data.WaveDeviceId = wod;
738 data.DeviceId = guid;
739 data.Description = desc.szDesc;
740 data.Module = desc.szDrvName;
741 data.Interface = "Interface";
742 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
743 (ppd->Callback)(&data, ppd->Context);
748 devs = waveInGetNumDevs();
749 for (wid = 0; wid < devs; ++wid) {
750 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
752 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
754 memset(&data, 0, sizeof(data));
755 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
756 data.WaveDeviceId = wid;
757 data.DeviceId = guid;
758 data.Description = desc.szDesc;
759 data.Module = desc.szDrvName;
760 data.Interface = "Interface";
761 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
762 (ppd->Callback)(&data, ppd->Context);
771 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
776 FIXME("*pcbReturned=%ld\n", *pcbReturned);
779 return E_PROP_ID_UNSUPPORTED;
782 static HRESULT WINAPI DSPROPERTY_EnumerateW(
788 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA) pPropData;
790 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
791 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
793 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
796 unsigned devs, wod, wid;
799 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
801 devs = waveOutGetNumDevs();
802 for (wod = 0; wod < devs; ++wod) {
803 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
805 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
807 /* FIXME: this is a memory leak */
808 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
809 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
810 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
812 memset(&data, 0, sizeof(data));
813 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
814 data.WaveDeviceId = wod;
815 data.DeviceId = guid;
817 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
818 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
819 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
821 data.Description = wDescription;
822 data.Module = wModule;
823 data.Interface = wInterface;
824 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
825 (ppd->Callback)(&data, ppd->Context);
830 devs = waveInGetNumDevs();
831 for (wid = 0; wid < devs; ++wid) {
832 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
834 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
836 /* FIXME: this is a memory leak */
837 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
838 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
839 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
841 memset(&data, 0, sizeof(data));
842 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
843 data.WaveDeviceId = wid;
844 data.DeviceId = guid;
846 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
847 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
848 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
850 data.Description = wDescription;
851 data.Module = wModule;
852 data.Interface = wInterface;
853 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
854 (ppd->Callback)(&data, ppd->Context);
863 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
868 FIXME("*pcbReturned=%ld\n", *pcbReturned);
871 return E_PROP_ID_UNSUPPORTED;
874 static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
875 LPKSPROPERTYSET iface,
878 LPVOID pInstanceData,
879 ULONG cbInstanceData,
884 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
885 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
886 This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
888 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
890 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
891 return DSPROPERTY_WaveDeviceMappingA(guidPropSet,pPropData,cbPropData,pcbReturned);
892 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
893 return DSPROPERTY_Description1(guidPropSet,pPropData,cbPropData,pcbReturned);
894 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
895 return DSPROPERTY_Enumerate1(guidPropSet,pPropData,cbPropData,pcbReturned);
896 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
897 return DSPROPERTY_WaveDeviceMappingW(guidPropSet,pPropData,cbPropData,pcbReturned);
898 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
899 return DSPROPERTY_DescriptionA(guidPropSet,pPropData,cbPropData,pcbReturned);
900 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
901 return DSPROPERTY_DescriptionW(guidPropSet,pPropData,cbPropData,pcbReturned);
902 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
903 return DSPROPERTY_EnumerateA(guidPropSet,pPropData,cbPropData,pcbReturned);
904 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
905 return DSPROPERTY_EnumerateW(guidPropSet,pPropData,cbPropData,pcbReturned);
907 FIXME("unsupported ID: %ld\n",dwPropID);
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 IKsPrivatePropertySetImpl_Set(
923 LPKSPROPERTYSET iface,
926 LPVOID pInstanceData,
927 ULONG cbInstanceData,
931 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
933 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
934 return E_PROP_ID_UNSUPPORTED;
937 static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
938 LPKSPROPERTYSET iface,
941 PULONG pTypeSupport )
943 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
944 TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
946 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
948 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
949 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
951 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
952 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
954 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
955 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
957 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
958 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
960 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
961 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
963 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
964 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
966 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
967 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
969 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
970 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
973 FIXME("unsupported ID: %ld\n",dwPropID);
977 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
980 return E_PROP_ID_UNSUPPORTED;
983 static ICOM_VTABLE(IKsPropertySet) ikspvt = {
984 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
985 IKsPrivatePropertySetImpl_QueryInterface,
986 IKsPrivatePropertySetImpl_AddRef,
987 IKsPrivatePropertySetImpl_Release,
988 IKsPrivatePropertySetImpl_Get,
989 IKsPrivatePropertySetImpl_Set,
990 IKsPrivatePropertySetImpl_QuerySupport
993 HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
994 IKsPrivatePropertySetImpl **piks)
996 IKsPrivatePropertySetImpl *iks;
998 iks = (IKsPrivatePropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
1000 iks->lpVtbl = &ikspvt;