[PATCH (try2)] dsound: Stricter validation for formats in secondary buffers

Andrew Eikum aeikum at codeweavers.com
Mon Apr 13 11:25:23 CDT 2015


---
This fixes bug 33914.

try2: Fix test failure on winxp.

 dlls/dsound/dsound.c       |  24 ++-
 dlls/dsound/tests/dsound.c | 478 ++++++++++++++++++++++++---------------------
 2 files changed, 277 insertions(+), 225 deletions(-)

diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index 065c377..f77d2ea 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -470,17 +470,32 @@ static HRESULT DirectSoundDevice_CreateSoundBuffer(
         }
     } else {
         IDirectSoundBufferImpl * dsb;
-        WAVEFORMATEXTENSIBLE *pwfxe;
 
         if (dsbd->lpwfxFormat == NULL) {
             WARN("invalid parameter: dsbd->lpwfxFormat can't be NULL for "
                  "secondary buffer\n");
             return DSERR_INVALIDPARAM;
         }
-        pwfxe = (WAVEFORMATEXTENSIBLE*)dsbd->lpwfxFormat;
 
-        if (pwfxe->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+        if(dsbd->lpwfxFormat->wFormatTag != WAVE_FORMAT_PCM &&
+                dsbd->lpwfxFormat->wFormatTag != WAVE_FORMAT_IEEE_FLOAT &&
+                dsbd->lpwfxFormat->wFormatTag != WAVE_FORMAT_EXTENSIBLE) {
+            WARN("We can't mix this format: 0x%x\n", dsbd->lpwfxFormat->wFormatTag);
+            return E_NOTIMPL;
+        }
+
+        if(dsbd->lpwfxFormat->wBitsPerSample < 8 || dsbd->lpwfxFormat->wBitsPerSample % 8 != 0 ||
+                dsbd->lpwfxFormat->nChannels == 0 || dsbd->lpwfxFormat->nSamplesPerSec == 0 ||
+                dsbd->lpwfxFormat->nAvgBytesPerSec == 0 ||
+                dsbd->lpwfxFormat->nBlockAlign != dsbd->lpwfxFormat->nChannels * dsbd->lpwfxFormat->wBitsPerSample / 8) {
+            WARN("Format inconsistency\n");
+            return DSERR_INVALIDPARAM;
+        }
+
+        if (dsbd->lpwfxFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
         {
+            WAVEFORMATEXTENSIBLE *pwfxe = (WAVEFORMATEXTENSIBLE*)dsbd->lpwfxFormat;
+
             /* check if cbSize is at least 22 bytes */
             if (pwfxe->Format.cbSize < (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)))
             {
@@ -510,8 +525,7 @@ static HRESULT DirectSoundDevice_CreateSoundBuffer(
             }
             if (pwfxe->Samples.wValidBitsPerSample && pwfxe->Samples.wValidBitsPerSample < dsbd->lpwfxFormat->wBitsPerSample)
             {
-                FIXME("Non-packed formats not supported right now: %d/%d\n", pwfxe->Samples.wValidBitsPerSample, dsbd->lpwfxFormat->wBitsPerSample);
-                return DSERR_CONTROLUNAVAIL;
+                WARN("Non-packed formats may not function : %d/%d\n", pwfxe->Samples.wValidBitsPerSample, dsbd->lpwfxFormat->wBitsPerSample);
             }
         }
 
diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c
index f93e137..59763aa 100644
--- a/dlls/dsound/tests/dsound.c
+++ b/dlls/dsound/tests/dsound.c
@@ -1233,11 +1233,261 @@ EXIT:
     return rc;
 }
 
+static HRESULT do_invalid_fmt_test(IDirectSound *dso,
+        IDirectSoundBuffer *buf, WAVEFORMATEX *wfx, IDirectSoundBuffer **out_buf)
+{
+    HRESULT rc;
+    *out_buf = NULL;
+    if(!buf){
+        DSBUFFERDESC bufdesc;
+        ZeroMemory(&bufdesc, sizeof(bufdesc));
+        bufdesc.dwSize = sizeof(bufdesc);
+        bufdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY;
+        bufdesc.dwBufferBytes = 4096;
+        bufdesc.lpwfxFormat = wfx;
+        rc = IDirectSound_CreateSoundBuffer(dso, &bufdesc, out_buf, NULL);
+    }else{
+        rc = IDirectSoundBuffer_SetFormat(buf, wfx);
+        if(SUCCEEDED(rc)){
+            IDirectSoundBuffer_AddRef(buf);
+            *out_buf = buf;
+        }
+    }
+    return rc;
+}
+
+/* if no buffer is given, use CreateSoundBuffer instead of SetFormat */
+static void perform_invalid_fmt_tests(const char *testname, IDirectSound *dso, IDirectSoundBuffer *buf)
+{
+    WAVEFORMATEX wfx;
+    WAVEFORMATEXTENSIBLE fmtex;
+    HRESULT rc;
+    IDirectSoundBuffer *got_buf;
+
+    wfx.wFormatTag = WAVE_FORMAT_PCM;
+    wfx.nChannels = 0;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 0;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 2;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 12;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 0;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = 0;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = 0;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) - 1;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) + 1;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == S_OK, "%s: SetFormat: %08x\n", testname, rc);
+
+    rc = IDirectSoundBuffer_GetFormat(got_buf, &wfx, sizeof(wfx), NULL);
+    ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+    ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "%s: format: 0x%x\n", testname, wfx.wFormatTag);
+    ok(wfx.nChannels == 2, "%s: channels: %u\n", testname, wfx.nChannels);
+    ok(wfx.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, wfx.nSamplesPerSec);
+    ok(wfx.wBitsPerSample == 16, "%s: bps: %u\n", testname, wfx.wBitsPerSample);
+    ok(wfx.nBlockAlign == 4, "%s: blockalign: %u\n", testname, wfx.nBlockAlign);
+    ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "%s: avgbytes: %u\n", testname, wfx.nAvgBytesPerSec);
+    IDirectSoundBuffer_Release(got_buf);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign - 1;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == S_OK, "%s: SetFormat: %08x\n", testname, rc);
+
+    rc = IDirectSoundBuffer_GetFormat(got_buf, &wfx, sizeof(wfx), NULL);
+    ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+    ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "%s: format: 0x%x\n", testname, wfx.wFormatTag);
+    ok(wfx.nChannels == 2, "%s: channels: %u\n", testname, wfx.nChannels);
+    ok(wfx.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, wfx.nSamplesPerSec);
+    ok(wfx.wBitsPerSample == 16, "%s: bps: %u\n", testname, wfx.wBitsPerSample);
+    ok(wfx.nBlockAlign == 4, "%s: blockalign: %u\n", testname, wfx.nBlockAlign);
+    ok(wfx.nAvgBytesPerSec == 44100 * 4 - 1, "%s: avgbytes: %u\n", testname, wfx.nAvgBytesPerSec);
+    IDirectSoundBuffer_Release(got_buf);
+
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(rc == S_OK, "%s: SetFormat: %08x\n", testname, rc);
+
+    rc = IDirectSoundBuffer_GetFormat(got_buf, &wfx, sizeof(wfx), NULL);
+    ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+    ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "%s: format: 0x%x\n", testname, wfx.wFormatTag);
+    ok(wfx.nChannels == 2, "%s: channels: %u\n", testname, wfx.nChannels);
+    ok(wfx.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, wfx.nSamplesPerSec);
+    ok(wfx.wBitsPerSample == 16, "%s: bps: %u\n", testname, wfx.wBitsPerSample);
+    ok(wfx.nBlockAlign == 4, "%s: blockalign: %u\n", testname, wfx.nBlockAlign);
+    ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "%s: avgbytes: %u\n", testname, wfx.nAvgBytesPerSec);
+    IDirectSoundBuffer_Release(got_buf);
+
+    wfx.wFormatTag = WAVE_FORMAT_ALAW;
+    wfx.nChannels = 2;
+    wfx.nSamplesPerSec = 44100;
+    wfx.wBitsPerSample = 16;
+    wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
+    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
+    rc = do_invalid_fmt_test(dso, buf, &wfx, &got_buf);
+    ok(buf ? rc == S_OK : (rc == E_NOTIMPL || rc == DSERR_INVALIDCALL /* winxp */), "%s: SetFormat: %08x\n", testname, rc);
+
+    if(got_buf){
+        rc = IDirectSoundBuffer_GetFormat(got_buf, &wfx, sizeof(wfx), NULL);
+        ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+        ok(wfx.wFormatTag == WAVE_FORMAT_ALAW, "%s: format: 0x%x\n", testname, wfx.wFormatTag);
+        ok(wfx.nChannels == 2, "%s: channels: %u\n", testname, wfx.nChannels);
+        ok(wfx.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, wfx.nSamplesPerSec);
+        ok(wfx.wBitsPerSample == 16, "%s: bps: %u\n", testname, wfx.wBitsPerSample);
+        ok(wfx.nBlockAlign == 4, "%s: blockalign: %u\n", testname, wfx.nBlockAlign);
+        ok(wfx.nAvgBytesPerSec == 44100 * 4, "%s: avgbytes: %u\n", testname, wfx.nAvgBytesPerSec);
+        IDirectSoundBuffer_Release(got_buf);
+    }
+
+    if(!gotdx8){
+        win_skip("Not doing the WAVE_FORMAT_EXTENSIBLE tests\n");
+        return;
+    }
+
+    fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+    fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+    fmtex.Format.nChannels = 2;
+    fmtex.Format.nSamplesPerSec = 44100;
+    fmtex.Format.wBitsPerSample = 16;
+    fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
+    fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
+    fmtex.Samples.wValidBitsPerSample = 0;
+    fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
+    fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+    rc = do_invalid_fmt_test(dso, buf, (WAVEFORMATEX*)&fmtex, &got_buf);
+    ok(rc == S_OK, "%s: SetFormat: %08x\n", testname, rc);
+
+    rc = IDirectSoundBuffer_GetFormat(got_buf, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL);
+    ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+    ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "%s: format: 0x%x\n", testname, fmtex.Format.wFormatTag);
+    ok(fmtex.Format.nChannels == 2, "%s: channels: %u\n", testname, fmtex.Format.nChannels);
+    ok(fmtex.Format.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, fmtex.Format.nSamplesPerSec);
+    ok(fmtex.Format.wBitsPerSample == 16, "%s: bps: %u\n", testname, fmtex.Format.wBitsPerSample);
+    ok(fmtex.Format.nBlockAlign == 4, "%s: blockalign: %u\n", testname, fmtex.Format.nBlockAlign);
+    ok(fmtex.Format.nAvgBytesPerSec == 44100 * 4, "%s: avgbytes: %u\n", testname, fmtex.Format.nAvgBytesPerSec);
+    ok(fmtex.Samples.wValidBitsPerSample == 0 || /* <= XP */
+            fmtex.Samples.wValidBitsPerSample == 16, /* >= Vista */
+            "%s: validbits: %u\n", testname, fmtex.Samples.wValidBitsPerSample);
+    ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "%s: subtype incorrect\n", testname);
+    IDirectSoundBuffer_Release(got_buf);
+
+    fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+    fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+    fmtex.Format.nChannels = 2;
+    fmtex.Format.nSamplesPerSec = 44100;
+    fmtex.Format.wBitsPerSample = 24;
+    fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
+    fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
+    fmtex.Samples.wValidBitsPerSample = 20;
+    fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
+    fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+    rc = do_invalid_fmt_test(dso, buf, (WAVEFORMATEX*)&fmtex, &got_buf);
+    ok(rc == S_OK, "%s: SetFormat: %08x\n", testname, rc);
+
+    rc = IDirectSoundBuffer_GetFormat(got_buf, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL);
+    ok(rc == S_OK, "%s: GetFormat: %08x\n", testname, rc);
+    ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "%s: format: 0x%x\n", testname, fmtex.Format.wFormatTag);
+    ok(fmtex.Format.nChannels == 2, "%s: channels: %u\n", testname, fmtex.Format.nChannels);
+    ok(fmtex.Format.nSamplesPerSec == 44100, "%s: rate: %u\n", testname, fmtex.Format.nSamplesPerSec);
+    ok(fmtex.Format.wBitsPerSample == 24, "%s: bps: %u\n", testname, fmtex.Format.wBitsPerSample);
+    ok(fmtex.Format.nBlockAlign == 6, "%s: blockalign: %u\n", testname, fmtex.Format.nBlockAlign);
+    ok(fmtex.Format.nAvgBytesPerSec == 44100 * 6, "%s: avgbytes: %u\n", testname, fmtex.Format.nAvgBytesPerSec);
+    ok(fmtex.Samples.wValidBitsPerSample == 20, "%s: validbits: %u\n", testname, fmtex.Samples.wValidBitsPerSample);
+    ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "%s: subtype incorrect\n", testname);
+    IDirectSoundBuffer_Release(got_buf);
+
+    fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+    fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+    fmtex.Format.nChannels = 2;
+    fmtex.Format.nSamplesPerSec = 44100;
+    fmtex.Format.wBitsPerSample = 24;
+    fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
+    fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
+    fmtex.Samples.wValidBitsPerSample = 32;
+    fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
+    fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+    rc = do_invalid_fmt_test(dso, buf, (WAVEFORMATEX*)&fmtex, &got_buf);
+    ok(rc == E_INVALIDARG, "%s: SetFormat: %08x\n", testname, rc);
+}
+
 static HRESULT test_invalid_fmts(LPGUID lpGuid)
 {
     HRESULT rc;
     LPDIRECTSOUND dso=NULL;
-    LPDIRECTSOUNDBUFFER primary=NULL;
+    LPDIRECTSOUNDBUFFER buffer=NULL;
     DSBUFFERDESC bufdesc;
 
     /* Create the DirectSound object */
@@ -1259,228 +1509,16 @@ static HRESULT test_invalid_fmts(LPGUID lpGuid)
     ZeroMemory(&bufdesc, sizeof(bufdesc));
     bufdesc.dwSize=sizeof(bufdesc);
     bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
-    rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
-    ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed "
+    rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&buffer,NULL);
+    ok(rc==DS_OK && buffer!=NULL,"IDirectSound_CreateSoundBuffer() failed "
        "to create a primary buffer %08x\n",rc);
