Added more information to some of the failure messages.
Fixed a bug where garbage data is printed out for the 2 MHz tests.

diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c
index 5217444..70e716a 100644
--- a/dlls/winmm/tests/wave.c
+++ b/dlls/winmm/tests/wave.c
@@ -18,6 +18,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 
@@ -103,6 +104,69 @@
     return buf;
 }
 
+static const char * wave_out_error(MMRESULT error)
+{
+    static char msg[1024];
+    MMRESULT rc;
+
+    rc = waveOutGetErrorText(error, msg, sizeof(msg));
+    if (rc != MMSYSERR_NOERROR)
+	sprintf(msg, "waveOutGetErrorText(%x) failed with error %x", error, rc);
+    return msg;
+}
+
+static const char * wave_open_flags(DWORD flags)
+{
+    static char msg[1024];
+    int first = TRUE;
+    msg[0] = 0;
+    if ((flags & CALLBACK_TYPEMASK) == CALLBACK_EVENT) {
+	strcat(msg, "CALLBACK_EVENT");
+        first = FALSE;
+    }
+    if ((flags & CALLBACK_TYPEMASK) == CALLBACK_FUNCTION) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "CALLBACK_FUNCTION");
+        first = FALSE;
+    }
+    if ((flags & CALLBACK_TYPEMASK) == CALLBACK_NULL) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "CALLBACK_NULL");
+        first = FALSE;
+    }
+    if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "CALLBACK_THREAD");
+        first = FALSE;
+    }
+    if ((flags & CALLBACK_TYPEMASK) == CALLBACK_WINDOW) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "CALLBACK_WINDOW");
+        first = FALSE;
+    }
+    if ((flags & WAVE_ALLOWSYNC) == WAVE_ALLOWSYNC) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "WAVE_ALLOWSYNC");
+        first = FALSE;
+    }
+    if ((flags & WAVE_FORMAT_DIRECT) == WAVE_FORMAT_DIRECT) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "WAVE_FORMAT_DIRECT");
+        first = FALSE;
+    }
+    if ((flags & WAVE_FORMAT_QUERY) == WAVE_FORMAT_QUERY) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "WAVE_FORMAT_QUERY");
+        first = FALSE;
+    }
+    if ((flags & WAVE_MAPPED) == WAVE_MAPPED) {
+	if (!first) strcat(msg, "|");
+	strcat(msg, "WAVE_MAPPED");
+        first = FALSE;
+    }
+    return msg;
+}
+
 static void wave_out_test_deviceOut(int device, int format, DWORD flags)
 {
     WAVEFORMATEX wfx;
@@ -130,7 +194,9 @@
     /* Note: Win9x doesn't know WAVE_FORMAT_DIRECT */
     ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID ||
        (rc==MMSYSERR_INVALFLAG && (flags & WAVE_FORMAT_DIRECT)),
-       "waveOutOpen: device=%d rc=%d",device,rc);
+       "waveOutOpen: device=%d format=%ldx%2dx%d flags=%lx(%s) rc=%d(%s)",device,
+       wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,CALLBACK_EVENT|flags,
+       wave_open_flags(CALLBACK_EVENT|flags),rc,wave_out_error(rc));
     if (rc!=MMSYSERR_NOERROR) {
         CloseHandle(hevent);
         return;
@@ -182,7 +248,7 @@
 static void wave_out_tests()
 {
     WAVEOUTCAPS caps;
-    WAVEFORMATEX format;
+    WAVEFORMATEX format, oformat;
     HWAVEOUT wout;
     MMRESULT rc;
     UINT ndev,d,f;
@@ -212,7 +278,7 @@
         if (rc==MMSYSERR_BADDEVICEID)
             continue;
 
-        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%04lx support=%04lx\n",
+        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx support=%04lx\n",
               d,caps.szPname,caps.vDriverVersion >> 8,
               caps.vDriverVersion & 0xff,
               caps.wMid,caps.wPid,
@@ -234,15 +300,16 @@
         format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;
         format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;
         format.cbSize=0;
-        rc=waveOutOpen(&wout,d,&format,0,0,CALLBACK_NULL);
+	oformat=format;
+        rc=waveOutOpen(&wout,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);
         ok(rc==WAVERR_BADFORMAT,
            "waveOutOpen: opening the device at 2MHz should fail %d: rc=%d",d,rc);
         if (rc==MMSYSERR_NOERROR) {
-            trace("     got %ldx%2dx%d for %dx%2dx%d\n",
+            trace("     got %ldx%2dx%d for %ldx%2dx%d\n",
                   format.nSamplesPerSec, format.wBitsPerSample,
                   format.nChannels,
-                  win_formats[f][1], win_formats[f][2],
-                  win_formats[f][3]);
+                  oformat.nSamplesPerSec, oformat.wBitsPerSample,
+                  oformat.nChannels);
             waveOutClose(wout);
         }
 
@@ -267,6 +334,17 @@
     }
 }
 
