Module: wine Branch: master Commit: b7f6c1e1031e34fefbf1ece44ac8a2f007acb31c URL: http://source.winehq.org/git/wine.git/?a=commit;h=b7f6c1e1031e34fefbf1ece44a...
Author: Jesse Allen the3dfxdude@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,