dsound compact fix with test

Robert Reif reif at earthlink.net
Sun Jul 25 16:15:58 CDT 2004


Added error checking to  IDirectSound_Compact.
Added tests for correct Compact behavior.
Refactored common test code into subroutines.
-------------- next part --------------
Index: dlls/dsound/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound.c,v
retrieving revision 1.8
diff -u -r1.8 dsound.c
--- dlls/dsound/dsound.c	23 Jul 2004 19:06:31 -0000	1.8
+++ dlls/dsound/dsound.c	25 Jul 2004 21:06:56 -0000
@@ -612,6 +612,16 @@
     ICOM_THIS(IDirectSoundImpl,iface);
     TRACE("(%p)\n",This);
 
+    if (This->initialized == FALSE) {
+        WARN("not initialized\n");
+        return DSERR_UNINITIALIZED;
+    }
+
+    if (This->priolevel != DSSCL_PRIORITY) {
+        WARN("incorrect priority level\n");
+        return DSERR_PRIOLEVELNEEDED;
+    }
+
     return DS_OK;
 }
 
Index: dlls/dsound/tests/ds3d.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/ds3d.c,v
retrieving revision 1.5
diff -u -r1.5 ds3d.c
--- dlls/dsound/tests/ds3d.c	23 Jul 2004 22:58:46 -0000	1.5
+++ dlls/dsound/tests/ds3d.c	25 Jul 2004 21:06:56 -0000
@@ -694,50 +694,6 @@
     return rc;
 }
 
-static HRESULT test_dsound(LPGUID lpGuid)
-{
-    HRESULT rc;
-    LPDIRECTSOUND dso=NULL;
-    DWORD speaker_config, new_speaker_config;
-    int ref;
-
-    /* The basic DirectSound tests are performed in the playback test */
-
-    /* Create the DirectSound object */
-    rc=DirectSoundCreate(lpGuid,&dso,NULL);
-    ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);
-    if (rc!=DS_OK)
-        return rc;
-
-    rc=IDirectSound_GetSpeakerConfig(dso,0);
-    ok(rc==DSERR_INVALIDPARAM,"GetSpeakerConfig should have failed: 0x%lx\n",rc);
-
-    rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config);
-    ok(rc==DS_OK,"GetSpeakerConfig failed: 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        trace("  DirectSound SpeakerConfig: 0x%08lx\n", speaker_config);
-    }
-
-    speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,DSSPEAKER_GEOMETRY_WIDE);
-    rc=IDirectSound_SetSpeakerConfig(dso,speaker_config);
-    ok(rc==DS_OK,"SetSpeakerConfig failed: 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        rc=IDirectSound_GetSpeakerConfig(dso,&new_speaker_config);
-        ok(rc==DS_OK,"GetSpeakerConfig failed: 0x%lx\n",rc);
-        if (rc==DS_OK)
-            ok(speaker_config==new_speaker_config,"SetSpeakerConfig failed to set speaker config: expected 0x%08lx, got 0x%08lx\n",
-               speaker_config,new_speaker_config);
-    }
-
-    /* Release the DirectSound object */
-    ref=IDirectSound_Release(dso);
-    ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
-    if (ref!=0)
-        return DSERR_GENERIC;
-
-    return DS_OK;
-}
-
 static HRESULT test_primary(LPGUID lpGuid)
 {
     HRESULT rc;
@@ -959,7 +915,6 @@
                                    LPCSTR lpcstrModule, LPVOID lpContext)
 {
     trace("*** Testing %s - %s\n",lpcstrDescription,lpcstrModule);
-    test_dsound(lpGuid);
 
     trace("  Testing the primary buffer\n");
     test_primary(lpGuid);
Index: dlls/dsound/tests/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound.c,v
retrieving revision 1.31
diff -u -r1.31 dsound.c
--- dlls/dsound/tests/dsound.c	22 Jul 2004 20:35:36 -0000	1.31
+++ dlls/dsound/tests/dsound.c	25 Jul 2004 21:06:57 -0000
@@ -40,411 +40,338 @@
 
 #include "dsound_test.h"
 
-static void dsound_dsound_tests()
+static void dsound_test(LPDIRECTSOUND dso, BOOL initialized, LPCGUID lpGuid)
 {
     HRESULT rc;
-    LPDIRECTSOUND dso=NULL;
     DSCAPS dscaps;
     int ref;
     IUnknown * unknown;
     IDirectSound * ds;
     IDirectSound8 * ds8;
+    DWORD speaker_config, new_speaker_config;
 
-    /* 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",DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound_Release(unknown);
+    /* Try to Query for objects */
+    rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+    ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",
+       DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound_Release(ds);
+    rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+    ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",
+       DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(ds8);
+    rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+    ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+    if (rc==DS_OK)
+        IDirectSound8_Release(ds8);
 
+    if (initialized == FALSE) {
         /* try unitialized object */
         rc=IDirectSound_GetCaps(dso,0);
-        ok(rc==DSERR_UNINITIALIZED,"GetCaps should have returned DSERR_UNINITIALIZED, returned: %s\n",DXGetErrorString8(rc));
-
-        rc=IDirectSound_Initialize(dso,NULL);
-        ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString8(rc));
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps(NULL) "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound_GetCaps(dso,0);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-        dscaps.dwSize=sizeof(dscaps);
-
-        /* DSOUND: Running on a certified driver */
         rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(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);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound_Compact(dso);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound_Compact() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetSpeakerConfig() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound_Initialize(dso,lpGuid);
+        ok(rc==DS_OK,"IDirectSound_Initialize() failed: %s\n",
+           DXGetErrorString8(rc));
     }
 
-    /* try with no device specified */
-    rc=DirectSoundCreate(NULL,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate(NULL) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound_Release(ds);
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSound_GetCaps(dso,0);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps(NULL) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
 
-        rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
-        ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(ds8);
+    ZeroMemory(&dscaps, sizeof(dscaps));
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound_GetCaps(dso,0);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSound_GetCaps(dso,&dscaps);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps() "
+       "should have failed: %s\n",DXGetErrorString8(rc));
 
-        ZeroMemory(&dscaps, sizeof(dscaps));
+    dscaps.dwSize=sizeof(dscaps);
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    /* DSOUND: Running on a certified driver */
+    rc=IDirectSound_GetCaps(dso,&dscaps);
+    ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
 
-        dscaps.dwSize=sizeof(dscaps);
+    rc=IDirectSound_Compact(dso);
+    ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound_Compact() failed: %s\n",DXGetErrorString8(rc));
 
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK) {
-            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-                  dscaps.dwMaxSecondarySampleRate);
-        }
+    rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
+    ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",DXGetErrorString8(rc));
 
