Fixed a bug where a capture device was used after it failed to open
due to a missing driver.
Added tests to try all possible combinations of sample rate, sample
size and mono/stereo.

diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c
index 11280d8..fd51d86 100644
--- a/dlls/dsound/tests/dsound.c
+++ b/dlls/dsound/tests/dsound.c
@@ -28,6 +28,34 @@
 #include "initguid.h"
 #include "dsound.h"
 
+static const unsigned int formats[][3]={
+    { 8000,  8, 1},
+    { 8000,  8, 2},
+    { 8000, 16, 1},
+    { 8000, 16, 2},
+    {11025,  8, 1},
+    {11025,  8, 2},
+    {11025, 16, 1},
+    {11025, 16, 2},
+    {22050,  8, 1},
+    {22050,  8, 2},
+    {22050, 16, 1},
+    {22050, 16, 2},
+    {44100,  8, 1},
+    {44100,  8, 2},
+    {44100, 16, 1},
+    {44100, 16, 2},
+    {48000,  8, 1},
+    {48000,  8, 2},
+    {48000, 16, 1},
+    {48000, 16, 2},
+    {96000,  8, 1},
+    {96000,  8, 2},
+    {96000, 16, 1},
+    {96000, 16, 2}
+};
+#define NB_FORMATS (sizeof(formats)/sizeof(*formats))
+
 /* The time slice determines how often we will service the buffer and the
  * buffer will be four time slices long
  */
@@ -371,6 +399,7 @@
     DSBUFFERDESC bufdesc;
     WAVEFORMATEX wfx;
     DSCAPS dscaps;
+    int f;
 
     trace("Testing %s - %s : %s\n",lpcstrDescription,lpcstrModule,wine_dbgstr_guid(lpGuid));
     rc=DirectSoundCreate(lpGuid,&dso,NULL);
@@ -418,34 +447,21 @@
         goto EXIT;
 
     /* Testing secondary buffers */
-    init_format(&wfx,11025,8,1);
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing a secondary buffer at %ldx%dx%d\n",
-          wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&dsbo,NULL);
-    ok(rc==DS_OK,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_buffer(dso,dsbo,0,winetest_interactive);
-        IDirectSoundBuffer_Release(dsbo);
-    }
-
-    init_format(&wfx,48000,16,2);
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing a secondary buffer at %ldx%dx%d\n",
-          wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&dsbo,NULL);
-    ok(rc==DS_OK,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_buffer(dso,dsbo,0,winetest_interactive);
-        IDirectSoundBuffer_Release(dsbo);
+    for (f=0;f<NB_FORMATS;f++) {
+	init_format(&wfx,formats[f][0],formats[f][1],formats[f][2]);
+	bufdesc.dwSize=sizeof(bufdesc);
+	bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2;
+	bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+	bufdesc.dwReserved=0;
+	bufdesc.lpwfxFormat=&wfx;
+	trace("  Testing a secondary buffer at %ldx%dx%d\n",
+	    wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
+	rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&dsbo,NULL);
+	ok(rc==DS_OK,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc);
+	if (rc==DS_OK) {
+	    test_buffer(dso,dsbo,0,winetest_interactive);
+	    IDirectSoundBuffer_Release(dsbo);
+	}
     }
 
 EXIT:
@@ -628,6 +644,7 @@
     DSCBUFFERDESC bufdesc;
     WAVEFORMATEX wfx;
     DSCCAPS dsccaps;
+    int f;
 
     /* Private dsound.dll: Error: Invalid interface buffer */
     trace("Testing %s - %s : %s\n",lpcstrDescription,lpcstrModule,wine_dbgstr_guid(lpGuid));
@@ -638,7 +655,7 @@
 
     rc=DirectSoundCaptureCreate(lpGuid,&dsco,NULL);
     ok((rc==DS_OK)||(rc==DSERR_NODRIVER),"DirectSoundCaptureCreate failed: 0x%lx\n",rc);
-    if ((rc!=DS_OK)&&(rc!=DSERR_NODRIVER))
+    if (rc!=DS_OK)
         goto EXIT;
 
     /* Private dsound.dll: Error: Invalid caps buffer */
@@ -716,23 +733,27 @@
         IDirectSoundCaptureBuffer_Release(dscbo);
     }
 
-    init_format(&wfx,11025,8,1);
-    ZeroMemory(&bufdesc, sizeof(bufdesc));
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=0;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing the capture buffer at %ldx%dx%d\n",
-        wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
-    ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_capture_buffer(dsco, dscbo);
-        IDirectSoundCaptureBuffer_Release(dscbo);
+    for (f=0;f<NB_FORMATS;f++) {
+	init_format(&wfx,formats[f][0],formats[f][1],formats[f][2]);
+	ZeroMemory(&bufdesc, sizeof(bufdesc));
+	bufdesc.dwSize=sizeof(bufdesc);
+	bufdesc.dwFlags=0;
+	bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
+	bufdesc.dwReserved=0;
+	bufdesc.lpwfxFormat=&wfx;
+	trace("  Testing the capture buffer at %ldx%dx%d\n",
+	    wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
+	rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
+	ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
+	if (rc==DS_OK) {
+	    test_capture_buffer(dsco, dscbo);
+	    IDirectSoundCaptureBuffer_Release(dscbo);
+	}
     }
 
-    init_format(&wfx,11025,8,1);
+    /* Try an invalid format to test error handling */
+#if 0
+    init_format(&wfx,2000000,16,2);
     ZeroMemory(&bufdesc, sizeof(bufdesc));
     bufdesc.dwSize=sizeof(bufdesc);
     bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;
@@ -740,61 +761,10 @@
     bufdesc.dwReserved=0;
     bufdesc.lpwfxFormat=&wfx;
     trace("  Testing the capture buffer at %ldx%dx%d\n",
-        wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
+	wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
     rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
-    ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_capture_buffer(dsco, dscbo);
-        IDirectSoundCaptureBuffer_Release(dscbo);
-    }
-
-    init_format(&wfx,11025,16,2);
-    ZeroMemory(&bufdesc, sizeof(bufdesc));
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=0;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing the capture buffer at %ldx%dx%d\n",
-        wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
-    ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_capture_buffer(dsco, dscbo);
-        IDirectSoundCaptureBuffer_Release(dscbo);
-    }
-
-    init_format(&wfx,11025,16,2);
-    ZeroMemory(&bufdesc, sizeof(bufdesc));
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing the capture buffer at %ldx%dx%d\n",
-        wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
-    ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_capture_buffer(dsco, dscbo);
-        IDirectSoundCaptureBuffer_Release(dscbo);
-    }
-
-    init_format(&wfx,44100,16,1);
-    ZeroMemory(&bufdesc, sizeof(bufdesc));
-    bufdesc.dwSize=sizeof(bufdesc);
-    bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;
-    bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
-    bufdesc.dwReserved=0;
-    bufdesc.lpwfxFormat=&wfx;
-    trace("  Testing the capture buffer at %ldx%dx%d\n",
-        wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
-    rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
-    ok(rc==DS_OK,"CreateCaptureBuffer failed to create a capture buffer 0x%lx\n",rc);
-    if (rc==DS_OK) {
-        test_capture_buffer(dsco, dscbo);
-        IDirectSoundCaptureBuffer_Release(dscbo);
-    }
+    ok(rc!=DS_OK,"CreateCaptureBuffer should have failed at 2 MHz 0x%lx\n",rc);
+#endif
 
 EXIT:
     if (dsco!=NULL)