[PATCH 2/2] dsound: Clean up property sets hugely

Maarten Lankhorst m.b.lankhorst at gmail.com
Fri Dec 4 07:09:33 CST 2009


---
 dlls/dsound/propset.c | 1216 +++++++++++--------------------------------------
 1 files changed, 261 insertions(+), 955 deletions(-)

diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
index 3cf65e5..fb9f280 100644
--- a/dlls/dsound/propset.c
+++ b/dlls/dsound/propset.c
@@ -88,69 +88,6 @@ static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
     return ref;
 }
 
-static HRESULT DSPROPERTY_WaveDeviceMappingA(
-    LPVOID pPropData,
-    ULONG cbPropData,
-    PULONG pcbReturned )
-{
-    HRESULT hr = DSERR_INVALIDPARAM;
-    PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd;
-    TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-	  pPropData,cbPropData,pcbReturned);
-
-    ppd = pPropData;
-
-    if (!ppd) {
-	WARN("invalid parameter: pPropData\n");
-	return DSERR_INVALIDPARAM;
-    }
-
-    if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
-        ULONG wod;
-        unsigned int wodn;
-        TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-        wodn = waveOutGetNumDevs();
-        for (wod = 0; wod < wodn; wod++) {
-            WAVEOUTCAPSA capsA;
-            MMRESULT res;
-            res = waveOutGetDevCapsA(wod, &capsA, sizeof(capsA));
-            if (res == MMSYSERR_NOERROR) {
-                if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
-                    ppd->DeviceId = DSOUND_renderer_guids[wod];
-                    hr = DS_OK;
-                    TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
-                          ppd->DeviceName);
-                    break;
-                }
-            }
-        }
-    } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
-        ULONG wid;
-        unsigned int widn;
-        TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-        widn = waveInGetNumDevs();
-        for (wid = 0; wid < widn; wid++) {
-            WAVEINCAPSA capsA;
-            MMRESULT res;
-            res = waveInGetDevCapsA(wid, &capsA, sizeof(capsA));
-            if (res == MMSYSERR_NOERROR) {
-                if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
-                    ppd->DeviceId = DSOUND_capture_guids[wid];
-                    TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
-                          ppd->DeviceName);
-                    hr = DS_OK;
-                    break;
-                }
-            }
-        }
-    }
-
-    if (pcbReturned)
-	*pcbReturned = cbPropData;
-
-    return hr;
-}
-
 static HRESULT DSPROPERTY_WaveDeviceMappingW(
     LPVOID pPropData,
     ULONG cbPropData,
@@ -214,424 +151,39 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW(
     return hr;
 }
 
-static HRESULT DSPROPERTY_Description1(
+static HRESULT DSPROPERTY_WaveDeviceMappingA(
     LPVOID pPropData,
     ULONG cbPropData,
     PULONG pcbReturned )
 {
-    HRESULT err;
-    GUID dev_guid;
-    PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd;
-    TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-	pPropData,cbPropData,pcbReturned);
-
-    ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA) pPropData;
+    DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA *ppd = pPropData;
+    DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA data;
+    DWORD len;
+    HRESULT hr;
 
-    if (!ppd) {
-	WARN("invalid parameter: pPropData\n");
-	return DSERR_INVALIDPARAM;
-    }
-
-    TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
-    if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
-	/* default device of type specified by ppd->DataFlow */
-	if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-	} else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-	} else {
-	    TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
-	}
-	FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
-	      pPropData,cbPropData,pcbReturned);
-	return E_PROP_ID_UNSUPPORTED;
-    }
-
-    ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
-    GetDeviceID(&ppd->DeviceId, &dev_guid);
-
-    if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) ||
-	 IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) {
-	ULONG wod;
-	unsigned int wodn;
-	TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                ppd->WaveDeviceId = wod;
-                ppd->Devnode = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
-                    lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
-                    err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-                    if (err == DS_OK && drv)
-                        ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                    else
-                        WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                    break;
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-                }
-            }
-	}
-    } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
-	        IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
-	ULONG wid;
-	unsigned int widn;
-	TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-	widn = waveInGetNumDevs();
-	for (wid = 0; wid < widn; wid++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
-                DSDRIVERDESC desc;
-                ppd->WaveDeviceId = wid;
-                ppd->Devnode = wid;
-                err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSCDRIVER drv;
-                    lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
-                    lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
-                    err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
-                    if (err == DS_OK && drv)
-                        ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                    else
-                        WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                    break;
-                } else {
-                    WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-                }
-            }
-	}
-    } else {
-	BOOL found = FALSE;
-	ULONG wod;
-	unsigned int wodn;
-	/* given specific device so try the render devices first */
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-                ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-                ppd->WaveDeviceId = wod;
-                ppd->Devnode = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
-                    lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
-                    MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
-                    err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-                    if (err == DS_OK && drv)
-                        ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                    else
-                        WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                    found = TRUE;
-                    break;
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-                }
-            }
-	}
-
-	if (found == FALSE) {
-            ULONG wid;
-            unsigned int widn;
-            /* given specific device so try the capture devices next */
-            widn = waveInGetNumDevs();
-            for (wid = 0; wid < widn; wid++) {
-                if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
-                    DSDRIVERDESC desc;
-                    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-                    ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-                    ppd->WaveDeviceId = wid;
-                    ppd->Devnode = wid;
-                    err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                    if (err == DS_OK) {
-                        PIDSDRIVER drv = NULL;
-                        lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
-                        lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
-                        err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-                        if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                        found = TRUE;
-                        break;
-                    } else {
-                        WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                        return E_PROP_ID_UNSUPPORTED;
-                    }
-                }
-            }
-
-            if (found == FALSE) {
-                WARN("device not found\n");
-                return E_PROP_ID_UNSUPPORTED;
-            }
-	}
-    }
-
-    if (pcbReturned) {
-	*pcbReturned = cbPropData;
-	TRACE("*pcbReturned=%d\n", *pcbReturned);
-    }
-
-    return S_OK;
-}
-
-static HRESULT DSPROPERTY_DescriptionA(
-    LPVOID pPropData,
-    ULONG cbPropData,
-    PULONG pcbReturned )
-{
-    PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = pPropData;
-    HRESULT err;
-    GUID dev_guid;
     TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-	  pPropData,cbPropData,pcbReturned);
+      pPropData,cbPropData,pcbReturned);
 
-    TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
-    if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
-	/* default device of type specified by ppd->DataFlow */
-	if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-	} else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-	} else {
-	    TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
-	}
-	FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
-	      pPropData,cbPropData,pcbReturned);
-	return E_PROP_ID_UNSUPPORTED;
+    if (!ppd || !ppd->DeviceName) {
+        WARN("invalid parameter: ppd=%p\n", ppd);
+        return DSERR_INVALIDPARAM;
     }
 
-    ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
-    GetDeviceID(&ppd->DeviceId, &dev_guid);
-
-    if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
-	 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
-	ULONG wod;
-	unsigned int wodn;
-        if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
-            TRACE("DSDEVID_DefaultPlayback\n");
-        else
-            TRACE("DSDEVID_DefaultVoicePlayback\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                ppd->WaveDeviceId = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    /* FIXME: this is a memory leak */
-                    CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
-                    CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
-                    CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
-                    if (szDescription && szModule && szInterface) {
-                        strcpy(szDescription, desc.szDesc);
-                        strcpy(szModule, desc.szDrvname);
-                        strcpy(szInterface, "Interface");
-
-                        ppd->Description = szDescription;
-                        ppd->Module = szModule;
-                        ppd->Interface = szInterface;
-                        err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-                        if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                        break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, szDescription);
-                        HeapFree(GetProcessHeap(), 0, szModule);
-                        HeapFree(GetProcessHeap(), 0, szInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-	}
-    } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
-	       IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
-	ULONG wid;
-	unsigned int widn;
-        if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) )
-            TRACE("DSDEVID_DefaultCapture\n");
-        else
-            TRACE("DSDEVID_DefaultVoiceCapture\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-	widn = waveInGetNumDevs();
-	for (wid = 0; wid < widn; wid++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
-                DSDRIVERDESC desc;
-                ppd->WaveDeviceId = wid;
-                err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSCDRIVER drv;
-                    /* FIXME: this is a memory leak */
-                    CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
-                    CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
-                    CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
-                    if (szDescription && szModule && szInterface) {
-                        strcpy(szDescription, desc.szDesc);
-                        strcpy(szModule, desc.szDrvname);
-                        strcpy(szInterface, "Interface");
-
-                        ppd->Description = szDescription;
-                        ppd->Module = szModule;
-                        ppd->Interface = szInterface;
-                        err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
-                        if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                        break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, szDescription);
-                        HeapFree(GetProcessHeap(), 0, szModule);
-                        HeapFree(GetProcessHeap(), 0, szInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-	}
-    } else {
-	BOOL found = FALSE;
-	ULONG wod;
-	unsigned int wodn;
-	/* given specific device so try the render devices first */
-        TRACE("Checking renderer devices\n");
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                TRACE("DSOUND_renderer_guids[%d]\n", wod);
-                ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-                ppd->WaveDeviceId = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    /* FIXME: this is a memory leak */
-                    CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
-                    CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
-                    CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
-                    if (szDescription && szModule && szInterface) {
-			strcpy(szDescription, desc.szDesc);
-			strcpy(szModule, desc.szDrvname);
-			strcpy(szInterface, "Interface");
-
-			ppd->Description = szDescription;
-			ppd->Module = szModule;
-			ppd->Interface = szInterface;
-			err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-			if (err == DS_OK && drv)
-				ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-			found = TRUE;
-			break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, szDescription);
-                        HeapFree(GetProcessHeap(), 0, szModule);
-                        HeapFree(GetProcessHeap(), 0, szInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-        }
-
-        if (found == FALSE) {
-            ULONG wid;
-            unsigned int widn;
-            TRACE("Checking capture devices\n");
-            ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-            widn = waveInGetNumDevs();
-            for (wid = 0; wid < widn; wid++) {
-                if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
-                    DSDRIVERDESC desc;
-                    TRACE("DSOUND_capture_guids[%d]\n", wid);
-                    ppd->WaveDeviceId = wid;
-                    err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                    if (err == DS_OK) {
-                        PIDSCDRIVER drv;
-                        /* FIXME: this is a memory leak */
-                        CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
-                        CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
-                        CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
-                        if (szDescription && szModule && szInterface) {
-                            strcpy(szDescription, desc.szDesc);
-                            strcpy(szModule, desc.szDrvname);
-                            strcpy(szInterface, "Interface");
-
-                            ppd->Description = szDescription;
-                            ppd->Module = szModule;
-                            ppd->Interface = szInterface;
-                            err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
-                            if (err == DS_OK && drv)
-                                ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                            else
-                                WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                            found = TRUE;
-                            break;
-                        } else {
-                            WARN("no memory\n");
-                            HeapFree(GetProcessHeap(), 0, szDescription);
-                            HeapFree(GetProcessHeap(), 0, szModule);
-                            HeapFree(GetProcessHeap(), 0, szInterface);
-                            return E_OUTOFMEMORY;
-                        }
-                    } else {
-                        WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                        return E_PROP_ID_UNSUPPORTED;
-                    }
-                }
-            }
-	}
+    data.DataFlow = ppd->DataFlow;
+    len = strlen(ppd->DeviceName)+1;
+    data.DeviceName = HeapAlloc(GetProcessHeap(), 0, len);
+    if (!data.DeviceName)
+        return E_OUTOFMEMORY;
+    MultiByteToWideChar(CP_ACP, 0, ppd->DeviceName, -1, data.DeviceName, len );
 
-	if (found == FALSE) {
-	    WARN("device not found\n");
-	    return E_PROP_ID_UNSUPPORTED;
-	}
-    }
+    hr = DSPROPERTY_WaveDeviceMappingW(&data, cbPropData, pcbReturned);
+    HeapFree(GetProcessHeap(), 0, data.DeviceName);
+    ppd->DeviceId = data.DeviceId;
 
