dsound enumeration patch

Robert Reif reif at earthlink.net
Tue Jul 20 21:00:40 CDT 2004


It seems that TraktorDJStudio2Demo.exe expects device
GUIDs obtained from enumeration to be persistent.  This
doesn't fix the device enumeration problem yet but it is a
step in the right direction.

Save enumerated GUIDs in a global array so they persist
after enumeration.
White space cleanup.
Add tests for opening default devices.
-------------- next part --------------
Index: dlls/dsound/capture.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/capture.c,v
retrieving revision 1.23
diff -u -r1.23 capture.c
--- dlls/dsound/capture.c	17 May 2004 21:08:32 -0000	1.23
+++ dlls/dsound/capture.c	21 Jul 2004 01:45:59 -0000
@@ -80,6 +80,7 @@
 static ICOM_VTABLE(IDirectSoundFullDuplex) dsfdvt;
 
 static IDirectSoundCaptureImpl*       dsound_capture = NULL;
+static GUID                           capture_guids[MAXWAVEDRIVERS];
 
 static const char * captureStateString[] = {
     "STATE_STOPPED",
@@ -216,11 +217,11 @@
     for (wid = 0; wid < devs; ++wid) {
 	err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 	if (err == DS_OK) {
-	    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
+	    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&capture_guids[wid],0));
 	    if (err == DS_OK) {
 		TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
-		    debugstr_guid(&guid),desc.szDesc,desc.szDrvName,lpContext);
-		if (lpDSEnumCallback(&guid, desc.szDesc, desc.szDrvName, lpContext) == FALSE)
+		    debugstr_guid(&capture_guids[wid]),desc.szDesc,desc.szDrvName,lpContext);
+		if (lpDSEnumCallback(&capture_guids[wid], desc.szDesc, desc.szDrvName, lpContext) == FALSE)
 		    return DS_OK;
 	    }
 	} 
@@ -289,15 +290,15 @@
     for (wid = 0; wid < devs; ++wid) {
 	err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 	if (err == DS_OK) {
-	    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
+	    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)&capture_guids[wid],0));
 	    if (err == DS_OK) {
 		TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
-		    debugstr_guid(&DSDEVID_DefaultCapture),desc.szDesc,desc.szDrvName,lpContext);
+		    debugstr_guid(&capture_guids[wid]),desc.szDesc,desc.szDrvName,lpContext);
 		MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, 
 		    wDesc, sizeof(wDesc)/sizeof(WCHAR) );
 		MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, 
 		    wName, sizeof(wName)/sizeof(WCHAR) );
-		if (lpDSEnumCallback((LPGUID)&DSDEVID_DefaultCapture, wDesc, wName, lpContext) == FALSE)
+		if (lpDSEnumCallback((LPGUID)&capture_guids[wid], wDesc, wName, lpContext) == FALSE)
 		    return DS_OK;
 	    }
 	} 
Index: dlls/dsound/dsound_main.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound_main.c,v
retrieving revision 1.102
diff -u -r1.102 dsound_main.c
--- dlls/dsound/dsound_main.c	19 Jul 2004 20:06:22 -0000	1.102
+++ dlls/dsound/dsound_main.c	21 Jul 2004 01:46:00 -0000
@@ -86,6 +86,7 @@
 #define DS_SND_QUEUE_MIN 12 /* min number of fragments to prebuffer */
 
 IDirectSoundImpl*	dsound = NULL;
