/*************************************************************************** * DirectSoundFullDuplexCreate [DSOUND.10] * * Create and initialize a DirectSoundFullDuplex interface. * * PARAMS * pcGuidCaptureDevice [I] Address of sound capture device GUID. * pcGuidRenderDevice [I] Address of sound render device GUID. * pcDSCBufferDesc [I] Address of capture buffer description. * pcDSBufferDesc [I] Address of render buffer description. * hWnd [I] Handle to application window. * dwLevel [I] Cooperative level. * ppDSFD [O] Address where full duplex interface returned. * ppDSCBuffer8 [0] Address where capture buffer interface returned. * ppDSBuffer8 [0] Address where render buffer interface returned. * pUnkOuter [I] Must be NULL. * * RETURNS * Success: DS_OK * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM, * DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER */ HRESULT WINAPI DirectSoundFullDuplexCreate( LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX *ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter) { HRESULT hres; IDirectSoundFullDuplexImpl *This = NULL; TRACE("(%s,%s,%p,%p,%p,%x,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); if (pUnkOuter) { WARN("pUnkOuter != 0\n"); *ppDSFD = NULL; return DSERR_NOAGGREGATION; } if (pcDSCBufferDesc == NULL) { WARN("invalid parameter: pcDSCBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (pcDSBufferDesc == NULL) { WARN("invalid parameter: pcDSBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSFD == NULL) { WARN("invalid parameter: ppDSFD == NULL\n"); return DSERR_INVALIDPARAM; } if (ppDSCBuffer8 == NULL) { WARN("invalid parameter: ppDSCBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSBuffer8 == NULL) { WARN("invalid parameter: ppDSBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } hres = DSOUND_FullDuplexCreate(&IID_IDirectSoundFullDuplex, (LPDIRECTSOUNDFULLDUPLEX*)&This); if (FAILED(hres)) return hres; hres = IDirectSoundFullDuplexImpl_Initialize((LPDIRECTSOUNDFULLDUPLEX)This, pcGuidCaptureDevice, pcGuidRenderDevice, pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8); if (hres != DS_OK) { IUnknown_Release((LPDIRECTSOUNDFULLDUPLEX)This); WARN("IDirectSoundFullDuplexImpl_Initialize failed\n"); *ppDSFD = NULL; } else *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This; return hres; }
/*************************************************************************** * DirectSoundFullDuplexCreate [DSOUND.10] * * Create and initialize a DirectSoundFullDuplex interface. * * PARAMS * pcGuidCaptureDevice [I] Address of sound capture device GUID. * pcGuidRenderDevice [I] Address of sound render device GUID. * pcDSCBufferDesc [I] Address of capture buffer description. * pcDSBufferDesc [I] Address of render buffer description. * hWnd [I] Handle to application window. * dwLevel [I] Cooperative level. * ppDSFD [O] Address where full duplex interface returned. * ppDSCBuffer8 [0] Address where capture buffer interface returned. * ppDSBuffer8 [0] Address where render buffer interface returned. * pUnkOuter [I] Must be NULL. * * RETURNS * Success: DS_OK * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM, * DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER */ HRESULT WINAPI DirectSoundFullDuplexCreate( LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX *ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter) { HRESULT hres; IDirectSoundFullDuplexImpl *This = NULL; TRACE("(%s,%s,%p,%p,%p,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); if (pUnkOuter) { WARN("pUnkOuter != 0\n"); *ppDSFD = NULL; return DSERR_NOAGGREGATION; } if (pcDSCBufferDesc == NULL) { WARN("invalid parameter: pcDSCBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (pcDSBufferDesc == NULL) { WARN("invalid parameter: pcDSBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSFD == NULL) { WARN("invalid parameter: ppDSFD == NULL\n"); return DSERR_INVALIDPARAM; } if (ppDSCBuffer8 == NULL) { WARN("invalid parameter: ppDSCBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSBuffer8 == NULL) { WARN("invalid parameter: ppDSBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } /* Get dsound configuration */ setup_dsound_options(); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); if (This == NULL) { WARN("out of memory\n"); *ppDSFD = NULL; return DSERR_OUTOFMEMORY; } This->lpVtbl = &dsfdvt; This->ref = 1; This->capture_device = NULL; This->renderer_device = NULL; hres = IDirectSoundFullDuplexImpl_Initialize((LPDIRECTSOUNDFULLDUPLEX)This, pcGuidCaptureDevice, pcGuidRenderDevice, pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8); if (hres != DS_OK) { HeapFree(GetProcessHeap(), 0, This); WARN("IDirectSoundFullDuplexImpl_Initialize failed\n"); *ppDSFD = NULL; } else *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This; return hres; }