-    if (pcbReturned) {
-	*pcbReturned = cbPropData;
-	TRACE("*pcbReturned=%d\n", *pcbReturned);
-    }
+    if (pcbReturned)
+        *pcbReturned = cbPropData;
 
-    return S_OK;
+    return hr;
 }
 
 static HRESULT DSPROPERTY_DescriptionW(
@@ -642,548 +194,302 @@ static HRESULT DSPROPERTY_DescriptionW(
     PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = pPropData;
     HRESULT err;
     GUID dev_guid;
+    ULONG wod, wid, wodn, widn;
+    DSDRIVERDESC desc;
+
     TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-	  pPropData,cbPropData,pcbReturned);
+          pPropData,cbPropData,pcbReturned);
 
     TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
     if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
-	/* default device of type specified by ppd->DataFlow */
-	if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
-	} else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
-	    TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
-	} else {
-	    TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
-	}
-	FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
-	      pPropData,cbPropData,pcbReturned);
-	return E_PROP_ID_UNSUPPORTED;
+        /* default device of type specified by ppd->DataFlow */
+        if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
+            TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
+            ppd->DeviceId = DSDEVID_DefaultCapture;
+        } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
+            TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
+            ppd->DeviceId = DSDEVID_DefaultPlayback;
+        } else {
+            WARN("DataFlow=Unknown(%d)\n", ppd->DataFlow);
+            return E_PROP_ID_UNSUPPORTED;
+        }
     }
 
