From c75d8e66a565ded14a5772f416460bba03c0565e Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Wed, 13 Feb 2019 01:56:16 +0000 Subject: [PATCH] dsound: IDirectSoundNotify is only available when DSBCAPS_CTRLPOSITIONNOTIFY is specified. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45473 Signed-off-by: Alistair Leslie-Hughes Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard (cherry picked from commit 9a258c5dd7e45fb37e15a6ba69734544318303f2) Signed-off-by: Michael Stefaniuc --- dlls/dsound/buffer.c | 9 +++++++-- dlls/dsound/tests/dsound.c | 13 +++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 5262628528a..2a328ed32ac 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -923,11 +923,16 @@ static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(IDirectSoundBuffer8 return S_OK; } - if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) { + if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) { + if(This->dsbd.dwFlags & DSBCAPS_CTRLPOSITIONNOTIFY) { IDirectSoundNotify_AddRef(&This->IDirectSoundNotify_iface); *ppobj = &This->IDirectSoundNotify_iface; return S_OK; - } + } + + TRACE( "App requested IDirectSoundNotify without DSBCAPS_CTRLPOSITIONNOTIFY flag.\n"); + return E_NOINTERFACE; + } if ( IsEqualGUID( &IID_IDirectSound3DBuffer, riid ) ) { if(This->dsbd.dwFlags & DSBCAPS_CTRL3D){ diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c index 89f0aa03fff..41818deb171 100644 --- a/dlls/dsound/tests/dsound.c +++ b/dlls/dsound/tests/dsound.c @@ -1561,6 +1561,19 @@ static void test_notifications(LPGUID lpGuid) wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize = 0; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2; + bufdesc.dwBufferBytes = wfx.nSamplesPerSec * wfx.nBlockAlign / 2; /* 0.5s */ + bufdesc.lpwfxFormat = &wfx; + rc = IDirectSound_CreateSoundBuffer(dso, &bufdesc, &buf, NULL); + ok(rc == DS_OK && buf != NULL, "IDirectSound_CreateSoundBuffer() failed " + "to create a buffer %08x\n", rc); + + rc = IDirectSoundBuffer_QueryInterface(buf, &IID_IDirectSoundNotify, (void**)&buf_notif); + ok(rc == E_NOINTERFACE, "QueryInterface(IID_IDirectSoundNotify): %08x\n", rc); + IDirectSoundBuffer_Release(buf); + ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize = sizeof(bufdesc); bufdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY;