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