[PATCH 3/7] dsound: Clean up DSPROPERTY_EnumerateW
Maarten Lankhorst
m.b.lankhorst at gmail.com
Wed Dec 9 09:58:00 CST 2009
---
dlls/dsound/propset.c | 143 +++++++++++++++----------------------------------
1 files changed, 43 insertions(+), 100 deletions(-)
diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
index d484839..1dd94c4 100644
--- a/dlls/dsound/propset.c
+++ b/dlls/dsound/propset.c
@@ -900,117 +900,60 @@ static HRESULT DSPROPERTY_EnumerateW(
PULONG pcbReturned )
{
PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
- HRESULT err;
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+ BOOL ret;
+ int widn, wodn, i;
TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
pPropData,cbPropData,pcbReturned);
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_renderer_guids[wod];
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-
- data.Description = wDescription;
- data.Module = wModule;
- data.Interface = wInterface;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
- HeapFree(GetProcessHeap(),0,wInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
- }
- }
-
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_capture_guids[wid];
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
+ if (pcbReturned)
+ *pcbReturned = 0;
- data.Description = wDescription;
- data.Module = wModule;
- data.Interface = wInterface;
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ if (!ppd || !ppd->Callback)
+ {
+ WARN("Invalid ppd %p\n", ppd);
+ return E_PROP_ID_UNSUPPORTED;
+ }
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
- HeapFree(GetProcessHeap(),0,wInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
- }
- }
+ wodn = waveOutGetNumDevs();
+ widn = waveInGetNumDevs();
+ data.DeviceId = DSOUND_renderer_guids[0];
+ for (i = 0; i < wodn; ++i)
+ {
+ HRESULT hr;
+ data.DeviceId.Data4[7] = i;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ {
+ ERR("DescriptionW failed!\n");
return S_OK;
}
+ ret = ppd->Callback(&data, ppd->Context);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Description);
+ if (!ret)
+ return S_OK;
}
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
+ data.DeviceId = DSOUND_capture_guids[0];
+ for (i = 0; i < widn; ++i)
+ {
+ HRESULT hr;
+ data.DeviceId.Data4[7] = i;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ {
+ ERR("DescriptionW failed!\n");
+ return S_OK;
+ }
+ ret = ppd->Callback(&data, ppd->Context);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Description);
+ if (!ret)
+ return S_OK;
}
-
- return E_PROP_ID_UNSUPPORTED;
+ return S_OK;
}
static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
--
1.6.5.4
More information about the wine-patches
mailing list