-        ref=IDirectSound_Release(dso);
-        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    rc=IDirectSound_Compact(dso);
+    ok(rc==DS_OK,"IDirectSound_Compact() failed: %s\n",DXGetErrorString8(rc));
+
+    rc=IDirectSound_GetSpeakerConfig(dso,0);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetSpeakerConfig(NULL) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+
+    rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config);
+    ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n",
+       DXGetErrorString8(rc));
+
+    speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,
+                                        DSSPEAKER_GEOMETRY_WIDE);
+    rc=IDirectSound_SetSpeakerConfig(dso,speaker_config);
+    ok(rc==DS_OK,"IDirectSound_SetSpeakerConfig() failed: %s\n",
+       DXGetErrorString8(rc));
+    if (rc==DS_OK) {
+        rc=IDirectSound_GetSpeakerConfig(dso,&new_speaker_config);
+        ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n",
+           DXGetErrorString8(rc));
+        if (rc==DS_OK)
+            ok(speaker_config==new_speaker_config,
+               "IDirectSound_GetSpeakerConfig() failed to set speaker config: "
+               "expected 0x%08lx, got 0x%08lx\n",
+               speaker_config,new_speaker_config);
     }
 
-    /* try with default playback device specified */
-    rc=DirectSoundCreate(&DSDEVID_DefaultPlayback,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultPlayback) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
+    ref=IDirectSound_Release(dso);
+    ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
+}
 
