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 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
453 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
454 return E_PROP_ID_UNSUPPORTED;
457 static HRESULT WINAPI DSPROPERTY_DescriptionW(
463 PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA) pPropData;
466 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
467 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
469 TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
470 if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
471 /* default device of type specified by ppd->DataFlow */
472 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
473 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
474 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
475 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
477 TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
479 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n",
480 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
481 return E_PROP_ID_UNSUPPORTED;
484 ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
485 GetDeviceID(&ppd->DeviceId, &dev_guid);
487 if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
488 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
491 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
492 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
493 wodn = waveOutGetNumDevs();
494 for (wod = 0; wod < wodn; wod++) {
495 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
497 if (IsEqualGUID( &dev_guid, &guid) ) {
499 ppd->WaveDeviceId = wod;
500 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
502 PIDSDRIVER drv = NULL;
503 /* FIXME: this is a memory leak */
504 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
505 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
506 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
508 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
509 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
510 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
512 ppd->Description = wDescription;
513 ppd->Module = wModule;
514 ppd->Interface = wInterface;
515 err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
516 if (err == DS_OK && drv)
517 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
520 WARN("waveOutMessage failed\n");
521 return E_PROP_ID_UNSUPPORTED;
525 WARN("waveOutMessage failed\n");
526 return E_PROP_ID_UNSUPPORTED;
529 } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
530 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
533 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
534 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
535 widn = waveInGetNumDevs();
536 for (wid = 0; wid < widn; wid++) {
537 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0));
539 if (IsEqualGUID( &dev_guid, &guid) ) {
541 ppd->WaveDeviceId = wid;
542 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
545 /* FIXME: this is a memory leak */
546 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
547 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
548 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
550 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
551 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
552 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
554 ppd->Description = wDescription;
555 ppd->Module = wModule;
556 ppd->Interface = wInterface;
557 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
558 if (err == DS_OK && drv)
559 ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
562 WARN("waveInMessage failed\n");
563 return E_PROP_ID_UNSUPPORTED;
568 WARN("waveInMessage failed\n");
569 return E_PROP_ID_UNSUPPORTED;
573 FIXME("DeviceId=Unknown\n");
574 return E_PROP_ID_UNSUPPORTED;
578 *pcbReturned = cbPropData;
579 TRACE("*pcbReturned=%ld\n", *pcbReturned);
585 static HRESULT WINAPI DSPROPERTY_Enumerate1(
591 FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
592 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
593 return E_PROP_ID_UNSUPPORTED;
596 static HRESULT WINAPI DSPROPERTY_EnumerateA(
602 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA) pPropData;
604 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
605 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
607 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
610 unsigned devs, wod, wid;
613 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
615 devs = waveOutGetNumDevs();
616 for (wod = 0; wod < devs; ++wod) {
617 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
619 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
621 memset(&data, 0, sizeof(data));
622 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
623 data.WaveDeviceId = wod;
624 data.DeviceId = guid;
625 data.Description = desc.szDesc;
626 data.Module = desc.szDrvName;
627 data.Interface = "Interface";
628 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
629 (ppd->Callback)(&data, ppd->Context);
634 devs = waveInGetNumDevs();
635 for (wid = 0; wid < devs; ++wid) {
636 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
638 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
640 memset(&data, 0, sizeof(data));
641 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
642 data.WaveDeviceId = wid;
643 data.DeviceId = guid;
644 data.Description = desc.szDesc;
645 data.Module = desc.szDrvName;
646 data.Interface = "Interface";
647 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
648 (ppd->Callback)(&data, ppd->Context);
657 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
662 FIXME("*pcbReturned=%ld\n", *pcbReturned);
665 return E_PROP_ID_UNSUPPORTED;
668 static HRESULT WINAPI DSPROPERTY_EnumerateW(
674 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA) pPropData;
676 TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
677 debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
679 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
682 unsigned devs, wod, wid;
685 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
687 devs = waveOutGetNumDevs();
688 for (wod = 0; wod < devs; ++wod) {
689 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
691 err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
693 /* FIXME: this is a memory leak */
694 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
695 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
696 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
698 memset(&data, 0, sizeof(data));
699 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
700 data.WaveDeviceId = wod;
701 data.DeviceId = guid;
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 data.Description = wDescription;
708 data.Module = wModule;
709 data.Interface = wInterface;
710 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
711 (ppd->Callback)(&data, ppd->Context);
716 devs = waveInGetNumDevs();
717 for (wid = 0; wid < devs; ++wid) {
718 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
720 err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
722 /* FIXME: this is a memory leak */
723 WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
724 WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
725 WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
727 memset(&data, 0, sizeof(data));
728 data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
729 data.WaveDeviceId = wid;
730 data.DeviceId = guid;
732 MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
733 MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
734 MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
736 data.Description = wDescription;
737 data.Module = wModule;
738 data.Interface = wInterface;
739 TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
740 (ppd->Callback)(&data, ppd->Context);
749 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
754 FIXME("*pcbReturned=%ld\n", *pcbReturned);
757 return E_PROP_ID_UNSUPPORTED;
760 static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
761 LPKSPROPERTYSET iface,
764 LPVOID pInstanceData,
765 ULONG cbInstanceData,
770 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
771 TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
772 This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
774 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
776 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
777 return DSPROPERTY_WaveDeviceMappingA(guidPropSet,pPropData,cbPropData,pcbReturned);
778 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
779 return DSPROPERTY_Description1(guidPropSet,pPropData,cbPropData,pcbReturned);
780 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
781 return DSPROPERTY_Enumerate1(guidPropSet,pPropData,cbPropData,pcbReturned);
782 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
783 return DSPROPERTY_WaveDeviceMappingW(guidPropSet,pPropData,cbPropData,pcbReturned);
784 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
785 return DSPROPERTY_DescriptionA(guidPropSet,pPropData,cbPropData,pcbReturned);
786 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
787 return DSPROPERTY_DescriptionW(guidPropSet,pPropData,cbPropData,pcbReturned);
788 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
789 return DSPROPERTY_EnumerateA(guidPropSet,pPropData,cbPropData,pcbReturned);
790 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
791 return DSPROPERTY_EnumerateW(guidPropSet,pPropData,cbPropData,pcbReturned);
793 FIXME("unsupported ID: %ld\n",dwPropID);
797 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
802 FIXME("*pcbReturned=%ld\n", *pcbReturned);
805 return E_PROP_ID_UNSUPPORTED;
808 static HRESULT WINAPI IKsPrivatePropertySetImpl_Set(
809 LPKSPROPERTYSET iface,
812 LPVOID pInstanceData,
813 ULONG cbInstanceData,
817 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
819 FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
820 return E_PROP_ID_UNSUPPORTED;
823 static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
824 LPKSPROPERTYSET iface,
827 PULONG pTypeSupport )
829 ICOM_THIS(IKsPrivatePropertySetImpl,iface);
830 TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
832 if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
834 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
835 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
837 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
838 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
840 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
841 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
843 case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
844 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
846 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
847 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
849 case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
850 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
852 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
853 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
855 case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
856 *pTypeSupport = KSPROPERTY_SUPPORT_GET;
859 FIXME("unsupported ID: %ld\n",dwPropID);
863 FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
866 return E_PROP_ID_UNSUPPORTED;
869 static ICOM_VTABLE(IKsPropertySet) ikspvt = {
870 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
871 IKsPrivatePropertySetImpl_QueryInterface,
872 IKsPrivatePropertySetImpl_AddRef,
873 IKsPrivatePropertySetImpl_Release,
874 IKsPrivatePropertySetImpl_Get,
875 IKsPrivatePropertySetImpl_Set,
876 IKsPrivatePropertySetImpl_QuerySupport
879 HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
880 IKsPrivatePropertySetImpl **piks)
882 IKsPrivatePropertySetImpl *iks;
884 iks = (IKsPrivatePropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
886 iks->lpVtbl = &ikspvt;