-    ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
     GetDeviceID(&ppd->DeviceId, &dev_guid);
 
-    if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
-	 IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
-	ULONG wod;
-	unsigned int wodn;
-        if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
-            TRACE("DSDEVID_DefaultPlayback\n");
-        else
-            TRACE("DSDEVID_DefaultVoicePlayback\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                TRACE("DSOUND_renderer_guids[%d]\n", wod);
-                ppd->WaveDeviceId = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    /* FIXME: this is a memory leak */
-                    WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-                    if (wDescription && wModule && wInterface) {
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-                        MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-                        ppd->Description = wDescription;
-                        ppd->Module = wModule;
-                        ppd->Interface = wInterface;
-                        err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-                        if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                        break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, wDescription);
-                        HeapFree(GetProcessHeap(), 0, wModule);
-                        HeapFree(GetProcessHeap(), 0, wInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-	}
-    } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
-	       IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
-	ULONG wid;
-	unsigned int widn;
-        if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture))
-            TRACE("DSDEVID_DefaultCapture\n");
-        else
-            TRACE("DSDEVID_DefaultVoiceCapture\n");
-	ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-	widn = waveInGetNumDevs();
-	for (wid = 0; wid < widn; wid++) {
-            if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
-                DSDRIVERDESC desc;
-                ppd->WaveDeviceId = wid;
-                err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSCDRIVER drv;
-                    /* FIXME: this is a memory leak */
-                    WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-                    if (wDescription && wModule && wInterface) {
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-                        MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-                        ppd->Description = wDescription;
-                        ppd->Module = wModule;
-                        ppd->Interface = wInterface;
-                        err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
-                        if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-			break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, wDescription);
-                        HeapFree(GetProcessHeap(), 0, wModule);
-                        HeapFree(GetProcessHeap(), 0, wInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-	}
-    } else {
-	BOOL found = FALSE;
-	ULONG wod;
-	unsigned int wodn;
-        TRACE("Checking renderer devices\n");
-	/* given specific device so try the render devices first */
-	wodn = waveOutGetNumDevs();
-	for (wod = 0; wod < wodn; wod++) {
-            if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
-                DSDRIVERDESC desc;
-                TRACE("DSOUND_renderer_guids[%d]\n", wod);
-                ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-                ppd->WaveDeviceId = wod;
-                err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSDRIVER drv = NULL;
-                    /* FIXME: this is a memory leak */
-                    WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-                    WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-                    if (wDescription && wModule && wInterface) {
-			MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-			MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-			MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-			ppd->Description = wDescription;
-			ppd->Module = wModule;
-			ppd->Interface = wInterface;
-			err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
-			if (err == DS_OK && drv)
-                            ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                        else
-                            WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-			found = TRUE;
-			break;
-		    } else {
-                        WARN("no memory\n");
-                        HeapFree(GetProcessHeap(), 0, wDescription);
-                        HeapFree(GetProcessHeap(), 0, wModule);
-                        HeapFree(GetProcessHeap(), 0, wInterface);
-                        return E_OUTOFMEMORY;
-		    }
-                } else {
-                    WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                    return E_PROP_ID_UNSUPPORTED;
-		}
-            }
-        }
+    wodn = waveOutGetNumDevs();
+    widn = waveInGetNumDevs();
+    wid = wod = dev_guid.Data4[7];
+    if (!memcmp(&dev_guid, &DSOUND_renderer_guids[0], sizeof(GUID)-1)
+        && wod < wodn)
+    {
+        ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+        ppd->WaveDeviceId = wod;
+    }
+    else if (!memcmp(&dev_guid, &DSOUND_capture_guids[0], sizeof(GUID)-1)
+             && wid < widn)
+    {
+        ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+        ppd->WaveDeviceId = wid;
+    }
+    else
+    {
+        WARN("Device not found\n");
+        return E_PROP_ID_UNSUPPORTED;
+    }
 
