static HRESULT WINAPI IDirectSoundCaptureBufferImpl_QueryInterface(IDirectSoundCaptureBuffer8 *iface, REFIID riid, void **ppobj) { IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundCaptureBuffer8(iface); TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj ); if (ppobj == NULL) { WARN("invalid parameter\n"); return E_INVALIDARG; } *ppobj = NULL; if ( IsEqualGUID( &IID_IDirectSoundCaptureBuffer, riid ) || IsEqualGUID( &IID_IDirectSoundCaptureBuffer8, riid ) ) { IDirectSoundCaptureBuffer8_AddRef(iface); *ppobj = iface; return S_OK; } if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) { IDirectSoundNotify_AddRef(&This->IDirectSoundNotify_iface); *ppobj = &This->IDirectSoundNotify_iface; return S_OK; } FIXME("(%p,%s,%p) unsupported GUID\n", This, debugstr_guid(riid), ppobj); return E_NOINTERFACE; }
HRESULT WINAPI IDirectSoundCaptureBufferImpl_QueryInterface( LPDIRECTSOUNDCAPTUREBUFFER8 iface, IN REFIID riid, LPVOID* ppobj) { LPOLESTR pStr; LPCDirectSoundCaptureBufferImpl This = (LPCDirectSoundCaptureBufferImpl)CONTAINING_RECORD(iface, CDirectSoundCaptureBufferImpl, lpVtbl); /* check if requested interface is supported */ if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer) || IsEqualIID(riid, &IID_IDirectSoundCaptureBuffer8)) { *ppobj = (LPVOID)&This->lpVtbl; InterlockedIncrement(&This->ref); return S_OK; } /* check if the interface is supported */ if (IsEqualIID(riid, &IID_IDirectSoundNotify)) { if (!This->Notify) { HRESULT hr = NewDirectSoundNotify(&This->Notify, This->bLoop, This->bMix, This->hPin, This->BufferSize); if (FAILED(hr)) return hr; *ppobj = (LPVOID)This->Notify; return S_OK; } /* increment reference count on existing notify object */ IDirectSoundNotify_AddRef(This->Notify); *ppobj = (LPVOID)This->Notify; return S_OK; } /* interface not supported */ if (SUCCEEDED(StringFromIID(riid, &pStr))) { DPRINT("No Interface for class %s\n", pStr); CoTaskMemFree(pStr); } return E_NOINTERFACE; }
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); if (hr == E_INVALIDARG) { /* Old DirectX has only the 1st version of the DSCBUFFERDESC struct */ bufdesc.dwSize = sizeof(DSCBUFFERDESC1); 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 /* Win2k without DirectX9 */, "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); }