diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index 31e8f10db4c..78317e9ae9d 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -91,7 +91,6 @@ HRESULT WINAPI IDirectSoundCaptureImpl_Create( } HRESULT WINAPI DSOUND_CaptureCreate( - LPDIRECTSOUNDCAPTURE *ppDSC, IUnknown *pUnkOuter) { @@ -254,7 +253,7 @@ static HRESULT DirectSoundCaptureDevice_Create( { DirectSoundCaptureDevice * device; TRACE("(%p)\n", ppDevice); - + /* Allocate memory */ device = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectSoundCaptureDevice)); @@ -457,7 +456,7 @@ IDirectSoundCaptureImpl_QueryInterface( REFIID riid, LPVOID* ppobj ) { - DirectSoundCaptureDevice *This = ((IDirectSoundCaptureImpl *)iface)->device; + IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface; TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj ); if (ppobj == NULL) { @@ -467,16 +466,18 @@ IDirectSoundCaptureImpl_QueryInterface( *ppobj = NULL; - if (This->driver) { - HRESULT hres; - hres = IDsCaptureDriver_QueryInterface(This->driver, riid, ppobj); - if (hres != DS_OK) - WARN("IDsCaptureDriver_QueryInterface failed\n"); - return hres; + if (IsEqualIID(riid, &IID_IUnknown)) { + IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This); + *ppobj = This; + return DS_OK; + } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) { + IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This); + *ppobj = This; + return DS_OK; } WARN("unsupported riid: %s\n", debugstr_guid(riid)); - return E_FAIL; + return E_NOINTERFACE; } static ULONG WINAPI @@ -492,7 +493,6 @@ static ULONG DirectSoundCaptureDevice_Release( DirectSoundCaptureDevice * device) { ULONG ref; - TRACE("(%p) ref was %lu\n", device, device->ref); device->ref--; @@ -506,7 +506,7 @@ static ULONG DirectSoundCaptureDevice_Release( if (device->driver) { IDsCaptureDriver_Close(device->driver); IDsCaptureDriver_Release(device->driver); - } + } HeapFree(GetProcessHeap(), 0, device->pwfx); device->lock.DebugInfo->Spare[1] = 0; @@ -590,6 +590,11 @@ IDirectSoundCaptureImpl_GetCaps( IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface; TRACE("(%p,%p)\n",This,lpDSCCaps); + if (This->device == NULL) { + WARN("not initialized\n"); + return DSERR_UNINITIALIZED; + } + if (lpDSCCaps== NULL) { WARN("invalid parameter: lpDSCCaps== NULL\n"); return DSERR_INVALIDPARAM; @@ -601,11 +606,6 @@ IDirectSoundCaptureImpl_GetCaps( return DSERR_INVALIDPARAM; } - if ( !(This->device) ) { - WARN("not initialized\n"); - return DSERR_UNINITIALIZED; - } - lpDSCCaps->dwFlags = This->device->drvcaps.dwFlags; lpDSCCaps->dwFormats = This->device->drvcaps.dwFormats; lpDSCCaps->dwChannels = This->device->drvcaps.dwChannels; @@ -677,7 +677,7 @@ IDirectSoundCaptureImpl_Initialize( WARN("DirectSoundCaptureDevice_Create failed\n"); return err; } - + This->device = device; device->guid = devGUID; @@ -1771,10 +1771,7 @@ DSCCF_CreateInstance( *ppobj = NULL; if ( IsEqualGUID( &IID_IDirectSoundCapture, riid ) ) - return DSOUND_CaptureCreate((LPDIRECTSOUNDCAPTURE*)ppobj,pOuter); - - if ( IsEqualGUID( &IID_IDirectSoundCapture8, riid ) ) - return DSOUND_CaptureCreate8((LPDIRECTSOUNDCAPTURE8*)ppobj,pOuter); + return DSOUND_CaptureCreate8((LPDIRECTSOUNDCAPTURE*)ppobj,pOuter); WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); return E_NOINTERFACE; diff --git a/dlls/dsound/tests/capture.c b/dlls/dsound/tests/capture.c index 99af19dc80a..ec93e8cabb5 100644 --- a/dlls/dsound/tests/capture.c +++ b/dlls/dsound/tests/capture.c @@ -29,6 +29,7 @@ #include "dsound.h" #include "mmreg.h" #include "dxerr8.h" +#include "dsconf.h" #include "dsound_test.h" @@ -101,6 +102,163 @@ static char * format_string(WAVEFORMATEX* wfx) return str; } +static void IDirectSoundCapture_test(LPDIRECTSOUNDCAPTURE dsco, + BOOL initialized, LPCGUID lpGuid) +{ + HRESULT rc; + DSCCAPS dsccaps; + int ref; + IUnknown * unknown; + IDirectSoundCapture * dsc; + + /* Try to Query for objects */ + rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IUnknown, + (LPVOID*)&unknown); + ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IUnknown) " + "failed: %s\n", DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSoundCapture_Release(unknown); + + rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IDirectSoundCapture, + (LPVOID*)&dsc); + ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IDirectSoundCapture) " + "failed: %s\n", DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSoundCapture_Release(dsc); + + if (initialized == FALSE) { + /* try unitialized object */ + rc=IDirectSoundCapture_GetCaps(dsco,0); + ok(rc==DSERR_UNINITIALIZED, "IDirectSoundCapture_GetCaps(NULL) " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps); + ok(rc==DSERR_UNINITIALIZED,"IDirectSoundCapture_GetCaps() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSoundCapture_Initialize(dsco, lpGuid); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, + "IDirectSoundCapture_Initialize() failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DSERR_NODRIVER) { + trace(" No Driver\n"); + goto EXIT; + } else if (rc==E_FAIL) { + trace(" No Device\n"); + goto EXIT; + } else if (rc==DSERR_ALLOCATED) { + trace(" Already In Use\n"); + goto EXIT; + } + } + + rc=IDirectSoundCapture_Initialize(dsco, lpGuid); + ok(rc==DSERR_ALREADYINITIALIZED, "IDirectSoundCapture_Initialize() " + "should have returned DSERR_ALREADYINITIALIZED: %s\n", + DXGetErrorString8(rc)); + + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSoundCapture_GetCaps(dsco, 0); + ok(rc==DSERR_INVALIDPARAM, "IDirectSoundCapture_GetCaps(NULL) " + "should have returned DSERR_INVALIDPARAM, returned: %s\n", + DXGetErrorString8(rc)); + + ZeroMemory(&dsccaps, sizeof(dsccaps)); + + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSound_GetCaps(dsco, &dsccaps); + ok(rc==DSERR_INVALIDPARAM, "IDirectSound_GetCaps() " + "should have returned DSERR_INVALIDPARAM, returned: %s\n", + DXGetErrorString8(rc)); + + dsccaps.dwSize=sizeof(dsccaps); + + /* DSOUND: Running on a certified driver */ + rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps); + ok(rc==DS_OK, "IDirectSoundCapture_GetCaps() failed: %s\n", + DXGetErrorString8(rc)); + +EXIT: + ref=IDirectSoundCapture_Release(dsco); + ok(ref==0, "IDirectSoundCapture_Release() has %d references, " + "should have 0\n", ref); +} + +static void IDirectSoundCapture_tests() +{ + HRESULT rc; + LPDIRECTSOUNDCAPTURE dsco=NULL; + + trace("Testing IDirectSoundCapture\n"); + + /* try the COM class factory method of creation with no device specified */ + rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSoundCapture, (void**)&dsco); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n", + DXGetErrorString8(rc)); + if (dsco) + IDirectSoundCapture_test(dsco, FALSE, NULL); + + /* try the COM class factory method of creation with default capture + * device specified */ + rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSoundCapture, (void**)&dsco); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n", + DXGetErrorString8(rc)); + if (dsco) + IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultCapture); + + /* try the COM class factory method of creation with default voice + * capture device specified */ + rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSoundCapture, (void**)&dsco); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n", + DXGetErrorString8(rc)); + if (dsco) + IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultVoiceCapture); + + /* try the COM class factory method of creation with a bad + * IID specified */ + rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER, + &CLSID_DirectSoundPrivate, (void**)&dsco); + ok(rc==E_NOINTERFACE, + "CoCreateInstance(CLSID_DirectSoundCapture,CLSID_DirectSoundPrivate) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + /* try with no device specified */ + rc=DirectSoundCaptureCreate(NULL,&dsco,NULL); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, + "DirectSoundCaptureCreate(NULL) failed: %s\n",DXGetErrorString8(rc)); + if (rc==S_OK && dsco) + IDirectSoundCapture_test(dsco, TRUE, NULL); + + /* try with default capture device specified */ + rc=DirectSoundCaptureCreate(&DSDEVID_DefaultCapture,&dsco,NULL); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, + "DirectSoundCaptureCreate(DSDEVID_DefaultCapture) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK && dsco) + IDirectSoundCapture_test(dsco, TRUE, NULL); + + /* try with default voice capture device specified */ + rc=DirectSoundCaptureCreate(&DSDEVID_DefaultVoiceCapture,&dsco,NULL); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, + "DirectSoundCaptureCreate(DSDEVID_DefaultVoiceCapture) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK && dsco) + IDirectSoundCapture_test(dsco, TRUE, NULL); + + /* try with a bad device specified */ + rc=DirectSoundCaptureCreate(&DSDEVID_DefaultVoicePlayback,&dsco,NULL); + ok(rc==DSERR_NODRIVER, + "DirectSoundCaptureCreate(DSDEVID_DefaultVoicePlatback) " + "should have failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK && dsco) + IDirectSoundCapture_Release(dsco); +} + typedef struct { char* wave; DWORD wave_len; @@ -552,6 +710,7 @@ START_TEST(capture) return; } + IDirectSoundCapture_tests(); capture_tests(); CoUninitialize();