-        if (found == FALSE) {
-            ULONG wid;
-            unsigned int widn;
-            TRACE("Checking capture devices\n");
-            ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-            widn = waveInGetNumDevs();
-            for (wid = 0; wid < widn; wid++) {
-                if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
-                    DSDRIVERDESC desc;
-                    TRACE("DSOUND_capture_guids[%d]\n", wid);
-                    ppd->WaveDeviceId = wid;
-                    err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                    if (err == DS_OK) {
-                        PIDSCDRIVER drv;
-                        /* FIXME: this is a memory leak */
-                        WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
-                        WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-                        WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-                        if (wDescription && wModule && wInterface) {
-                            MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-                            MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-                            MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-                            ppd->Description = wDescription;
-                            ppd->Module = wModule;
-                            ppd->Interface = wInterface;
-                            err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
-                            if (err == DS_OK && drv)
-                                ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
-                            else
-                                WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-                            found = TRUE;
-                            break;
-                        } else {
-                            WARN("no memory\n");
-                            HeapFree(GetProcessHeap(), 0, wDescription);
-                            HeapFree(GetProcessHeap(), 0, wModule);
-                            HeapFree(GetProcessHeap(), 0, wInterface);
-                            return E_OUTOFMEMORY;
-                        }
-                    } else {
-                        WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
-                        return E_PROP_ID_UNSUPPORTED;
-                    }
-                }
-            }
+    if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER)
+        err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
+    else
+        err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
+
+    if (err != MMSYSERR_NOERROR)
+    {
+        WARN("waveMessage(DRV_QUERYDSOUNDDESC) failed!\n");
+        return E_PROP_ID_UNSUPPORTED;
+    }
+    else
+    {
+        /* FIXME: Still a memory leak.. */
+        int desclen, modlen;
+        static WCHAR wInterface[] = { 'I','n','t','e','r','f','a','c','e',0 };
+
+        modlen = strlen(desc.szDrvname)+1;
+        desclen = strlen(desc.szDesc)+1;
+        ppd->Module = HeapAlloc(GetProcessHeap(),0,modlen*sizeof(WCHAR));
+        ppd->Description = HeapAlloc(GetProcessHeap(),0,desclen*sizeof(WCHAR));
+        ppd->Interface = wInterface;
+        if (!ppd->Description || !ppd->Module)
+        {
+            WARN("Out of memory\n");
+            HeapFree(GetProcessHeap(), 0, ppd->Description);
+            HeapFree(GetProcessHeap(), 0, ppd->Module);
+            ppd->Description = ppd->Module = NULL;
+            return E_OUTOFMEMORY;
         }
 
-	if (found == FALSE) {
-	    WARN("device not found\n");
-	    return E_PROP_ID_UNSUPPORTED;
-	}
+        MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->Module, modlen );
+        MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->Description, desclen );
     }
 
+    ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+
     if (pcbReturned) {
-	*pcbReturned = cbPropData;
-	TRACE("*pcbReturned=%d\n", *pcbReturned);
+        *pcbReturned = sizeof(*ppd);
+        TRACE("*pcbReturned=%d\n", *pcbReturned);
     }
 
     return S_OK;
 }
 
-static HRESULT DSPROPERTY_Enumerate1(
+static HRESULT DSPROPERTY_EnumerateW(
     LPVOID pPropData,
     ULONG cbPropData,
     PULONG pcbReturned )
 {
-    PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA) pPropData;
-    HRESULT err;
+    PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
+    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_1_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) {
-                    PIDSCDRIVER drv;
-                    ZeroMemory(&data, sizeof(data));
-                    data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-                    data.WaveDeviceId = wod;
-                    data.DeviceId = DSOUND_renderer_guids[wod];
-                    lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
-                    lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
-                    MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
-                    MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
-                    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);
-                }
-            }
+    if (pcbReturned)
+        *pcbReturned = 0;
 
-            devs = waveInGetNumDevs();
-            for (wid = 0; wid < devs; ++wid) {
-                err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    PIDSCDRIVER drv;
-                    ZeroMemory(&data, sizeof(data));
-                    data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-                    data.WaveDeviceId = wid;
-                    data.DeviceId = DSOUND_capture_guids[wid];
-                    lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
-                    lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
-                    MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
-                    MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
-                    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");
-
-                    TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-                    (ppd->Callback)(&data, ppd->Context);
-                }
-            }
+    if (!ppd || !ppd->Callback)
+    {
+        WARN("Invalid ppd %p\n", ppd);
+        return E_PROP_ID_UNSUPPORTED;
+    }
 