-
-    if (rc==DS_OK && primary!=NULL) {
-        WAVEFORMATEX wfx;
-        WAVEFORMATEXTENSIBLE fmtex;
-
-        wfx.wFormatTag = WAVE_FORMAT_PCM;
-        wfx.nChannels = 0;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 0;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 2;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 12;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 0;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = 0;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = 0;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) - 1;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) + 1;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag);
-        ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels);
-        ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec);
-        ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample);
-        ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign);
-        ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign - 1;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag);
-        ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels);
-        ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec);
-        ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample);
-        ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign);
-        ok(wfx.nAvgBytesPerSec == 44100 * 4 - 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec);
-
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag);
-        ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels);
-        ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec);
-        ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample);
-        ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign);
-        ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec);
-
-        wfx.wFormatTag = WAVE_FORMAT_ALAW;
-        wfx.nChannels = 2;
-        wfx.nSamplesPerSec = 44100;
-        wfx.wBitsPerSample = 16;
-        wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
-        wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-        rc = IDirectSoundBuffer_SetFormat(primary, &wfx);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(wfx.wFormatTag == WAVE_FORMAT_ALAW, "format: 0x%x\n", wfx.wFormatTag);
-        ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels);
-        ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec);
-        ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample);
-        ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign);
-        ok(wfx.nAvgBytesPerSec == 44100 * 4, "avgbytes: %u\n", wfx.nAvgBytesPerSec);
-
-        if(!gotdx8){
-            win_skip("Not doing the WAVE_FORMAT_EXTENSIBLE tests\n");
-            goto done;
-        }
-
-        fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
-        fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
-        fmtex.Format.nChannels = 2;
-        fmtex.Format.nSamplesPerSec = 44100;
-        fmtex.Format.wBitsPerSample = 16;
-        fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
-        fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
-        fmtex.Samples.wValidBitsPerSample = 0;
-        fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
-        fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
-        rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "format: 0x%x\n", fmtex.Format.wFormatTag);
-        ok(fmtex.Format.nChannels == 2, "channels: %u\n", fmtex.Format.nChannels);
-        ok(fmtex.Format.nSamplesPerSec == 44100, "rate: %u\n", fmtex.Format.nSamplesPerSec);
-        ok(fmtex.Format.wBitsPerSample == 16, "bps: %u\n", fmtex.Format.wBitsPerSample);
-        ok(fmtex.Format.nBlockAlign == 4, "blockalign: %u\n", fmtex.Format.nBlockAlign);
-        ok(fmtex.Format.nAvgBytesPerSec == 44100 * 4, "avgbytes: %u\n", fmtex.Format.nAvgBytesPerSec);
-        ok(fmtex.Samples.wValidBitsPerSample == 0 || /* <= XP */
-                fmtex.Samples.wValidBitsPerSample == 16, /* >= Vista */
-                "validbits: %u\n", fmtex.Samples.wValidBitsPerSample);
-        ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "subtype incorrect\n");
-
-        fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
-        fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
-        fmtex.Format.nChannels = 2;
-        fmtex.Format.nSamplesPerSec = 44100;
-        fmtex.Format.wBitsPerSample = 24;
-        fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
-        fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
-        fmtex.Samples.wValidBitsPerSample = 20;
-        fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
-        fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
-        rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex);
-        ok(rc == S_OK, "SetFormat: %08x\n", rc);
-
-        rc = IDirectSoundBuffer_GetFormat(primary, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL);
-        ok(rc == S_OK, "GetFormat: %08x\n", rc);
-        ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "format: 0x%x\n", fmtex.Format.wFormatTag);
-        ok(fmtex.Format.nChannels == 2, "channels: %u\n", fmtex.Format.nChannels);
-        ok(fmtex.Format.nSamplesPerSec == 44100, "rate: %u\n", fmtex.Format.nSamplesPerSec);
-        ok(fmtex.Format.wBitsPerSample == 24, "bps: %u\n", fmtex.Format.wBitsPerSample);
-        ok(fmtex.Format.nBlockAlign == 6, "blockalign: %u\n", fmtex.Format.nBlockAlign);
-        ok(fmtex.Format.nAvgBytesPerSec == 44100 * 6, "avgbytes: %u\n", fmtex.Format.nAvgBytesPerSec);
-        ok(fmtex.Samples.wValidBitsPerSample == 20, "validbits: %u\n", fmtex.Samples.wValidBitsPerSample);
-        ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "subtype incorrect\n");
-
-        fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
-        fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
-        fmtex.Format.nChannels = 2;
-        fmtex.Format.nSamplesPerSec = 44100;
-        fmtex.Format.wBitsPerSample = 24;
-        fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8;
-        fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign;
-        fmtex.Samples.wValidBitsPerSample = 32;
-        fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
-        fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
-        rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex);
-        ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc);
-
-        IDirectSoundBuffer_Release(primary);
+    if (rc==DS_OK && buffer!=NULL) {
+        perform_invalid_fmt_tests("primary", dso, buffer);
+        IDirectSoundBuffer_Release(buffer);
     }
 
-done:
+    perform_invalid_fmt_tests("secondary", dso, NULL);
+
     IDirectSound_Release(dso);
 
     return S_OK;
-- 
2.3.5




More information about the wine-patches mailing list