+static GUID             device_guids[MAXWAVEDRIVERS];
 
 HRESULT mmErr(UINT err)
 {
@@ -222,7 +223,7 @@
     if (ds_snd_queue_min != DS_SND_QUEUE_MIN)
        WARN("ds_snd_queue_min = %d (default=%d)\n",ds_snd_queue_min ,DS_SND_QUEUE_MIN);
     if (ds_hw_accel != DS_HW_ACCEL_FULL)
-	WARN("ds_hw_accel = %s (default=Full)\n", 
+	WARN("ds_hw_accel = %s (default=Full)\n",
 	    ds_hw_accel==DS_HW_ACCEL_FULL ? "Full" :
 	    ds_hw_accel==DS_HW_ACCEL_STANDARD ? "Standard" :
 	    ds_hw_accel==DS_HW_ACCEL_BASIC ? "Basic" :
@@ -234,7 +235,21 @@
 	WARN("ds_default_capture = %d (default=0)\n",ds_default_playback);
 }
 
+const char * get_device_id(LPCGUID pGuid)
+{
+    static char guid[40];
+    if (IsEqualGUID(&DSDEVID_DefaultPlayback, pGuid))
+        return "DSDEVID_DefaultPlayback";
+    else if (IsEqualGUID(&DSDEVID_DefaultVoicePlayback, pGuid))
+        return "DSDEVID_DefaultVoicePlayback";
+    else if (IsEqualGUID(&DSDEVID_DefaultCapture, pGuid))
+        return "DSDEVID_DefaultCapture";
+    else if (IsEqualGUID(&DSDEVID_DefaultVoiceCapture, pGuid))
+        return "DSDEVID_DefaultVoiceCapture";
 
+    strcpy(guid, debugstr_guid(pGuid));
+    return guid;
+}
 
 /***************************************************************************
  * GetDeviceID	[DSOUND.9]
@@ -251,14 +266,14 @@
  *
  * NOTES
  *    pGuidSrc is a valid device GUID or DSDEVID_DefaultPlayback,
- *    DSDEVID_DefaultCapture, DSDEVID_DefaultVoicePlayback, or 
+ *    DSDEVID_DefaultCapture, DSDEVID_DefaultVoicePlayback, or
  *    DSDEVID_DefaultVoiceCapture.
  *    Returns pGuidSrc if pGuidSrc is a valid device or the device
  *    GUID for the specified constants.
  */
 HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest)
 {
-    TRACE("(%p,%p)\n",pGuidSrc,pGuidDest);
+    TRACE("(%s,%p)\n", get_device_id(pGuidSrc),pGuidDest);
 
     if ( pGuidSrc == NULL) {
 	WARN("invalid parameter: pGuidSrc == NULL\n");
@@ -276,6 +291,7 @@
 	int err = mmErr(waveOutMessage((HWAVEOUT)ds_default_playback,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
 	if (err == DS_OK) {
 	    memcpy(pGuidDest, &guid, sizeof(GUID));
+            TRACE("returns %s\n", get_device_id(pGuidDest));
 	    return DS_OK;
 	}
     }
@@ -286,11 +302,13 @@
 	int err = mmErr(waveInMessage((HWAVEIN)ds_default_capture,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
 	if (err == DS_OK) {
 	    memcpy(pGuidDest, &guid, sizeof(GUID));
+            TRACE("returns %s\n", get_device_id(pGuidDest));
 	    return DS_OK;
 	}
     }
 
     memcpy(pGuidDest, pGuidSrc, sizeof(GUID));
+    TRACE("returns %s\n", get_device_id(pGuidDest));
 
     return DS_OK;
 }
@@ -350,11 +368,11 @@
     for (wod = 0; wod < devs; ++wod) {
 	err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 	if (err == DS_OK) {
-	    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
+	    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&device_guids[wod],0));
 	    if (err == DS_OK) {
 		TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
-		    debugstr_guid(&guid),desc.szDesc,desc.szDrvName,lpContext);
-		if (lpDSEnumCallback(&guid, desc.szDesc, desc.szDrvName, lpContext) == FALSE)
+		    debugstr_guid(&device_guids[wod]),desc.szDesc,desc.szDrvName,lpContext);
+		if (lpDSEnumCallback(&device_guids[wod], desc.szDesc, desc.szDrvName, lpContext) == FALSE)
 		    return DS_OK;
 	    }
 	}
@@ -422,15 +440,15 @@
     for (wod = 0; wod < devs; ++wod) {
 	err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 	if (err == DS_OK) {
-	    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&guid,0));
+	    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)&device_guids[wod],0));
 	    if (err == DS_OK) {
 		TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
-		    debugstr_guid(&guid),desc.szDesc,desc.szDrvName,lpContext);
+		    debugstr_guid(&device_guids[wod]),desc.szDesc,desc.szDrvName,lpContext);
 		MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,
 		    wDesc, sizeof(wDesc)/sizeof(WCHAR) );
 		    MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1,
 		    wName, sizeof(wName)/sizeof(WCHAR) );
-		if (lpDSEnumCallback(&guid, wDesc, wName, lpContext) == FALSE)
+		if (lpDSEnumCallback(&device_guids[wod], wDesc, wName, lpContext) == FALSE)
 		    return DS_OK;
 	    }
 	}
@@ -523,7 +541,7 @@
 	return ++(This->ref);
 }
 
-static ULONG WINAPI 
+static ULONG WINAPI
 DSPCF_Release(LPCLASSFACTORY iface) {
 	ICOM_THIS(IClassFactoryImpl,iface);
 	/* static class, won't be  freed */
@@ -531,7 +549,7 @@
 	return --(This->ref);
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSPCF_CreateInstance(
 	LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
 ) {
@@ -553,7 +571,7 @@
 	return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSPCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
 	ICOM_THIS(IClassFactoryImpl,iface);
 	FIXME("(%p)->(%d),stub!\n",This,dolock);
@@ -610,7 +628,7 @@
 	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 	return S_FALSE;
     }
-    
+
     if ( IsEqualCLSID( &CLSID_DirectSoundCapture, rclsid ) ||
 	 IsEqualCLSID( &CLSID_DirectSoundCapture8, rclsid ) ) {
 	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
@@ -622,7 +640,7 @@
 	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 	return S_FALSE;
     }
-    
+
     if ( IsEqualCLSID( &CLSID_DirectSoundFullDuplex, rclsid ) ) {
 	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
 	    *ppv = (LPVOID)&DSOUND_FULLDUPLEX_CF;
@@ -633,7 +651,7 @@
 	    debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 	return S_FALSE;
     }
-    
+
     if ( IsEqualCLSID( &CLSID_DirectSoundPrivate, rclsid ) ) {
 	if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
 	    *ppv = (LPVOID)&DSOUND_PRIVATE_CF;
@@ -651,7 +669,7 @@
 
 
 /*******************************************************************************
- * DllCanUnloadNow [DSOUND.4]  
+ * DllCanUnloadNow [DSOUND.4]
  * Determines whether the DLL is in use.
  *
  * RETURNS
Index: dlls/dsound/dsound_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound_private.h,v
retrieving revision 1.18
diff -u -r1.18 dsound_private.h
--- dlls/dsound/dsound_private.h	19 Jul 2004 20:06:22 -0000	1.18
+++ dlls/dsound/dsound_private.h	21 Jul 2004 01:46:00 -0000
@@ -491,3 +491,5 @@
 
 extern HRESULT mmErr(UINT err);
 extern void setup_dsound_options(void);
+extern const char * get_device_id(LPCGUID pGuid);
+
Index: dlls/dsound/tests/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound.c,v
retrieving revision 1.29
diff -u -r1.29 dsound.c
--- dlls/dsound/tests/dsound.c	19 Jul 2004 20:06:22 -0000	1.29
+++ dlls/dsound/tests/dsound.c	21 Jul 2004 01:46:00 -0000
@@ -50,6 +50,7 @@
     IDirectSound * ds;
     IDirectSound8 * ds8;
 
+    /* try the COM class factory method of creation */
     rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void**)&dso);
     ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
     if (dso) {
@@ -101,8 +102,99 @@
         ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
     }
 