+static const char * wave_in_error(MMRESULT error)
+{
+    static char msg[1024];
+    MMRESULT rc;
+
+    rc = waveInGetErrorText(error, msg, sizeof(msg));
+    if (rc != MMSYSERR_NOERROR)
+	sprintf(msg, "waveInGetErrorText(%x) failed with error %x", error, rc);
+    return msg;
+}
+
 static void wave_in_test_deviceIn(int device, int format, DWORD flags)
 {
     WAVEFORMATEX wfx;
@@ -293,7 +371,9 @@
     /* Note: Win9x doesn't know WAVE_FORMAT_DIRECT */
     ok(rc==MMSYSERR_NOERROR || rc==MMSYSERR_BADDEVICEID ||
        (rc==MMSYSERR_INVALFLAG && (flags & WAVE_FORMAT_DIRECT)),
-       "waveInOpen: device=%d rc=%d",device,rc);
+       "waveInOpen: device=%d format=%ldx%2dx%d flags=%lx(%s) rc=%d(%s)",device,
+       wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,CALLBACK_EVENT|flags,
+       wave_open_flags(CALLBACK_EVENT|flags),rc,wave_in_error(rc));
     if (rc!=MMSYSERR_NOERROR) {
         CloseHandle(hevent);
         return;
@@ -339,7 +419,7 @@
 static void wave_in_tests()
 {
     WAVEINCAPS caps;
-    WAVEFORMATEX format;
+    WAVEFORMATEX format,oformat;
     HWAVEIN win;
     MMRESULT rc;
     UINT ndev,d,f;
@@ -369,7 +449,7 @@
         if (rc==MMSYSERR_BADDEVICEID)
             continue;
 
-        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%04lx\n",
+        trace("  %d: \"%s\" %d.%d (%d:%d): channels=%d formats=%05lx\n",
               d,caps.szPname,caps.vDriverVersion >> 8,
               caps.vDriverVersion & 0xff,
               caps.wMid,caps.wPid,
@@ -391,15 +471,16 @@
         format.nBlockAlign=format.nChannels*format.wBitsPerSample/8;
         format.nAvgBytesPerSec=format.nSamplesPerSec*format.nBlockAlign;
         format.cbSize=0;
-        rc=waveInOpen(&win,d,&format,0,0,CALLBACK_NULL);
+	oformat=format;
+        rc=waveInOpen(&win,d,&format,0,0,CALLBACK_NULL|WAVE_FORMAT_DIRECT);
         ok(rc==WAVERR_BADFORMAT,
            "waveInOpen: opening the device at 2MHz should fail %d: rc=%d",d,rc);
         if (rc==MMSYSERR_NOERROR) {
-            trace("     got %ldx%2dx%d for %dx%2dx%d\n",
+            trace("     got %ldx%2dx%d for %ldx%2dx%d\n",
                   format.nSamplesPerSec, format.wBitsPerSample,
                   format.nChannels,
-                  win_formats[f][1], win_formats[f][2],
-                  win_formats[f][3]);
+                  oformat.nSamplesPerSec, oformat.wBitsPerSample,
+                  oformat.nChannels);
             waveInClose(win);
         }