+    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 S_OK;
+}
 
-    return E_PROP_ID_UNSUPPORTED;
+static void DSPROPERTY_descWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *dataW,
+                                DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA *dataA)
+{
+    DWORD modlen, desclen;
+    static char Interface[] = "Interface";
+
+    modlen = lstrlenW(dataW->Module)+1;
+    desclen = lstrlenW(dataW->Description)+1;
+    dataA->Type = dataW->Type;
+    dataA->DataFlow = dataW->DataFlow;
+    dataA->DeviceId = dataW->DeviceId;
+    dataA->WaveDeviceId = dataW->WaveDeviceId;
+    dataA->Interface = Interface;
+    dataA->Module = HeapAlloc(GetProcessHeap(), 0, modlen);
+    dataA->Description = HeapAlloc(GetProcessHeap(), 0, desclen);
+    if (dataA->Module)
+        WideCharToMultiByte(CP_ACP, 0, dataW->Module, -1, dataA->Module, modlen, NULL, NULL);
+    if (dataA->Description)
+        WideCharToMultiByte(CP_ACP, 0, dataW->Description, -1, dataA->Description, desclen, NULL, NULL);
+}
+
+static void DSPROPERTY_descWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *dataW,
+                                DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA *data1)
+{
+    data1->DeviceId = dataW->DeviceId;
+    lstrcpynW(data1->ModuleW, dataW->Module, sizeof(data1->ModuleW)/sizeof(*data1->ModuleW));
+    lstrcpynW(data1->DescriptionW, dataW->Description, sizeof(data1->DescriptionW)/sizeof(*data1->DescriptionW));
+    WideCharToMultiByte(CP_ACP, 0, data1->DescriptionW, -1, data1->DescriptionA, sizeof(data1->DescriptionA), NULL, NULL);
+    WideCharToMultiByte(CP_ACP, 0, data1->ModuleW, -1, data1->ModuleA, sizeof(data1->ModuleA), NULL, NULL);
+    data1->Type = dataW->Type;
+    data1->DataFlow = dataW->DataFlow;
+    data1->WaveDeviceId = data1->Devnode = dataW->WaveDeviceId;
+}
+
+static BOOL CALLBACK DSPROPERTY_enumWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *descW, void *data)
+{
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA descA;
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = data;
+    BOOL ret;
+
+    DSPROPERTY_descWtoA(descW, &descA);
+    ret = ppd->Callback(&descA, ppd->Context);
+    HeapFree(GetProcessHeap(), 0, descA.Module);
+    HeapFree(GetProcessHeap(), 0, descA.Description);
+    return ret;
 }
 
 static HRESULT DSPROPERTY_EnumerateA(
     LPVOID pPropData,
     ULONG cbPropData,
-    PULONG pcbReturned )
+    PULONG pcbReturned)
 {
-    PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = pPropData;
-    HRESULT err;
-    TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-          pPropData,cbPropData,pcbReturned);
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = pPropData;
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
 
-    if (ppd) {
-        if (ppd->Callback) {
-            unsigned devs, wod, wid;
-            DSDRIVERDESC desc;
-            DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_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) {
-                    DWORD size;
-                    err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
-                    if (err == DS_OK) {
-                        WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
-                        if (nameW) {
-                            err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
-                            if (err == DS_OK) {
-                                CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
-                                if (szInterface) {
-                                    PIDSCDRIVER drv;
-                                    ZeroMemory(&data, sizeof(data));
-                                    data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-                                    data.WaveDeviceId = wod;
-                                    data.DeviceId = DSOUND_renderer_guids[wod];
-                                    data.Description = desc.szDesc;
-                                    data.Module = desc.szDrvname;
-                                    WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
-                                    data.Interface = szInterface;
-
-                                    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,szInterface);
-                            }
-                        }
-                        HeapFree(GetProcessHeap(),0,nameW);
-                    }
-                }
-            }
+    if (!ppd || !ppd->Callback)
+    {
+        WARN("Invalid ppd %p\n", ppd);
+        return E_PROP_ID_UNSUPPORTED;
+    }
 