-        ZeroMemory(&dscaps, sizeof(dscaps));
+static void dsound_dsound_tests()
+{
+    HRESULT rc;
+    LPDIRECTSOUND dso=NULL;
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    trace("Testing IDirectSound\n");
 
-        dscaps.dwSize=sizeof(dscaps);
+    /* try the COM class factory method of creation with no device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, FALSE, NULL);
+
+    /* try the COM class factory method of creation with default playback
+     * device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, FALSE, &DSDEVID_DefaultPlayback);
+
+    /* try the COM class factory method of creation with default voice
+     * playback device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback);
 
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK) {
-            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-                  dscaps.dwMaxSecondarySampleRate);
-        }
+    /* try with no device specified */
+    rc=DirectSoundCreate(NULL,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate(NULL) failed: %s\n",DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, TRUE, NULL);
 
-        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",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, TRUE, NULL);
 
     /* try with default voice playback device specified */
     rc=DirectSoundCreate(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-        dscaps.dwSize=sizeof(dscaps);
-
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(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);
-    }
+    ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound_test(dso, TRUE, NULL);
 }
 
-static void dsound_dsound8_tests()
+static void dsound8_test(LPDIRECTSOUND8 dso, BOOL initialized, LPCGUID lpGuid)
 {
     HRESULT rc;
-    LPDIRECTSOUND8 dso=NULL;
     DSCAPS dscaps;
     int ref;
     IUnknown * unknown;
     IDirectSound * ds;
     IDirectSound8 * ds8;
+    DWORD speaker_config, new_speaker_config;
 
-    /* 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",DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(unknown);
+    /* Try to Query for objects */
+    rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
+    ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",
+       DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound_Release(ds);
+    rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
+    ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",
+       DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(ds8);
+    rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
+    ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+    if (rc==DS_OK)
+        IDirectSound8_Release(ds8);
 
+    if (initialized == FALSE) {
         /* try unitialized object */
         rc=IDirectSound8_GetCaps(dso,0);
-        ok(rc==DSERR_UNINITIALIZED,"GetCaps should have returned DSERR_UNINITIALIZED, returned: %s\n",DXGetErrorString8(rc));
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps(NULL) "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
 
-        rc=IDirectSound8_Initialize(dso,NULL);
-        ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString8(rc));
-
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound8_GetCaps(dso,0);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-        dscaps.dwSize=sizeof(dscaps);
-
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(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,"IDirectSound8_Release has %d references, should have 0\n",ref);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound8_Compact(dso);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_Compact() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config);
+        ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetSpeakerConfig() "
+           "should have returned DSERR_UNINITIALIZED, returned: %s\n",
+           DXGetErrorString8(rc));
+
+        rc=IDirectSound8_Initialize(dso,lpGuid);
+        ok(rc==DS_OK,"IDirectSound8_Initialize() failed: %s\n",
+           DXGetErrorString8(rc));
     }
 
-    /* try with no device specified */
-    rc=DirectSoundCreate8(NULL,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound_Release(ds);
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSound8_GetCaps(dso,0);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() "
+       "should have failed: %s\n", DXGetErrorString8(rc));
 
-        rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
-        ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(ds8);
+    ZeroMemory(&dscaps, sizeof(dscaps));
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound8_GetCaps(dso,0);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    /* DSOUND: Error: Invalid caps buffer */
+    rc=IDirectSound8_GetCaps(dso,&dscaps);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() "
+       "should have failed: %s\n", DXGetErrorString8(rc));
 
-        ZeroMemory(&dscaps, sizeof(dscaps));
+    dscaps.dwSize=sizeof(dscaps);
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    /* DSOUND: Running on a certified driver */
+    rc=IDirectSound8_GetCaps(dso,&dscaps);
+    ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
 
-        dscaps.dwSize=sizeof(dscaps);
+    rc=IDirectSound_Compact(dso);
+    ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound_Compact() failed: %s\n",DXGetErrorString8(rc));
 
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK) {
-            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-                  dscaps.dwMaxSecondarySampleRate);
-        }
+    rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
+    ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",DXGetErrorString8(rc));
 
-        ref=IDirectSound8_Release(dso);
-        ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
+    rc=IDirectSound8_Compact(dso);
+    ok(rc==DS_OK,"IDirectSound8_Compact() failed: %s\n",DXGetErrorString8(rc));
+
+    rc=IDirectSound8_GetSpeakerConfig(dso,0);
+    ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetSpeakerConfig(NULL) "
+       "should have failed: %s\n",DXGetErrorString8(rc));
+
+    rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config);
+    ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n",
+       DXGetErrorString8(rc));
+
+    speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,
+                                        DSSPEAKER_GEOMETRY_WIDE);
+    rc=IDirectSound8_SetSpeakerConfig(dso,speaker_config);
+    ok(rc==DS_OK,"IDirectSound8_SetSpeakerConfig() failed: %s\n",
+       DXGetErrorString8(rc));
+    if (rc==DS_OK) {
+        rc=IDirectSound8_GetSpeakerConfig(dso,&new_speaker_config);
+        ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n",
+           DXGetErrorString8(rc));
+        if (rc==DS_OK)
+            ok(speaker_config==new_speaker_config,
+               "IDirectSound8_GetSpeakerConfig() failed to set speaker config: "
+               "expected 0x%08lx, got 0x%08lx\n",
+               speaker_config,new_speaker_config);
     }
 
