[DSOUND] capture tests

Robert Reif reif at earthlink.net
Sat Jun 4 08:51:27 CDT 2005


Add tests to check DirectSoundCapture creation.
Fix dsound/capture.c to pass tests.
-------------- next part --------------
Index: dlls/dsound/capture.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/capture.c,v
retrieving revision 1.50
diff -p -u -r1.50 capture.c
--- dlls/dsound/capture.c	4 Jun 2005 09:38:14 -0000	1.50
+++ dlls/dsound/capture.c	4 Jun 2005 13:46:46 -0000
@@ -91,7 +91,6 @@ HRESULT WINAPI IDirectSoundCaptureImpl_C
 }
 
 HRESULT WINAPI DSOUND_CaptureCreate(
-    
     LPDIRECTSOUNDCAPTURE *ppDSC,
     IUnknown *pUnkOuter)
 {
@@ -254,7 +253,7 @@ static HRESULT DirectSoundCaptureDevice_
 {
     DirectSoundCaptureDevice * device;
     TRACE("(%p)\n", ppDevice);
-                                                                                
+
     /* Allocate memory */
     device = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectSoundCaptureDevice));
 
@@ -457,7 +456,7 @@ IDirectSoundCaptureImpl_QueryInterface(
     REFIID riid,
     LPVOID* ppobj )
 {
-    DirectSoundCaptureDevice *This = ((IDirectSoundCaptureImpl *)iface)->device;
+    IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
     TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
 
     if (ppobj == NULL) {
@@ -467,16 +466,18 @@ IDirectSoundCaptureImpl_QueryInterface(
 
     *ppobj = NULL;
 
-    if (This->driver) {
-	HRESULT	hres;
-        hres = IDsCaptureDriver_QueryInterface(This->driver, riid, ppobj);
-	if (hres != DS_OK)
-	    WARN("IDsCaptureDriver_QueryInterface failed\n");
-	return hres;
+    if (IsEqualIID(riid, &IID_IUnknown)) {
+        IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
+        *ppobj = This;
+        return DS_OK;
+    } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
+        IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
+        *ppobj = This;
+        return DS_OK;
     }
 
     WARN("unsupported riid: %s\n", debugstr_guid(riid));
-    return E_FAIL;
+    return E_NOINTERFACE;
 }
 
 static ULONG WINAPI
@@ -492,7 +493,6 @@ static ULONG DirectSoundCaptureDevice_Re
     DirectSoundCaptureDevice * device)
 {
     ULONG ref;
-
     TRACE("(%p) ref was %lu\n", device, device->ref);
 
     device->ref--;
@@ -506,7 +506,7 @@ static ULONG DirectSoundCaptureDevice_Re
         if (device->driver) {
             IDsCaptureDriver_Close(device->driver);
             IDsCaptureDriver_Release(device->driver);
-	}
+        }
 
         HeapFree(GetProcessHeap(), 0, device->pwfx);
         device->lock.DebugInfo->Spare[1] = 0;
@@ -590,6 +590,11 @@ IDirectSoundCaptureImpl_GetCaps(
     IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
     TRACE("(%p,%p)\n",This,lpDSCCaps);
 
+    if (This->device == NULL) {
+	WARN("not initialized\n");
+	return DSERR_UNINITIALIZED;
+    }
+
     if (lpDSCCaps== NULL) {
 	WARN("invalid parameter: lpDSCCaps== NULL\n");
 	return DSERR_INVALIDPARAM;
@@ -601,11 +606,6 @@ IDirectSoundCaptureImpl_GetCaps(
 	return DSERR_INVALIDPARAM;
     }
 
-    if ( !(This->device) ) {
-	WARN("not initialized\n");
-	return DSERR_UNINITIALIZED;
-    }
-
     lpDSCCaps->dwFlags = This->device->drvcaps.dwFlags;
     lpDSCCaps->dwFormats = This->device->drvcaps.dwFormats;
     lpDSCCaps->dwChannels = This->device->drvcaps.dwChannels;
@@ -677,7 +677,7 @@ IDirectSoundCaptureImpl_Initialize(
         WARN("DirectSoundCaptureDevice_Create failed\n");
         return err;
     }
- 
+
     This->device = device;
     device->guid = devGUID;
 
@@ -1771,10 +1771,7 @@ DSCCF_CreateInstance(
     *ppobj = NULL;
 
     if ( IsEqualGUID( &IID_IDirectSoundCapture, riid ) )
-	return DSOUND_CaptureCreate((LPDIRECTSOUNDCAPTURE*)ppobj,pOuter);
-
-    if ( IsEqualGUID( &IID_IDirectSoundCapture8, riid ) )
-	return DSOUND_CaptureCreate8((LPDIRECTSOUNDCAPTURE8*)ppobj,pOuter);
+	return DSOUND_CaptureCreate8((LPDIRECTSOUNDCAPTURE*)ppobj,pOuter);
 
     WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);	
     return E_NOINTERFACE;
Index: dlls/dsound/tests/capture.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/capture.c,v
retrieving revision 1.20
diff -p -u -r1.20 capture.c
--- dlls/dsound/tests/capture.c	5 Mar 2005 10:49:08 -0000	1.20
+++ dlls/dsound/tests/capture.c	4 Jun 2005 13:46:49 -0000
@@ -29,6 +29,7 @@
 #include "dsound.h"
 #include "mmreg.h"
 #include "dxerr8.h"
+#include "dsconf.h"
 
 #include "dsound_test.h"
 
@@ -101,6 +102,163 @@ static char * format_string(WAVEFORMATEX
     return str;
 }
 
+static void IDirectSoundCapture_test(LPDIRECTSOUNDCAPTURE dsco,
+                                     BOOL initialized, LPCGUID lpGuid)
+{
+    HRESULT rc;
+    DSCCAPS dsccaps;
+    int ref;
+    IUnknown * unknown;
+    IDirectSoundCapture * dsc;
+
+    /* Try to Query for objects */
+    rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IUnknown,
+                                          (LPVOID*)&unknown);
+    ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IUnknown) "
+       "failed: %s\n", DXGetErrorString8(rc));
+    if (rc==DS_OK)
+        IDirectSoundCapture_Release(unknown);
+
+    rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IDirectSoundCapture,
+                                          (LPVOID*)&dsc);
+    ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IDirectSoundCapture) "
+       "failed: %s\n", DXGetErrorString8(rc));
+    if (rc==DS_OK)
+        IDirectSoundCapture_Release(dsc);
+
+    if (initialized == FALSE) {
+        /* try unitialized object */
+        rc=IDirectSoundCapture_GetCaps(dsco,0);
+        ok(rc==DSERR_UNINITIALIZED, "IDirectSoundCapture_GetCaps(NULL) "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSoundCapture_GetCaps() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSoundCapture_Initialize(dsco, lpGuid);
+        ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
+           "IDirectSoundCapture_Initialize() failed: %s\n",
+           DXGetErrorString8(rc));
+        if (rc==DSERR_NODRIVER) {
+            trace("  No Driver\n");
+            goto EXIT;
+        } else if (rc==E_FAIL) {
+            trace("  No Device\n");
+            goto EXIT;
+        } else if (rc==DSERR_ALLOCATED) {
+            trace("  Already In Use\n");
+            goto EXIT;
+        }
+    }
+
+    rc=IDirectSoundCapture_Initialize(dsco, lpGuid);
+    ok(rc==DSERR_ALREADYINITIALIZED, "IDirectSoundCapture_Initialize() "
+       "should have returned DSERR_ALREADYINITIALIZED: %s\n",
+       DXGetErrorString8(rc));
+
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSoundCapture_GetCaps(dsco, 0);
+    ok(rc==DSERR_INVALIDPARAM, "IDirectSoundCapture_GetCaps(NULL) "
+       "should have returned DSERR_INVALIDPARAM, returned: %s\n",
+       DXGetErrorString8(rc));
+
+    ZeroMemory(&dsccaps, sizeof(dsccaps));
+
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSound_GetCaps(dsco, &dsccaps);
+    ok(rc==DSERR_INVALIDPARAM, "IDirectSound_GetCaps() "
+       "should have returned DSERR_INVALIDPARAM, returned: %s\n",
+       DXGetErrorString8(rc));
+
+    dsccaps.dwSize=sizeof(dsccaps);
+
+    /* DSOUND: Running on a certified driver */
+    rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps);
+    ok(rc==DS_OK, "IDirectSoundCapture_GetCaps() failed: %s\n",
+       DXGetErrorString8(rc));
+
+EXIT:
+    ref=IDirectSoundCapture_Release(dsco);
+    ok(ref==0, "IDirectSoundCapture_Release() has %d references, "
+       "should have 0\n", ref);
+}
+
+static void IDirectSoundCapture_tests()
+{
+    HRESULT rc;
+    LPDIRECTSOUNDCAPTURE dsco=NULL;
+
+    trace("Testing IDirectSoundCapture\n");
+
+    /* try the COM class factory method of creation with no device specified */
+    rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSoundCapture, (void**)&dsco);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dsco)
+        IDirectSoundCapture_test(dsco, FALSE, NULL);
+
+    /* try the COM class factory method of creation with default capture
+     * device specified */
+    rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSoundCapture, (void**)&dsco);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dsco)
+        IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultCapture);
+
+    /* try the COM class factory method of creation with default voice
+     * capture device specified */
+    rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSoundCapture, (void**)&dsco);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dsco)
+        IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultVoiceCapture);
+
+    /* try the COM class factory method of creation with a bad
+     * IID specified */
+    rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
+                        &CLSID_DirectSoundPrivate, (void**)&dsco);
+    ok(rc==E_NOINTERFACE,
+       "CoCreateInstance(CLSID_DirectSoundCapture,CLSID_DirectSoundPrivate) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+
+    /* try with no device specified */
+    rc=DirectSoundCaptureCreate(NULL,&dsco,NULL);
+    ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
+       "DirectSoundCaptureCreate(NULL) failed: %s\n",DXGetErrorString8(rc));
+    if (rc==S_OK && dsco)
+        IDirectSoundCapture_test(dsco, TRUE, NULL);
+
+    /* try with default capture device specified */
+    rc=DirectSoundCaptureCreate(&DSDEVID_DefaultCapture,&dsco,NULL);
+    ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
+       "DirectSoundCaptureCreate(DSDEVID_DefaultCapture) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (rc==DS_OK && dsco)
+        IDirectSoundCapture_test(dsco, TRUE, NULL);
+
+    /* try with default voice capture device specified */
+    rc=DirectSoundCaptureCreate(&DSDEVID_DefaultVoiceCapture,&dsco,NULL);
+    ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
+       "DirectSoundCaptureCreate(DSDEVID_DefaultVoiceCapture) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (rc==DS_OK && dsco)
+        IDirectSoundCapture_test(dsco, TRUE, NULL);
+
+    /* try with a bad device specified */
+    rc=DirectSoundCaptureCreate(&DSDEVID_DefaultVoicePlayback,&dsco,NULL);
+    ok(rc==DSERR_NODRIVER,
+       "DirectSoundCaptureCreate(DSDEVID_DefaultVoicePlatback) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+    if (rc==DS_OK && dsco)
+        IDirectSoundCapture_Release(dsco);
+}
+
 typedef struct {
     char* wave;
     DWORD wave_len;
@@ -552,6 +710,7 @@ START_TEST(capture)
         return;
     }
 
+    IDirectSoundCapture_tests();
     capture_tests();
 
     CoUninitialize();


More information about the wine-patches mailing list