Jesse Allen : dsound: Allow a special cbSize case in CreateSoundBuffer.

Alexandre Julliard julliard at winehq.org
Tue Apr 21 11:45:44 CDT 2009


Module: wine
Branch: master
Commit: b7f6c1e1031e34fefbf1ece44ac8a2f007acb31c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b7f6c1e1031e34fefbf1ece44ac8a2f007acb31c

Author: Jesse Allen <the3dfxdude at gmail.com>
Date:   Mon Apr 20 21:41:21 2009 -0700

dsound: Allow a special cbSize case in CreateSoundBuffer.

---

 dlls/dsound/dsound.c        |    6 +++++-
 dlls/dsound/tests/dsound8.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletions(-)

diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index 7032774..77a5928 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -1586,13 +1586,17 @@ HRESULT DirectSoundDevice_CreateSoundBuffer(
         }
         if (pwfxe->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE)
         {
+            /* check if cbSize is at least 22 bytes */
             if (pwfxe->Format.cbSize < (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)))
             {
                 WARN("Too small a cbSize %u\n", pwfxe->Format.cbSize);
                 return DSERR_INVALIDPARAM;
             }
 
-            if (pwfxe->Format.cbSize > (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)))
+            /* cbSize should be 22 bytes, with one possible exception */
+            if (pwfxe->Format.cbSize > (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)) &&
+                !(IsEqualGUID(&pwfxe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM) &&
+                pwfxe->Format.cbSize == sizeof(WAVEFORMATEXTENSIBLE)))
             {
                 WARN("Too big a cbSize %u\n", pwfxe->Format.cbSize);
                 return DSERR_CONTROLUNAVAIL;
diff --git a/dlls/dsound/tests/dsound8.c b/dlls/dsound/tests/dsound8.c
index c79a7ac..88fc666 100644
--- a/dlls/dsound/tests/dsound8.c
+++ b/dlls/dsound/tests/dsound8.c
@@ -780,8 +780,42 @@ static HRESULT test_secondary8(LPGUID lpGuid)
                 IDirectSoundBuffer_Release(secondary);
                 secondary=NULL;
             }
+
+            wfxe.Format.cbSize = sizeof(wfxe);
+            rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+            ok((rc==DSERR_CONTROLUNAVAIL || rc==DSERR_INVALIDCALL) && !secondary,
+                "IDirectSound_CreateSoundBuffer() returned: %08x %p\n",
+                rc, secondary);
+            if (secondary)
+            {
+                IDirectSoundBuffer_Release(secondary);
+                secondary=NULL;
+            }
+
             wfxe.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+            rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+            ok(rc==DS_OK && secondary,
+                "IDirectSound_CreateSoundBuffer() returned: %08x %p\n",
+                rc, secondary);
+            if (secondary)
+            {
+                IDirectSoundBuffer_Release(secondary);
+                secondary=NULL;
+            }
 
+            wfxe.Format.cbSize = sizeof(wfxe) + 1;
+            rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+            ok(((rc==DSERR_CONTROLUNAVAIL || DSERR_INVALIDCALL /* 2003 */) && !secondary)
+                || rc==DS_OK /* driver dependent? */,
+                "IDirectSound_CreateSoundBuffer() returned: %08x %p\n",
+                rc, secondary);
+            if (secondary)
+            {
+                IDirectSoundBuffer_Release(secondary);
+                secondary=NULL;
+            }
+
+            wfxe.Format.cbSize = sizeof(wfxe) - sizeof(wfx);
             ++wfxe.Samples.wValidBitsPerSample;
             rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
             ok(rc==DSERR_INVALIDPARAM && !secondary,




More information about the wine-cvs mailing list