-    /* try with default playback device specified */
-    rc=DirectSoundCreate8(&DSDEVID_DefaultPlayback,&dso,NULL);
-    ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-        if (rc==DS_OK)
-            IDirectSound8_Release(ds8);
+    ref=IDirectSound8_Release(dso);
+    ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
+}
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound8_GetCaps(dso,0);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+static void dsound_dsound8_tests()
+{
+    HRESULT rc;
+    LPDIRECTSOUND8 dso=NULL;
 
-        ZeroMemory(&dscaps, sizeof(dscaps));
+    trace("Testing IDirectSound8\n");
 
-        /* DSOUND: Error: Invalid caps buffer */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc));
+    /* try the COM class factory method of creation with no device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound8, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString8(rc));
+    if (dso)
+        dsound8_test(dso, FALSE, NULL);
 
-        dscaps.dwSize=sizeof(dscaps);
+    /* try the COM class factory method of creation with default playback
+     *  device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound8, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound8_test(dso, FALSE, &DSDEVID_DefaultPlayback);
+
+    /* try the COM class factory method of creation with default voice
+     * playback device specified */
+    rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
+                        &IID_IDirectSound8, (void**)&dso);
+    ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n",
+       DXGetErrorString8(rc));
+    if (dso)
+        dsound8_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback);
 
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-        if (rc==DS_OK) {
-            trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-                  dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-                  dscaps.dwMaxSecondarySampleRate);
-        }
+    /* try with no device specified */
+    rc=DirectSoundCreate8(NULL,&dso,NULL);
+    ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc));
+    if (dso)
+        dsound8_test(dso, TRUE, NULL);
 
-        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",DXGetErrorString8(rc));
+    if (dso)
+        dsound8_test(dso, TRUE, NULL);
 
     /* try with default voice playback device specified */
     rc=DirectSoundCreate8(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
     ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-        dscaps.dwSize=sizeof(dscaps);
-
-        /* DSOUND: Running on a certified driver */
-        rc=IDirectSound8_GetCaps(dso,&dscaps);
-        ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(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);
-    }
+    if (dso)
+        dsound8_test(dso, TRUE, NULL);
 }
 
 static HRESULT test_dsound(LPGUID lpGuid)
 {
     HRESULT rc;
     LPDIRECTSOUND dso=NULL;
-    DSCAPS dscaps;
     int ref;
-    IUnknown * unknown;
-    IDirectSound * ds;
-    IDirectSound8 * ds8;
 
     /* DSOUND: Error: Invalid interface buffer */
     rc=DirectSoundCreate(lpGuid,0,NULL);
@@ -456,48 +383,8 @@
     if (rc!=DS_OK)
         return rc;
 
-    /* Try to Query for objects */
-    rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
-    ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-    dscaps.dwSize=sizeof(dscaps);
-
-    /* DSOUND: Running on a certified driver */
-    rc=IDirectSound_GetCaps(dso,&dscaps);
-    ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-    if (rc==DS_OK) {
-        trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-              dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-              dscaps.dwMaxSecondarySampleRate);
-    }
-
-    /* Release the DirectSound object */
-    ref=IDirectSound_Release(dso);
-    ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
-    if (ref!=0)
-        return DSERR_GENERIC;
+    /* Try an enumerated device */
+    dsound_test(dso, TRUE, NULL);
 
     /* Create a DirectSound object */
     rc=DirectSoundCreate(lpGuid,&dso,NULL);
@@ -565,11 +452,7 @@
 {
     HRESULT rc;
     LPDIRECTSOUND8 dso=NULL;
-    DSCAPS dscaps;
     int ref;
-    IUnknown * unknown;
-    IDirectSound * ds;
-    IDirectSound8 * ds8;
 
     /* DSOUND: Error: Invalid interface buffer */
     rc=DirectSoundCreate8(lpGuid,0,NULL);
@@ -581,48 +464,8 @@
     if (rc!=DS_OK)
         return rc;
 
-    /* Try to Query for objects */
-    rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
-    ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(rc));
-    if (rc==DS_OK)
-        IDirectSound_Release(ds);
-
-    rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
-    ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) failed: %s\n",DXGetErrorString8(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",DXGetErrorString8(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",DXGetErrorString8(rc));
-
-    dscaps.dwSize=sizeof(dscaps);
-
-    /* DSOUND: Running on a certified driver */
-    rc=IDirectSound8_GetCaps(dso,&dscaps);
-    ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc));
-    if (rc==DS_OK) {
-        trace("  DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
-              dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
-              dscaps.dwMaxSecondarySampleRate);
-    }
-
-    /* Release the DirectSound8 object */
-    ref=IDirectSound8_Release(dso);
-    ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
-    if (ref!=0)
-        return DSERR_GENERIC;
+    /* Try an enumerated device */
+    dsound8_test(dso, TRUE, NULL);
 
     /* Create a DirectSound8 object */
     rc=DirectSoundCreate8(lpGuid,&dso,NULL);


More information about the wine-patches mailing list