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 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
196 IKsBufferPropertySetImpl_QueryInterface,
197 IKsBufferPropertySetImpl_AddRef,
198 IKsBufferPropertySetImpl_Release,
199 IKsBufferPropertySetImpl_Get,
200 IKsBufferPropertySetImpl_Set,
201 IKsBufferPropertySetImpl_QuerySupport
204 HRESULT WINAPI IKsBufferPropertySetImpl_Create(
205 IDirectSoundBufferImpl *dsb,
206 IKsBufferPropertySetImpl **piks)
208 IKsBufferPropertySetImpl *iks;
209 TRACE("(%p,%p)\n",dsb,piks);
211 iks = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*iks));
215 iks->lpVtbl = &iksbvt;
217 IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
223 HRESULT WINAPI IKsBufferPropertySetImpl_Destroy(
224 IKsBufferPropertySetImpl *piks)
226 TRACE("(%p)\n",piks);
228 while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET)piks) > 0);
233 /*******************************************************************************
234 * IKsPrivatePropertySet
237 /* IUnknown methods */
238 static HRESULT WINAPI IKsPrivatePropertySetImpl_QueryInterface(
239 LPKSPROPERTYSET iface,
243 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
244 TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
247 return DSERR_INVALIDPARAM;
250 static ULONG WINAPI IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface)
252 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
255 TRACE("(%p) ref was %ld\n", This, This->ref);
256 ulReturn = InterlockedIncrement(&This->ref);
260 static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
262 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
265 TRACE("(%p) ref was %ld\n", This, This->ref);
266 ulReturn = InterlockedDecrement(&This->ref);
270 static HRESULT WINAPI DSPROPERTY_WaveDeviceMappingA(
276 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd;
277 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
278 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
280 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA) pPropData;
283 WARN("invalid parameter: pPropData\n");
284 return DSERR_INVALIDPARAM;
287 FIXME("DeviceName=%s\n",ppd->DeviceName);
288 FIXME("DataFlow=%s\n",
289 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
290 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
292 /* FIXME: match the name to a wave device somehow. */
293 ppd->DeviceId = GUID_NULL;
296 *pcbReturned = cbPropData;
297 FIXME("*pcbReturned=%ld\n", *pcbReturned);
303 static HRESULT WINAPI DSPROPERTY_WaveDeviceMappingW(
309 PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd;
310 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) not implemented!\n",
311 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
313 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA) pPropData;
316 WARN("invalid parameter: pPropData\n");
317 return DSERR_INVALIDPARAM;
320 FIXME("DeviceName=%s\n",debugstr_w(ppd->DeviceName));
321 FIXME("DataFlow=%s\n",
322 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "DIRECTSOUNDDEVICE_DATAFLOW_RENDER" :
323 ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ? "DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE" : "UNKNOWN");
325 /* FIXME: match the name to a wave device somehow. */
326 ppd->DeviceId = GUID_NULL;
329 *pcbReturned = cbPropData;
330 FIXME("*pcbReturned=%ld\n", *pcbReturned);
336 static HRESULT WINAPI DSPROPERTY_Description1(
344 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd;
345 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
346 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
348 ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA) pPropData;
351 WARN("invalid parameter: pPropData\n");
352 return DSERR_INVALIDPARAM;
355 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
356 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
357 /* default device of type specified by ppd->DataFlow */
358 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
359 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
360 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
361 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
363 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
365 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
366 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
367 return E_PROP_ID_UNSUPPORTED;
370 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
371 GetDeviceID(&ppd->DeviceId, &dev_guid);
373 if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) ||
374 IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) {
377 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
378 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
379 wodn = waveOutGetNumDevs();
380 for (wod = 0; wod < wodn; wod++) {
381 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
383 if (IsEqualGUID( &dev_guid, &guid) ) {
385 ppd->WaveDeviceId = wod;
387 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
389 PIDSDRIVER drv = NULL;
390 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
391 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
392 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
393 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
394 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
395 if (err == DS_OK && drv)
396 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
399 WARN("waveOutMessage failed\n");
400 return E_PROP_ID_UNSUPPORTED;
404 WARN("waveOutMessage failed\n");
405 return E_PROP_ID_UNSUPPORTED;
408 } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
409 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
412 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
413 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
414 widn = waveInGetNumDevs();
415 for (wid = 0; wid < widn; wid++) {
416 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
418 if (IsEqualGUID( &dev_guid, &guid) ) {
420 ppd->WaveDeviceId = wid;
422 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
425 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
426 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
427 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
428 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
429 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
430 if (err == DS_OK && drv)
431 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
434 WARN("waveInMessage failed\n");
435 return E_PROP_ID_UNSUPPORTED;
440 WARN("waveInMessage failed\n");
441 return E_PROP_ID_UNSUPPORTED;
448 /* given specific device so try the render devices first */
449 wodn = waveOutGetNumDevs();
450 for (wod = 0; wod < wodn; wod++) {
451 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
453 if (IsEqualGUID( &ppd->DeviceId, &guid) ) {
455 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
456 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
457 ppd->WaveDeviceId = wod;
459 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
461 PIDSDRIVER drv = NULL;
462 strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1);
463 strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1);
464 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
465 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
466 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
467 if (err == DS_OK && drv)
468 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
472 WARN("waveOutMessage failed\n");
473 return E_PROP_ID_UNSUPPORTED;
477 WARN("waveOutMessage failed\n");
478 return E_PROP_ID_UNSUPPORTED;
482 if (found == FALSE) {
483 WARN("device not found\n");
484 return E_PROP_ID_UNSUPPORTED;
489 *pcbReturned = cbPropData;
490 TRACE("*pcbReturned=%ld\n", *pcbReturned);
496 static HRESULT WINAPI DSPROPERTY_DescriptionA(
502 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA) pPropData;
505 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
506 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
508 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
509 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
510 /* default device of type specified by ppd->DataFlow */
511 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
512 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
513 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
514 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
516 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
518 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
519 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
520 return E_PROP_ID_UNSUPPORTED;
523 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
524 GetDeviceID(&ppd->DeviceId, &dev_guid);
526 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
527 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
530 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
531 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
532 wodn = waveOutGetNumDevs();
533 for (wod = 0; wod < wodn; wod++) {
534 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
536 if (IsEqualGUID( &dev_guid, &guid) ) {
538 ppd->WaveDeviceId = wod;
539 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
541 PIDSDRIVER drv = NULL;
542 /* FIXME: this is a memory leak */
543 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
544 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
545 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
547 strcpy(szDescription, desc.szDesc);
548 strcpy(szModule, desc.szDrvName);
549 strcpy(szInterface, "Interface");
551 ppd->Description = szDescription;
552 ppd->Module = szModule;
553 ppd->Interface = szInterface;
554 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
555 if (err == DS_OK && drv)
556 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
559 WARN("waveOutMessage failed\n");
560 return E_PROP_ID_UNSUPPORTED;
564 WARN("waveOutMessage failed\n");
565 return E_PROP_ID_UNSUPPORTED;
568 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
569 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
572 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
573 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
574 widn = waveInGetNumDevs();
575 for (wid = 0; wid < widn; wid++) {
576 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
578 if (IsEqualGUID( &dev_guid, &guid) ) {
580 ppd->WaveDeviceId = wid;
581 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
584 /* FIXME: this is a memory leak */
585 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
586 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
587 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
589 strcpy(szDescription, desc.szDesc);
590 strcpy(szModule, desc.szDrvName);
591 strcpy(szInterface, "Interface");
593 ppd->Description = szDescription;
594 ppd->Module = szModule;
595 ppd->Interface = szInterface;
596 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
597 if (err == DS_OK && drv)
598 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
601 WARN("waveInMessage failed\n");
602 return E_PROP_ID_UNSUPPORTED;
607 WARN("waveOutMessage failed\n");
608 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 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
620 if (IsEqualGUID( &ppd->DeviceId, &guid) ) {
622 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
623 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
624 ppd->WaveDeviceId = wod;
625 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
627 PIDSDRIVER drv = NULL;
628 /* FIXME: this is a memory leak */
629 CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
630 CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvName) + 1);
631 CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
633 strcpy(szDescription, desc.szDesc);
634 strcpy(szModule, desc.szDrvName);
635 strcpy(szInterface, "Interface");
637 ppd->Description = szDescription;
638 ppd->Module = szModule;
639 ppd->Interface = szInterface;
640 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
641 if (err == DS_OK && drv)
642 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
646 WARN("waveOutMessage failed\n");
647 return E_PROP_ID_UNSUPPORTED;
651 WARN("waveOutMessage failed\n");
652 return E_PROP_ID_UNSUPPORTED;
656 if (found == FALSE) {
657 WARN("device not found\n");
658 return E_PROP_ID_UNSUPPORTED;
663 *pcbReturned = cbPropData;
664 TRACE("*pcbReturned=%ld\n", *pcbReturned);
670 static HRESULT WINAPI DSPROPERTY_DescriptionW(
676 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA) pPropData;
679 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
680 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
682 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
683 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
684 /* default device of type specified by ppd->DataFlow */
685 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
686 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
687 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
688 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
690 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
692 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
693 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
694 return E_PROP_ID_UNSUPPORTED;
697 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
698 GetDeviceID(&ppd->DeviceId, &dev_guid);
700 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
701 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
704 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
705 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
706 wodn = waveOutGetNumDevs();
707 for (wod = 0; wod < wodn; wod++) {
708 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
710 if (IsEqualGUID( &dev_guid, &guid) ) {
712 ppd->WaveDeviceId = wod;
713 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
715 PIDSDRIVER drv = NULL;
716 /* FIXME: this is a memory leak */
717 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
718 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
719 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
721 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
722 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
723 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
725 ppd->Description = wDescription;
726 ppd->Module = wModule;
727 ppd->Interface = wInterface;
728 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
729 if (err == DS_OK && drv)
730 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
733 WARN("waveOutMessage failed\n");
734 return E_PROP_ID_UNSUPPORTED;
738 WARN("waveOutMessage failed\n");
739 return E_PROP_ID_UNSUPPORTED;
742 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
743 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
746 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
747 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
748 widn = waveInGetNumDevs();
749 for (wid = 0; wid < widn; wid++) {
750 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
752 if (IsEqualGUID( &dev_guid, &guid) ) {
754 ppd->WaveDeviceId = wid;
755 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
758 /* FIXME: this is a memory leak */
759 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
760 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
761 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
763 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
764 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
765 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
767 ppd->Description = wDescription;
768 ppd->Module = wModule;
769 ppd->Interface = wInterface;
770 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
771 if (err == DS_OK && drv)
772 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
775 WARN("waveInMessage failed\n");
776 return E_PROP_ID_UNSUPPORTED;
781 WARN("waveInMessage failed\n");
782 return E_PROP_ID_UNSUPPORTED;
789 /* given specific device so try the render devices first */
790 wodn = waveOutGetNumDevs();
791 for (wod = 0; wod < wodn; wod++) {
792 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
794 if (IsEqualGUID( &ppd->DeviceId, &guid) ) {
796 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
797 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
798 ppd->WaveDeviceId = wod;
799 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
801 PIDSDRIVER drv = NULL;
802 /* FIXME: this is a memory leak */
803 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
804 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
805 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
807 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
808 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
809 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
811 ppd->Description = wDescription;
812 ppd->Module = wModule;
813 ppd->Interface = wInterface;
814 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
815 if (err == DS_OK && drv)
816 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
820 WARN("waveOutMessage failed\n");
821 return E_PROP_ID_UNSUPPORTED;
825 WARN("waveOutMessage failed\n");
826 return E_PROP_ID_UNSUPPORTED;
830 if (found == FALSE) {
831 WARN("device not found\n");
832 return E_PROP_ID_UNSUPPORTED;
837 *pcbReturned = cbPropData;
838 TRACE("*pcbReturned=%ld\n", *pcbReturned);
844 static HRESULT WINAPI DSPROPERTY_Enumerate1(
850 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
851 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
852 return E_PROP_ID_UNSUPPORTED;
855 static HRESULT WINAPI DSPROPERTY_EnumerateA(
861 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA) pPropData;
863 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
864 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
866 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
869 unsigned devs, wod, wid;
872 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
874 devs = waveOutGetNumDevs();
875 for (wod = 0; wod < devs; ++wod) {
876 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
878 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
880 memset(&data, 0, sizeof(data));
881 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
882 data.WaveDeviceId = wod;
883 data.DeviceId = guid;
884 data.Description = desc.szDesc;
885 data.Module = desc.szDrvName;
886 data.Interface = "Interface";
887 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
888 (ppd->Callback)(&data, ppd->Context);
893 devs = waveInGetNumDevs();
894 for (wid = 0; wid < devs; ++wid) {
895 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
897 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
899 memset(&data, 0, sizeof(data));
900 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
901 data.WaveDeviceId = wid;
902 data.DeviceId = guid;
903 data.Description = desc.szDesc;
904 data.Module = desc.szDrvName;
905 data.Interface = "Interface";
906 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
907 (ppd->Callback)(&data, ppd->Context);
916 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
921 FIXME("*pcbReturned=%ld\n", *pcbReturned);
924 return E_PROP_ID_UNSUPPORTED;
927 static HRESULT WINAPI DSPROPERTY_EnumerateW(
933 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA) pPropData;
935 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
936 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
938 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
941 unsigned devs, wod, wid;
944 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
946 devs = waveOutGetNumDevs();
947 for (wod = 0; wod < devs; ++wod) {
948 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
950 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
952 /* FIXME: this is a memory leak */
953 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
954 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
955 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
957 memset(&data, 0, sizeof(data));
958 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
959 data.WaveDeviceId = wod;
960 data.DeviceId = guid;
962 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
963 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
964 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
966 data.Description = wDescription;
967 data.Module = wModule;
968 data.Interface = wInterface;
969 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
970 (ppd->Callback)(&data, ppd->Context);
975 devs = waveInGetNumDevs();
976 for (wid = 0; wid < devs; ++wid) {
977 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
979 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
981 /* FIXME: this is a memory leak */
982 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
983 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
984 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
986 memset(&data, 0, sizeof(data));
987 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
988 data.WaveDeviceId = wid;
989 data.DeviceId = guid;
991 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
992 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
993 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
995 data.Description = wDescription;
996 data.Module = wModule;
997 data.Interface = wInterface;
998 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
999 (ppd->Callback)(&data, ppd->Context);
1008 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
1013 FIXME("*pcbReturned=%ld\n", *pcbReturned);
1016 return E_PROP_ID_UNSUPPORTED;
1019 static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
1020 LPKSPROPERTYSET iface,
1021 REFGUID guidPropSet,
1023 LPVOID pInstanceData,
1024 ULONG cbInstanceData,
1029 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
1030 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
1031 This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
1033 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
1035 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
1036 return DSPROPERTY_WaveDeviceMappingA(guidPropSet,pPropData,cbPropData,pcbReturned);
1037 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
1038 return DSPROPERTY_Description1(guidPropSet,pPropData,cbPropData,pcbReturned);
1039 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
1040 return DSPROPERTY_Enumerate1(guidPropSet,pPropData,cbPropData,pcbReturned);
1041 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
1042 return DSPROPERTY_WaveDeviceMappingW(guidPropSet,pPropData,cbPropData,pcbReturned);
1043 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
1044 return DSPROPERTY_DescriptionA(guidPropSet,pPropData,cbPropData,pcbReturned);
1045 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
1046 return DSPROPERTY_DescriptionW(guidPropSet,pPropData,cbPropData,pcbReturned);
1047 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
1048 return DSPROPERTY_EnumerateA(guidPropSet,pPropData,cbPropData,pcbReturned);
1049 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
1050 return DSPROPERTY_EnumerateW(guidPropSet,pPropData,cbPropData,pcbReturned);
1052 FIXME("unsupported ID: %ld\n",dwPropID);
1056 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
1061 FIXME("*pcbReturned=%ld\n", *pcbReturned);
1064 return E_PROP_ID_UNSUPPORTED;
1067 static HRESULT WINAPI IKsPrivatePropertySetImpl_Set(
1068 LPKSPROPERTYSET iface,
1069 REFGUID guidPropSet,
1071 LPVOID pInstanceData,
1072 ULONG cbInstanceData,
1076 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
1078 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
1079 return E_PROP_ID_UNSUPPORTED;
1082 static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
1083 LPKSPROPERTYSET iface,
1084 REFGUID guidPropSet,
1086 PULONG pTypeSupport )
1088 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
1089 TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
1091 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
1093 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
1094 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1096 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
1097 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1099 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
1100 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1102 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
1103 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1105 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
1106 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1108 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
1109 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1111 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
1112 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1114 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
1115 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
1118 FIXME("unsupported ID: %ld\n",dwPropID);
1122 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
1125 return E_PROP_ID_UNSUPPORTED;
1128 static IKsPropertySetVtbl ikspvt = {
1129 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1130 IKsPrivatePropertySetImpl_QueryInterface,
1131 IKsPrivatePropertySetImpl_AddRef,
1132 IKsPrivatePropertySetImpl_Release,
1133 IKsPrivatePropertySetImpl_Get,
1134 IKsPrivatePropertySetImpl_Set,
1135 IKsPrivatePropertySetImpl_QuerySupport
1138 HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
1139 IKsPrivatePropertySetImpl **piks)
1141 IKsPrivatePropertySetImpl *iks;
1143 iks = HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
1145 iks->lpVtbl = &ikspvt;