1 commit 96c65dc2f2885f2548cf50f5912bd9ca6d9189c0
2 Author: Maarten Lankhorst <m.b.lankhorst@gmail.com>
3 Date: Fri Apr 8 02:03:28 2011 +0200
5 dsound: Use mmdevice apis for enumerating capture devices
7 diff --git a/dlls/dsound/Makefile.in b/dlls/dsound/Makefile.in
8 index 58b1998..8258637 100644
9 --- a/dlls/dsound/Makefile.in
10 +++ b/dlls/dsound/Makefile.in
14 -IMPORTS = dxguid uuid winmm ole32 advapi32
15 +IMPORTS = dxguid uuid winmm ole32 advapi32 user32
19 diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
20 index 174355a..6e6456b 100644
21 --- a/dlls/dsound/capture.c
22 +++ b/dlls/dsound/capture.c
23 @@ -1038,8 +1038,7 @@ static HRESULT DirectSoundCaptureDevice_Initialize(
26 HRESULT err = DSERR_INVALIDPARAM;
28 - BOOLEAN found = FALSE;
29 + unsigned wid = 0, widn;
31 DirectSoundCaptureDevice *device = *ppDevice;
32 TRACE("(%p, %s)\n", ppDevice, debugstr_guid(lpcGUID));
33 @@ -1060,18 +1059,6 @@ static HRESULT DirectSoundCaptureDevice_Initialize(
36 /* enumerate WINMM audio devices and find the one we want */
37 - for (wid=0; wid<widn; wid++) {
38 - if (IsEqualGUID( &devGUID, &DSOUND_capture_guids[wid]) ) {
44 - if (found == FALSE) {
45 - WARN("No device found matching given ID!\n");
46 - return DSERR_NODRIVER;
49 if (DSOUND_capture[wid]) {
50 WARN("already in use\n");
51 return DSERR_ALLOCATED;
52 diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c
53 index 81dd7dd..1ee8a8f 100644
54 --- a/dlls/dsound/dsound_main.c
55 +++ b/dlls/dsound/dsound_main.c
64 +#include "shobjidl.h"
72 #include "dsound_private.h"
74 WINE_DEFAULT_DEBUG_CHANNEL(dsound);
76 +static IMMDeviceEnumerator *mme = NULL;
78 +static CALLBACK DWORD DSOUND_mmdevapi_thread(void *data)
82 + IMMDeviceEnumerator *mymme = NULL;
83 + CoInitializeEx(NULL, COINIT_MULTITHREADED);
84 + PeekMessageW(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
85 + hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mymme);
88 + SetEvent((HANDLE)data);
91 + ERR("Cannot use mmdevapi: %08x\n", hr);
94 + while (GetMessageW(&msg, NULL, 0, 0))
98 + DispatchMessageW(&msg);
101 + ERR("Unknown message: %04x\n", msg.message);
105 + IMMDeviceEnumerator_Release(mme);
111 +static HANDLE DSOUND_mmdevapi_thread_handle;
112 +static DWORD DSOUND_mmdevapi_id;
114 +CRITICAL_SECTION mme_crst;
115 +static CRITICAL_SECTION_DEBUG mme_crst_debug =
118 + { &mme_crst_debug.ProcessLocksList,
119 + &mme_crst_debug.ProcessLocksList },
120 + 0, 0, { (DWORD_PTR)(__FILE__ ": mme_crst_debug") }
122 +CRITICAL_SECTION mme_crst = { &mme_crst_debug, -1, 0, 0, 0, 0 };
124 +IMMDeviceEnumerator *DSOUND_obtain_mme(void)
126 + EnterCriticalSection(&mme_crst);
127 + if (!DSOUND_mmdevapi_id)
129 + HANDLE ev = CreateEventW(0, 0, 0, 0);
130 + DSOUND_mmdevapi_thread_handle = CreateThread(0, 0, DSOUND_mmdevapi_thread, ev, 0, &DSOUND_mmdevapi_id);
131 + WaitForSingleObject(ev, INFINITE);
134 + LeaveCriticalSection(&mme_crst);
138 +HRESULT DSOUND_obtain_immdevice(EDataFlow flow, const GUID *guid, ERole role, IMMDevice **dev)
140 + IMMDeviceCollection *col;
144 + if (!DSOUND_obtain_mme())
145 + return DSERR_NODRIVER;
146 + if (flow == eCapture && (IsEqualGUID(guid, &DSDEVID_DefaultVoiceCapture) ||
147 + IsEqualGUID(guid, &DSDEVID_DefaultCapture)))
148 + return IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, flow, role, dev);
149 + if (flow == eRender && (IsEqualGUID(guid, &DSDEVID_DefaultVoicePlayback) ||
150 + IsEqualGUID(guid, &DSDEVID_DefaultPlayback)))
151 + return IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, flow, role, dev);
152 + hr = IMMDeviceEnumerator_EnumAudioEndpoints(mme, flow, DEVICE_STATE_ACTIVE, &col);
155 + while (SUCCEEDED(IMMDeviceCollection_Item(col, i++, dev)))
157 + hr = DSOUND_immdevice_getguid(*dev, &curguid);
158 + if (SUCCEEDED(hr) && IsEqualGUID(&curguid, guid))
160 + IMMDeviceCollection_Release(col);
163 + IMMDevice_Release(*dev);
165 + IMMDeviceCollection_Release(col);
170 +HRESULT DSOUND_enumerate_immdevice(EDataFlow flow, IMMDeviceCollection **collection)
172 + if (!DSOUND_obtain_mme())
173 + return DSERR_NODRIVER;
174 + return IMMDeviceEnumerator_EnumAudioEndpoints(mme, flow, DEVICE_STATE_ACTIVE, collection);
177 +HRESULT DSOUND_immdevice_getguid(IMMDevice *dev, GUID *guid)
179 + IPropertyStore *store;
180 + PROPVARIANT pv = { VT_EMPTY };
182 + hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &store);
185 + hr = IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_GUID, &pv);
188 + IPropertyStore_Release(store);
191 + CLSIDFromString(pv.u.pwszVal, guid);
192 + PropVariantClear(&pv);
193 + IPropertyStore_Release(store);
197 DirectSoundDevice* DSOUND_renderer[MAXWAVEDRIVERS];
198 GUID DSOUND_renderer_guids[MAXWAVEDRIVERS];
199 -GUID DSOUND_capture_guids[MAXWAVEDRIVERS];
200 +/* Some games keep a pointer to the guid instead of copying the guid itself, so keep a copy here */
201 +static GUID DSOUND_capture_guids[MAXWAVEDRIVERS];
203 HRESULT mmErr(UINT err)
205 @@ -99,7 +229,6 @@ int ds_hw_accel = DS_HW_ACCEL_FULL;
206 int ds_default_sample_rate = 44100;
207 int ds_default_bits_per_sample = 16;
208 static int ds_default_playback;
209 -static int ds_default_capture;
210 static HINSTANCE instance;
213 @@ -178,9 +307,6 @@ void setup_dsound_options(void)
214 if (!get_config_key( hkey, appkey, "MaxShadowSize", buffer, MAX_PATH ))
215 ds_snd_shadow_maxsize = atoi(buffer);
217 - if (!get_config_key( hkey, appkey, "DefaultCapture", buffer, MAX_PATH ))
218 - ds_default_capture = atoi(buffer);
220 if (!get_config_key( hkey, appkey, "DefaultSampleRate", buffer, MAX_PATH ))
221 ds_default_sample_rate = atoi(buffer);
223 @@ -201,7 +327,6 @@ void setup_dsound_options(void)
224 ds_hw_accel==DS_HW_ACCEL_EMULATION ? "Emulation" :
226 TRACE("ds_default_playback = %d\n", ds_default_playback);
227 - TRACE("ds_default_capture = %d\n", ds_default_playback);
228 TRACE("ds_default_sample_rate = %d\n", ds_default_sample_rate);
229 TRACE("ds_default_bits_per_sample = %d\n", ds_default_bits_per_sample);
230 TRACE("ds_snd_shadow_maxsize = %d\n", ds_snd_shadow_maxsize);
231 @@ -242,6 +367,7 @@ static const char * get_device_id(LPCGUID pGuid)
233 HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest)
236 TRACE("(%s,%p)\n", get_device_id(pGuidSrc),pGuidDest);
238 if ( pGuidSrc == NULL) {
239 @@ -262,10 +388,19 @@ HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest)
242 if ( IsEqualGUID( &DSDEVID_DefaultCapture, pGuidSrc ) ||
243 - IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ) {
244 - *pGuidDest = DSOUND_capture_guids[ds_default_capture];
245 - TRACE("returns %s\n", get_device_id(pGuidDest));
247 + IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ) {
248 + ERole role = IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ? eCommunications : eMultimedia;
249 + IMMDevice *dev = NULL;
251 + hr = DSOUND_obtain_immdevice(eCapture, pGuidSrc, role, &dev);
253 + hr = DSOUND_immdevice_getguid(dev, pGuidDest);
255 + IMMDevice_Release(dev);
257 + return DSERR_NODRIVER;
258 + TRACE("returns %s\n", debugstr_guid(pGuidDest));
262 *pGuidDest = *pGuidSrc;
263 @@ -443,63 +578,54 @@ DirectSoundCaptureEnumerateW(
264 LPDSENUMCALLBACKW lpDSEnumCallback,
267 - unsigned devs, wid;
271 - WCHAR wDesc[MAXPNAMELEN];
272 - WCHAR wName[MAXPNAMELEN];
274 + UINT devices = 0, i = 0;
276 + WCHAR wDesc[MAXPNAMELEN] = { 'P','r','i','m','a','r','y',' ',
277 + 'S','o','u','n','d',' ','C','a','p','t','u','r','e',' ','D','r','i','v','e','r',0 };
278 + static const WCHAR wCapDrvName[] = { 'w','i','n','e','m','m','.','d','r','v', 0 };
279 + static const WCHAR wEmptyDrv[] = { 0 };
281 + IPropertyStore *store;
282 + IMMDeviceCollection *col;
283 + PROPVARIANT pv = { VT_EMPTY };
285 TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext );
287 if (lpDSEnumCallback == NULL) {
288 - WARN("invalid parameter: lpDSEnumCallback == NULL\n");
289 + WARN("invalid parameter: lpDSEnumCallback == NULL\n");
290 return DSERR_INVALIDPARAM;
293 - setup_dsound_options();
295 - devs = waveInGetNumDevs();
297 - if (GetDeviceID(&DSDEVID_DefaultCapture, &guid) == DS_OK) {
298 - for (wid = 0; wid < devs; ++wid) {
299 - if (IsEqualGUID( &guid, &DSOUND_capture_guids[wid] ) ) {
300 - err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel));
301 - if (err == DS_OK) {
302 - TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
303 - "Primary Sound Capture Driver",desc.szDrvname,lpContext);
304 - MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1,
305 - wDesc, sizeof(wDesc)/sizeof(WCHAR) );
306 - MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,
307 - wName, sizeof(wName)/sizeof(WCHAR) );
308 - wName[(sizeof(wName)/sizeof(WCHAR)) - 1] = '\0';
310 - if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE)
317 + hr = DSOUND_enumerate_immdevice(eCapture, &col);
319 + return hr == DSERR_NODRIVER ? S_OK : hr;
321 - for (wid = 0; wid < devs; ++wid) {
322 - err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel));
323 - if (err == DS_OK) {
324 - TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
325 - debugstr_guid(&DSOUND_capture_guids[wid]),desc.szDesc,desc.szDrvname,lpContext);
326 - MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,
327 - wDesc, sizeof(wDesc)/sizeof(WCHAR) );
328 - wDesc[(sizeof(wDesc)/sizeof(WCHAR)) - 1] = '\0';
329 + if (FAILED(IMMDeviceCollection_GetCount(col, &devices)) || !devices)
332 - MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,
333 - wName, sizeof(wName)/sizeof(WCHAR) );
334 - wName[(sizeof(wName)/sizeof(WCHAR)) - 1] = '\0';
335 + if (lpDSEnumCallback(NULL, wDesc, wEmptyDrv, lpContext) == FALSE)
338 - if (lpDSEnumCallback(&DSOUND_capture_guids[wid], wDesc, wName, lpContext) == FALSE)
341 + for (i = 0; i < devices; ++i)
343 + IMMDeviceCollection_Item(col, i, &dev);
344 + IMMDevice_OpenPropertyStore(dev, STGM_READ, &store);
345 + IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_GUID, &pv);
346 + CLSIDFromString(pv.u.pwszVal, &DSOUND_capture_guids[i]);
347 + PropVariantClear(&pv);
348 + IPropertyStore_GetValue(store, (const PROPERTYKEY*) &DEVPKEY_Device_FriendlyName, &pv);
349 + lstrcpynW(wDesc, pv.u.pwszVal, sizeof(wDesc)/sizeof(*wDesc));
350 + PropVariantClear(&pv);
351 + IPropertyStore_Release(store);
352 + IMMDevice_Release(dev);
354 + if (lpDSEnumCallback(&DSOUND_capture_guids[i], wDesc, wCapDrvName, lpContext) == FALSE)
359 + IMMDeviceCollection_Release(col);
363 @@ -676,9 +802,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
364 TRACE("DLL_PROCESS_ATTACH\n");
365 for (i = 0; i < MAXWAVEDRIVERS; i++) {
366 DSOUND_renderer[i] = NULL;
367 - DSOUND_capture[i] = NULL;
368 INIT_GUID(DSOUND_renderer_guids[i], 0xbd6dd71a, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);
369 - INIT_GUID(DSOUND_capture_guids[i], 0xbd6dd71b, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);
372 DisableThreadLibraryCalls(hInstDLL);
373 @@ -687,6 +811,11 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
375 case DLL_PROCESS_DETACH:
376 TRACE("DLL_PROCESS_DETACH\n");
379 + IMMDeviceEnumerator_Release(mme);
380 + CloseHandle(DSOUND_mmdevapi_thread_handle);
384 TRACE("UNKNOWN REASON\n");
385 diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
386 index 1410a9c..1270fed 100644
387 --- a/dlls/dsound/dsound_private.h
388 +++ b/dlls/dsound/dsound_private.h
390 #define DS_TIME_RES 2 /* Resolution of multimedia timer */
391 #define DS_TIME_DEL 10 /* Delay of multimedia timer callback, and duration of HEL fragment */
394 +#include "mmdeviceapi.h"
395 +#include "audioclient.h"
397 #include "wine/list.h"
399 /* direct sound hardware acceleration levels */
400 @@ -387,9 +391,11 @@ HRESULT DSOUND_CaptureCreate8(REFIID riid, LPDIRECTSOUNDCAPTURE8 *ppDSC8) DECLSP
401 extern DirectSoundDevice* DSOUND_renderer[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
402 extern GUID DSOUND_renderer_guids[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
404 -extern DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
405 -extern GUID DSOUND_capture_guids[MAXWAVEDRIVERS] DECLSPEC_HIDDEN;
407 HRESULT mmErr(UINT err) DECLSPEC_HIDDEN;
408 void setup_dsound_options(void) DECLSPEC_HIDDEN;
409 const char * dumpCooperativeLevel(DWORD level) DECLSPEC_HIDDEN;
411 +HRESULT DSOUND_obtain_immdevice(EDataFlow flow, const GUID *guid, ERole role, IMMDevice **dev) DECLSPEC_HIDDEN;
412 +HRESULT DSOUND_enumerate_immdevice(EDataFlow flow, IMMDeviceCollection **collection) DECLSPEC_HIDDEN;
413 +HRESULT DSOUND_immdevice_getguid(IMMDevice *dev, GUID *guid) DECLSPEC_HIDDEN;
414 +IMMDeviceEnumerator *DSOUND_obtain_mme(void) DECLSPEC_HIDDEN;
415 diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
416 index e2d0e20..cf52bda 100644
417 --- a/dlls/dsound/propset.c
418 +++ b/dlls/dsound/propset.c
419 @@ -136,17 +136,19 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW(
422 } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
429 + IMMDevice *dev = NULL;
430 TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
432 widn = waveInGetNumDevs();
433 for (wid = 0; wid < widn; wid++) {
436 res = waveInGetDevCapsW(wid, &capsW, sizeof(capsW));
437 if (res == MMSYSERR_NOERROR) {
438 if (lstrcmpW(capsW.szPname, ppd->DeviceName) == 0) {
439 - ppd->DeviceId = DSOUND_capture_guids[wid];
441 TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
442 debugstr_w(ppd->DeviceName));
443 @@ -154,8 +156,26 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW(
447 + res = waveInMessage(UlongToHandle(wid),DRV_QUERYFUNCTIONINSTANCEIDSIZE,(DWORD_PTR)&len,0);
448 + if (res == MMSYSERR_NOTSUPPORTED)
450 + FIXME("No matching winmm device found, assuming winmm doesn't support mmdevapi and falling back to first device\n");
451 + ppd->DeviceId = DSDEVID_DefaultCapture;
454 + data = HeapAlloc(GetProcessHeap(), 0, len);
456 + hr = E_OUTOFMEMORY;
458 + waveInMessage(UlongToHandle(wid),DRV_QUERYFUNCTIONINSTANCEID,(DWORD_PTR)data, len);
460 + hr = IMMDeviceEnumerator_GetDevice(DSOUND_obtain_mme(), data, &dev);
462 + hr = DSOUND_immdevice_getguid(dev, &ppd->DeviceId);
463 + HeapFree(GetProcessHeap(), 0, data);
468 *pcbReturned = cbPropData;
470 @@ -207,6 +227,7 @@ static HRESULT DSPROPERTY_DescriptionW(
472 ULONG wod, wid, wodn, widn;
476 TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
477 pPropData,cbPropData,pcbReturned);
478 @@ -239,22 +260,89 @@ static HRESULT DSPROPERTY_DescriptionW(
479 ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
480 ppd->WaveDeviceId = wod;
482 - else if (!memcmp(&dev_guid, &DSOUND_capture_guids[0], sizeof(GUID)-1)
485 - ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
486 - ppd->WaveDeviceId = wid;
490 - WARN("Device not found\n");
491 - return E_PROP_ID_UNSUPPORTED;
492 + IMMDeviceCollection *col = NULL;
494 + IMMEndpoint *endpoint = 0;
498 + DWORD len = 0, len2;
503 + hr = DSOUND_enumerate_immdevice(eAll, &col);
506 + while (IMMDeviceCollection_Item(col, i++, &dev) == S_OK)
508 + DSOUND_immdevice_getguid(dev, &guid);
509 + if (IsEqualGUID(&guid, &dev_guid))
511 + IMMDevice_Release(dev);
514 + IMMDeviceCollection_Release(col);
516 + return E_PROP_ID_UNSUPPORTED;
517 + IUnknown_QueryInterface(dev, &IID_IMMEndpoint, (void**)&endpoint);
518 + IMMEndpoint_GetDataFlow(endpoint, &flow);
519 + IUnknown_Release(endpoint);
520 + ppd->DataFlow = flow == eCapture ? DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE : DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
521 + IMMDevice_GetId(dev, &str);
522 + IMMDevice_Release(dev);
523 + len = (lstrlenW(str) + 1)*sizeof(WCHAR);
524 + str2 = HeapAlloc(GetProcessHeap(), 0, len);
526 + if (flow == eCapture)
528 + for (i = 0; i < widn; ++i)
530 + res = waveInMessage(UlongToHandle(i),DRV_QUERYFUNCTIONINSTANCEIDSIZE,(DWORD_PTR)&len2,0);
531 + if (res != MMSYSERR_NOERROR || len2 != len)
533 + waveInMessage(UlongToHandle(i),DRV_QUERYFUNCTIONINSTANCEID,(DWORD_PTR)str2, len2);
534 + if (!lstrcmpW(str2, str))
540 + FIXME("No matching winmm device found, assuming winmm doesn't support mmdevapi and falling back to first device\n");
542 + TRACE("No matching winmm device found, assuming winmm doesn't support mmdevapi and falling back to first device\n");
546 + for (i = 0; i < wodn; ++i)
548 + res = waveOutMessage(UlongToHandle(i),DRV_QUERYFUNCTIONINSTANCEIDSIZE,(DWORD_PTR)&len2,0);
549 + if (res != MMSYSERR_NOERROR || len2 != len)
551 + waveOutMessage(UlongToHandle(i),DRV_QUERYFUNCTIONINSTANCEID,(DWORD_PTR)str2, len2);
552 + if (!lstrcmpW(str2, str))
558 + FIXME("No matching winmm device found, assuming winmm doesn't support mmdevapi and falling back to first device\n");
560 + TRACE("No matching winmm device found, assuming winmm doesn't support mmdevapi and falling back to first device\n");
564 + ppd->WaveDeviceId = i;
565 + HeapFree(GetProcessHeap(), 0, str);
566 + CoTaskMemFree(str2);
569 if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER)
570 - err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel);
571 + err = waveOutMessage(UlongToHandle(ppd->WaveDeviceId),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
573 - err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel);
574 + err = waveInMessage(UlongToHandle(ppd->WaveDeviceId),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
576 if (err != MMSYSERR_NOERROR)
578 @@ -295,6 +383,19 @@ static HRESULT DSPROPERTY_DescriptionW(
582 +static BOOL CALLBACK enumerate_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, void *ctx)
584 + PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = ctx;
585 + DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
590 + data.DeviceId = *guid;
591 + DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
592 + return ppd->Callback(&data, ppd->Context);
595 static HRESULT DSPROPERTY_EnumerateW(
598 @@ -303,7 +404,7 @@ static HRESULT DSPROPERTY_EnumerateW(
599 PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
600 DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
604 TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
605 pPropData,cbPropData,pcbReturned);
607 @@ -317,7 +418,6 @@ static HRESULT DSPROPERTY_EnumerateW(
610 wodn = waveOutGetNumDevs();
611 - widn = waveInGetNumDevs();
613 data.DeviceId = DSOUND_renderer_guids[0];
614 for (i = 0; i < wodn; ++i)
615 @@ -337,23 +437,7 @@ static HRESULT DSPROPERTY_EnumerateW(
619 - data.DeviceId = DSOUND_capture_guids[0];
620 - for (i = 0; i < widn; ++i)
623 - data.DeviceId.Data4[7] = i;
624 - hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
627 - ERR("DescriptionW failed!\n");
630 - ret = ppd->Callback(&data, ppd->Context);
631 - HeapFree(GetProcessHeap(), 0, data.Module);
632 - HeapFree(GetProcessHeap(), 0, data.Description);
636 + DirectSoundCaptureEnumerateW(enumerate_callback, ppd);