-            devs = waveInGetNumDevs();
-            for (wid = 0; wid < devs; ++wid) {
-                err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
-                if (err == DS_OK) {
-                    DWORD size;
-                    err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
-                    if (err == DS_OK) {
-                        WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
-                        if (nameW) {
-                            err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
-                            if (err == DS_OK) {
-                                CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
-                                if (szInterface) {
-                                    PIDSCDRIVER drv;
-                                    ZeroMemory(&data, sizeof(data));
-                                    data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-                                    data.WaveDeviceId = wid;
-                                    data.DeviceId = DSOUND_capture_guids[wid];
-                                    data.Description = desc.szDesc;
-                                    data.Module = desc.szDrvname;
-                                    WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
-                                    data.Interface = szInterface;
-
-                                    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");
-
-                                    TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-                                    (ppd->Callback)(&data, ppd->Context);
-                                }
-                                HeapFree(GetProcessHeap(),0,szInterface);
-                            }
-                        }
-                        HeapFree(GetProcessHeap(),0,nameW);
-                    }
-                }
-            }
+    data.Callback = DSPROPERTY_enumWtoA;
+    data.Context = ppd;
 
-            return S_OK;
-        }
-    }
+    return DSPROPERTY_EnumerateW(&data, cbPropData, pcbReturned);
+}
 
-    if (pcbReturned) {
-        *pcbReturned = 0;
-        FIXME("*pcbReturned=%d\n", *pcbReturned);
+static BOOL CALLBACK DSPROPERTY_enumWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *descW, void *data)
+{
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA desc1;
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA *ppd = data;
+    BOOL ret;
+
+    DSPROPERTY_descWto1(descW, &desc1);
+    ret = ppd->Callback(&desc1, ppd->Context);
+    return ret;
+}
+
+static HRESULT DSPROPERTY_Enumerate1(
+    LPVOID pPropData,
+    ULONG cbPropData,
+    PULONG pcbReturned)
+{
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA *ppd = pPropData;
+    DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
+
+    if (!ppd || !ppd->Callback)
+    {
+        WARN("Invalid ppd %p\n", ppd);
+        return E_PROP_ID_UNSUPPORTED;
     }
 
-    return E_PROP_ID_UNSUPPORTED;
+    data.Callback = DSPROPERTY_enumWto1;
+    data.Context = ppd;
+
+    return DSPROPERTY_EnumerateW(&data, cbPropData, pcbReturned);
 }
 
-static HRESULT DSPROPERTY_EnumerateW(
+static HRESULT DSPROPERTY_DescriptionA(
     LPVOID pPropData,
     ULONG cbPropData,
-    PULONG pcbReturned )
+    PULONG pcbReturned)
 {
-    PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
-    HRESULT err;
-    TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
-          pPropData,cbPropData,pcbReturned);
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA *ppd = pPropData;
+    HRESULT hr;
 
-    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);
-                }
-            }
+    if (pcbReturned)
+        *pcbReturned = sizeof(*ppd);
+    if (!pPropData)
+        return S_OK;
 
-            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 );
-
-                                    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");
-
-                                    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);
-                }
-            }
+    data.DeviceId = ppd->DeviceId;
+    data.DataFlow = ppd->DataFlow;
+    hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+    if (FAILED(hr))
+        return hr;
+    DSPROPERTY_descWtoA(&data, ppd);
+    HeapFree(GetProcessHeap(), 0, data.Module);
+    HeapFree(GetProcessHeap(), 0, data.Interface);
+    return hr;
+}
 
-            return S_OK;
-        }
-    }
+static HRESULT DSPROPERTY_Description1(
+    LPVOID pPropData,
+    ULONG cbPropData,
+    PULONG pcbReturned)
+{
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+    DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA *ppd = pPropData;
+    HRESULT hr;
 
-    if (pcbReturned) {
-        *pcbReturned = 0;
-        FIXME("*pcbReturned=%d\n", *pcbReturned);
-    }
+    if (pcbReturned)
+        *pcbReturned = sizeof(*ppd);
+    if (!pPropData)
+        return S_OK;
 
-    return E_PROP_ID_UNSUPPORTED;
+    data.DeviceId = ppd->DeviceId;
+    data.DataFlow = ppd->DataFlow;
+    hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+    if (FAILED(hr))
+        return hr;
+    DSPROPERTY_descWto1(&data, ppd);
+    HeapFree(GetProcessHeap(), 0, data.Module);
+    HeapFree(GetProcessHeap(), 0, data.Interface);
+    return hr;
 }
 
 static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
-- 
1.6.5.3




More information about the wine-patches mailing list