+    /* try with no device specified */
     rc=DirectSoundCreate(NULL,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
+    ok(rc==S_OK,"DirectSoundCreate(NULL) failed: %s\n",DXGetErrorString9(rc));
+    if (dso) {
+        /* Try to Query for objects */
+        rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+        ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(unknown);
+
+        rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+        ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(ds);
+
+        rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+        ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(ds8);
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound_GetCaps(dso,0);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        ZeroMemory(&dscaps, sizeof(dscaps));
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound_GetCaps(dso,&dscaps);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        dscaps.dwSize=sizeof(dscaps);
+
+        /* DSOUND: Running on a certified driver */
+        rc=IDirectSound_GetCaps(dso,&dscaps);
+        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK) {
+            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
+                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
+                  dscaps.dwMaxSecondarySampleRate);
+        }
+
+        ref=IDirectSound_Release(dso);
+        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    }
+
+    /* try with default playback device specified */
+    rc=DirectSoundCreate(&DSDEVID_DefaultPlayback,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultPlayback) failed: %s\n",DXGetErrorString9(rc));
+    if (dso) {
+        /* Try to Query for objects */
+        rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+        ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(unknown);
+
+        rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+        ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(ds);
+
+        rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+        ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(ds8);
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound_GetCaps(dso,0);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        ZeroMemory(&dscaps, sizeof(dscaps));
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound_GetCaps(dso,&dscaps);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        dscaps.dwSize=sizeof(dscaps);
+
+        /* DSOUND: Running on a certified driver */
+        rc=IDirectSound_GetCaps(dso,&dscaps);
+        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK) {
+            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
+                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
+                  dscaps.dwMaxSecondarySampleRate);
+        }
+
+        ref=IDirectSound_Release(dso);
+        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    }
+
+    /* try with default voice playback device specified */
+    rc=DirectSoundCreate(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n",DXGetErrorString9(rc));
     if (dso) {
         /* Try to Query for objects */
         rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
@@ -156,6 +248,7 @@
     IDirectSound * ds;
     IDirectSound8 * ds8;
 
+    /* try the COM class factory method of creation */
     rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void**)&dso);
     ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
     if (dso) {
@@ -207,7 +300,98 @@
         ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
     }
 
+    /* try with no device specified */
     rc=DirectSoundCreate8(NULL,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
+    if (dso) {
+        /* Try to Query for objects */
+        rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(unknown);
+
+        rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(ds);
+
+        rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(ds8);
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound8_GetCaps(dso,0);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        ZeroMemory(&dscaps, sizeof(dscaps));
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound8_GetCaps(dso,&dscaps);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        dscaps.dwSize=sizeof(dscaps);
+
+        /* DSOUND: Running on a certified driver */
+        rc=IDirectSound8_GetCaps(dso,&dscaps);
+        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK) {
+            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
+                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
+                  dscaps.dwMaxSecondarySampleRate);
+        }
+
+        ref=IDirectSound8_Release(dso);
+        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    }
+
+    /* try with default playback device specified */
+    rc=DirectSoundCreate8(&DSDEVID_DefaultPlayback,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
+    if (dso) {
+        /* Try to Query for objects */
+        rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(unknown);
+
+        rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound_Release(ds);
+
+        rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK)
+            IDirectSound8_Release(ds8);
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound8_GetCaps(dso,0);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        ZeroMemory(&dscaps, sizeof(dscaps));
+
+        /* DSOUND: Error: Invalid caps buffer */
+        rc=IDirectSound8_GetCaps(dso,&dscaps);
+        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
+
+        dscaps.dwSize=sizeof(dscaps);
+
+        /* DSOUND: Running on a certified driver */
+        rc=IDirectSound8_GetCaps(dso,&dscaps);
+        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
+        if (rc==DS_OK) {
+            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
+                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
+                  dscaps.dwMaxSecondarySampleRate);
+        }
+
+        ref=IDirectSound8_Release(dso);
+        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    }
+
+    /* try with default voice playback device specified */
+    rc=DirectSoundCreate8(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
     ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
     if (dso) {
         /* Try to Query for objects */


More information about the wine-patches mailing list