From 66361f1bd532b685cad5ddd82ddea469f0633eac Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Thu, 12 Jan 2012 00:40:31 +0100 Subject: [PATCH] dsound/tests: Add some COM tests for capture. --- dlls/dsound/tests/capture.c | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/dlls/dsound/tests/capture.c b/dlls/dsound/tests/capture.c index 02ef46a0590..cb53a0226ae 100644 --- a/dlls/dsound/tests/capture.c +++ b/dlls/dsound/tests/capture.c @@ -666,6 +666,68 @@ static void test_enumerate(void) ok(rc==DS_OK,"DirectSoundCaptureEnumerateA() failed: %08x\n", rc); } +static void test_COM(void) +{ + IDirectSoundCapture *dsc = (IDirectSoundCapture*)0xdeadbeef; + IDirectSoundCaptureBuffer *buffer = (IDirectSoundCaptureBuffer*)0xdeadbeef; + IDirectSoundNotify *notify; + DSCBUFFERDESC bufdesc; + WAVEFORMATEX wfx; + HRESULT hr; + ULONG refcount; + + hr = pDirectSoundCaptureCreate(NULL, &dsc, (IUnknown*)0xdeadbeef); + ok(hr == DSERR_NOAGGREGATION, + "DirectSoundCaptureCreate failed: %08x, expected DSERR_NOAGGREGATION\n", hr); + ok(dsc == (IDirectSoundCapture*)0xdeadbeef, "dsc = %p\n", dsc); + + hr = pDirectSoundCaptureCreate(NULL, &dsc, NULL); + if (hr == DSERR_NODRIVER) { + skip("No driver\n"); + return; + } + ok(hr == DS_OK, "DirectSoundCaptureCreate failed: %08x, expected DS_OK\n", hr); + + init_format(&wfx, WAVE_FORMAT_PCM, 44100, 16, 1); + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; + bufdesc.lpwfxFormat = &wfx; + + hr = IDirectSoundCapture_CreateCaptureBuffer(dsc, &bufdesc, &buffer, (IUnknown*)0xdeadbeef); + ok(hr == DSERR_NOAGGREGATION, + "IDirectSoundCapture_CreateCaptureBuffer failed: %08x, expected DSERR_NOAGGREGATION\n", hr); + ok(buffer == (IDirectSoundCaptureBuffer*)0xdeadbeef, "buffer = %p\n", buffer); + + hr = IDirectSoundCapture_CreateCaptureBuffer(dsc, &bufdesc, &buffer, NULL); + ok(hr == DS_OK, "IDirectSoundCapture_CreateCaptureBuffer failed: %08x, expected DS_OK\n", hr); + + /* IDirectSoundCaptureBuffer and IDirectSoundNotify have separate refcounts */ + IDirectSoundCaptureBuffer_AddRef(buffer); + refcount = IDirectSoundCaptureBuffer_AddRef(buffer); + ok(refcount == 3, "IDirectSoundCaptureBuffer refcount is %u, expected 3\n", refcount); + hr = IDirectSoundCaptureBuffer_QueryInterface(buffer, &IID_IDirectSoundNotify, (void**)¬ify); + ok(hr == DS_OK, "IDirectSoundCapture_QueryInterface failed: %08x, expected DS_OK\n", hr); + refcount = IDirectSoundNotify_AddRef(notify); + ok(refcount == 2, "IDirectSoundNotify refcount is %u, expected 2\n", refcount); + IDirectSoundCaptureBuffer_AddRef(buffer); + refcount = IDirectSoundCaptureBuffer_Release(buffer); + ok(refcount == 3, "IDirectSoundCaptureBuffer refcount is %u, expected 3\n", refcount); + + /* Release IDirectSoundCaptureBuffer while keeping IDirectSoundNotify alive */ + while (IDirectSoundCaptureBuffer_Release(buffer) > 0); + refcount = IDirectSoundNotify_AddRef(notify); + ok(refcount == 3, "IDirectSoundNotify refcount is %u, expected 3\n", refcount); + refcount = IDirectSoundCaptureBuffer_AddRef(buffer); + ok(refcount == 1, "IDirectSoundCaptureBuffer refcount is %u, expected 1\n", refcount); + + while (IDirectSoundNotify_Release(notify) > 0); + refcount = IDirectSoundCaptureBuffer_Release(buffer); + ok(refcount == 0, "IDirectSoundCaptureBuffer refcount is %u, expected 0\n", refcount); + refcount = IDirectSoundCapture_Release(dsc); + ok(refcount == 0, "IDirectSoundCapture refcount is %u, expected 0\n", refcount); +} + START_TEST(capture) { HMODULE hDsound; @@ -685,6 +747,7 @@ START_TEST(capture) return; } + test_COM(); test_capture(); test_enumerate();