From f46e5ce13cdb60de46fbfeac131bb051127f8aa5 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Thu, 2 Jun 2005 10:28:34 +0000 Subject: [PATCH] Move FullDuplex code from capture.c to duplex.c. --- dlls/dsound/Makefile.in | 1 + dlls/dsound/capture.c | 239 --------------------------------- dlls/dsound/duplex.c | 283 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 284 insertions(+), 239 deletions(-) create mode 100644 dlls/dsound/duplex.c diff --git a/dlls/dsound/Makefile.in b/dlls/dsound/Makefile.in index 3582783f869..4bc3aa1d5ff 100644 --- a/dlls/dsound/Makefile.in +++ b/dlls/dsound/Makefile.in @@ -12,6 +12,7 @@ C_SRCS = \ capture.c \ dsound.c \ dsound_main.c \ + duplex.c \ mixer.c \ primary.c \ propset.c \ diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index fe7e9b97c5a..15cc0feb1bf 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -20,7 +20,6 @@ */ /* * TODO: - * Implement DirectSoundFullDuplex support. * Implement FX support. */ @@ -53,20 +52,9 @@ static HRESULT DSOUND_CreateDirectSoundCaptureBuffer( IDirectSoundCaptureImpl *ipDSC, LPCDSCBUFFERDESC lpcDSCBufferDesc, LPVOID* ppobj ); -static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize( - LPDIRECTSOUNDFULLDUPLEX iface, - LPCGUID pCaptureGuid, - LPCGUID pRendererGuid, - LPCDSCBUFFERDESC lpDscBufferDesc, - LPCDSBUFFERDESC lpDsBufferDesc, - HWND hWnd, - DWORD dwLevel, - LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, - LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 ); static const IDirectSoundCaptureVtbl dscvt; static const IDirectSoundCaptureBuffer8Vtbl dscbvt; -static const IDirectSoundFullDuplexVtbl dsfdvt; static IDirectSoundCaptureImpl* dsound_capture = NULL; @@ -1632,230 +1620,3 @@ static const IClassFactoryVtbl DSCCF_Vtbl = }; IClassFactoryImpl DSOUND_CAPTURE_CF = { &DSCCF_Vtbl, 1 }; - -/*************************************************************************** - * 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) -{ - IDirectSoundFullDuplexImpl** ippDSFD=(IDirectSoundFullDuplexImpl**)ppDSFD; - TRACE("(%s,%s,%p,%p,%lx,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), - debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc, - (DWORD)hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); - - if ( pUnkOuter ) { - WARN("pUnkOuter != 0\n"); - return DSERR_NOAGGREGATION; - } - - *ippDSFD = HeapAlloc(GetProcessHeap(), - HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); - - if (*ippDSFD == NULL) { - WARN("out of memory\n"); - return DSERR_OUTOFMEMORY; - } else { - HRESULT hres; - IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)*ippDSFD; - - This->ref = 1; - This->lpVtbl = &dsfdvt; - - InitializeCriticalSection( &(This->lock) ); - This->lock.DebugInfo->Spare[1] = (DWORD)"DSDUPLEX_lock"; - - hres = IDirectSoundFullDuplexImpl_Initialize( (LPDIRECTSOUNDFULLDUPLEX)This, - pcGuidCaptureDevice, pcGuidRenderDevice, - pcDSCBufferDesc, pcDSBufferDesc, - hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8); - if (hres != DS_OK) - WARN("IDirectSoundFullDuplexImpl_Initialize failed\n"); - return hres; - } -} - -static HRESULT WINAPI -IDirectSoundFullDuplexImpl_QueryInterface( - LPDIRECTSOUNDFULLDUPLEX iface, - REFIID riid, - LPVOID* ppobj ) -{ - IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; - TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj ); - - if (ppobj == NULL) { - WARN("invalid parameter\n"); - return E_INVALIDARG; - } - - *ppobj = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI -IDirectSoundFullDuplexImpl_AddRef( LPDIRECTSOUNDFULLDUPLEX iface ) -{ - IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; - ULONG ref = InterlockedIncrement(&(This->ref)); - TRACE("(%p) ref was %ld\n", This, ref - 1); - return ref; -} - -static ULONG WINAPI -IDirectSoundFullDuplexImpl_Release( LPDIRECTSOUNDFULLDUPLEX iface ) -{ - IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; - ULONG ref = InterlockedDecrement(&(This->ref)); - TRACE("(%p) ref was %ld\n", This, ref - 1); - - if (!ref) { - This->lock.DebugInfo->Spare[1] = 0; - DeleteCriticalSection( &(This->lock) ); - HeapFree( GetProcessHeap(), 0, This ); - TRACE("(%p) released\n", This); - } - return ref; -} - -static HRESULT WINAPI -IDirectSoundFullDuplexImpl_Initialize( - LPDIRECTSOUNDFULLDUPLEX iface, - LPCGUID pCaptureGuid, - LPCGUID pRendererGuid, - LPCDSCBUFFERDESC lpDscBufferDesc, - LPCDSBUFFERDESC lpDsBufferDesc, - HWND hWnd, - DWORD dwLevel, - LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, - LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 ) -{ - IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; - IDirectSoundCaptureBufferImpl** ippdscb=(IDirectSoundCaptureBufferImpl**)lplpDirectSoundCaptureBuffer8; - IDirectSoundBufferImpl** ippdsc=(IDirectSoundBufferImpl**)lplpDirectSoundBuffer8; - - FIXME( "(%p,%s,%s,%p,%p,%lx,%lx,%p,%p) stub!\n", This, debugstr_guid(pCaptureGuid), - debugstr_guid(pRendererGuid), lpDscBufferDesc, lpDsBufferDesc, (DWORD)hWnd, dwLevel, - ippdscb, ippdsc); - - return E_FAIL; -} - -static const IDirectSoundFullDuplexVtbl dsfdvt = -{ - /* IUnknown methods */ - IDirectSoundFullDuplexImpl_QueryInterface, - IDirectSoundFullDuplexImpl_AddRef, - IDirectSoundFullDuplexImpl_Release, - - /* IDirectSoundFullDuplex methods */ - IDirectSoundFullDuplexImpl_Initialize -}; - -/******************************************************************************* - * DirectSoundFullDuplex ClassFactory - */ - -static HRESULT WINAPI -DSFDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - - FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); - return E_NOINTERFACE; -} - -static ULONG WINAPI -DSFDCF_AddRef(LPCLASSFACTORY iface) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - TRACE("(%p) ref was %ld\n", This, This->ref); - return InterlockedIncrement(&(This->ref)); -} - -static ULONG WINAPI -DSFDCF_Release(LPCLASSFACTORY iface) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - /* static class, won't be freed */ - TRACE("(%p) ref was %ld\n", This, This->ref); - return InterlockedDecrement(&(This->ref)); -} - -static HRESULT WINAPI -DSFDCF_CreateInstance( - LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj ) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - - TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); - - if (pOuter) { - WARN("aggregation not supported\n"); - return CLASS_E_NOAGGREGATION; - } - - if (ppobj == NULL) { - WARN("invalid parameter\n"); - return E_INVALIDARG; - } - - *ppobj = NULL; - - if ( IsEqualGUID( &IID_IDirectSoundFullDuplex, riid ) ) { - /* FIXME: how do we do this one ? */ - FIXME("not implemented\n"); - return E_NOINTERFACE; - } - - WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); - return E_NOINTERFACE; -} - -static HRESULT WINAPI -DSFDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - FIXME("(%p)->(%d),stub!\n",This,dolock); - return S_OK; -} - -static const IClassFactoryVtbl DSFDCF_Vtbl = -{ - DSFDCF_QueryInterface, - DSFDCF_AddRef, - DSFDCF_Release, - DSFDCF_CreateInstance, - DSFDCF_LockServer -}; - -IClassFactoryImpl DSOUND_FULLDUPLEX_CF = { &DSFDCF_Vtbl, 1 }; diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c new file mode 100644 index 00000000000..1fa585a46f4 --- /dev/null +++ b/dlls/dsound/duplex.c @@ -0,0 +1,283 @@ +/* DirectSoundFullDuplex + * + * Copyright 1998 Marcus Meissner + * Copyright 1998 Rob Riggs + * Copyright 2000-2001 TransGaming Technologies, Inc. + * Copyright 2005 Robert Reif + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + * TODO: + * Implement DirectSoundFullDuplex support. + */ + +#include + +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "mmddk.h" +#include "winreg.h" +#include "winternl.h" +#include "winnls.h" +#include "wine/debug.h" +#include "dsound.h" +#include "dsdriver.h" +#include "dsound_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dsound); + +static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize( + LPDIRECTSOUNDFULLDUPLEX iface, + LPCGUID pCaptureGuid, + LPCGUID pRendererGuid, + LPCDSCBUFFERDESC lpDscBufferDesc, + LPCDSBUFFERDESC lpDsBufferDesc, + HWND hWnd, + DWORD dwLevel, + LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, + LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 ); + +static const IDirectSoundFullDuplexVtbl dsfdvt; + +/*************************************************************************** + * 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) +{ + IDirectSoundFullDuplexImpl** ippDSFD=(IDirectSoundFullDuplexImpl**)ppDSFD; + TRACE("(%s,%s,%p,%p,%lx,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), + debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc, + (DWORD)hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); + + if ( pUnkOuter ) { + WARN("pUnkOuter != 0\n"); + return DSERR_NOAGGREGATION; + } + + *ippDSFD = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); + + if (*ippDSFD == NULL) { + WARN("out of memory\n"); + return DSERR_OUTOFMEMORY; + } else { + HRESULT hres; + IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)*ippDSFD; + + This->ref = 1; + This->lpVtbl = &dsfdvt; + + InitializeCriticalSection( &(This->lock) ); + This->lock.DebugInfo->Spare[1] = (DWORD)"DSDUPLEX_lock"; + + hres = IDirectSoundFullDuplexImpl_Initialize( (LPDIRECTSOUNDFULLDUPLEX)This, + pcGuidCaptureDevice, pcGuidRenderDevice, + pcDSCBufferDesc, pcDSBufferDesc, + hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8); + if (hres != DS_OK) + WARN("IDirectSoundFullDuplexImpl_Initialize failed\n"); + return hres; + } +} + +static HRESULT WINAPI +IDirectSoundFullDuplexImpl_QueryInterface( + LPDIRECTSOUNDFULLDUPLEX iface, + REFIID riid, + LPVOID* ppobj ) +{ + IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; + TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj ); + + if (ppobj == NULL) { + WARN("invalid parameter\n"); + return E_INVALIDARG; + } + + *ppobj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI +IDirectSoundFullDuplexImpl_AddRef( LPDIRECTSOUNDFULLDUPLEX iface ) +{ + IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; + ULONG ref = InterlockedIncrement(&(This->ref)); + TRACE("(%p) ref was %ld\n", This, ref - 1); + return ref; +} + +static ULONG WINAPI +IDirectSoundFullDuplexImpl_Release( LPDIRECTSOUNDFULLDUPLEX iface ) +{ + IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; + ULONG ref = InterlockedDecrement(&(This->ref)); + TRACE("(%p) ref was %ld\n", This, ref - 1); + + if (!ref) { + This->lock.DebugInfo->Spare[1] = 0; + DeleteCriticalSection( &(This->lock) ); + HeapFree( GetProcessHeap(), 0, This ); + TRACE("(%p) released\n", This); + } + return ref; +} + +static HRESULT WINAPI +IDirectSoundFullDuplexImpl_Initialize( + LPDIRECTSOUNDFULLDUPLEX iface, + LPCGUID pCaptureGuid, + LPCGUID pRendererGuid, + LPCDSCBUFFERDESC lpDscBufferDesc, + LPCDSBUFFERDESC lpDsBufferDesc, + HWND hWnd, + DWORD dwLevel, + LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8, + LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 ) +{ + IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface; + IDirectSoundCaptureBufferImpl** ippdscb=(IDirectSoundCaptureBufferImpl**)lplpDirectSoundCaptureBuffer8; + IDirectSoundBufferImpl** ippdsc=(IDirectSoundBufferImpl**)lplpDirectSoundBuffer8; + + FIXME( "(%p,%s,%s,%p,%p,%lx,%lx,%p,%p) stub!\n", This, debugstr_guid(pCaptureGuid), + debugstr_guid(pRendererGuid), lpDscBufferDesc, lpDsBufferDesc, (DWORD)hWnd, dwLevel, + ippdscb, ippdsc); + + return E_FAIL; +} + +static const IDirectSoundFullDuplexVtbl dsfdvt = +{ + /* IUnknown methods */ + IDirectSoundFullDuplexImpl_QueryInterface, + IDirectSoundFullDuplexImpl_AddRef, + IDirectSoundFullDuplexImpl_Release, + + /* IDirectSoundFullDuplex methods */ + IDirectSoundFullDuplexImpl_Initialize +}; + +/******************************************************************************* + * DirectSoundFullDuplex ClassFactory + */ + +static HRESULT WINAPI +DSFDCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + + FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI +DSFDCF_AddRef(LPCLASSFACTORY iface) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + TRACE("(%p) ref was %ld\n", This, This->ref); + return InterlockedIncrement(&(This->ref)); +} + +static ULONG WINAPI +DSFDCF_Release(LPCLASSFACTORY iface) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + /* static class, won't be freed */ + TRACE("(%p) ref was %ld\n", This, This->ref); + return InterlockedDecrement(&(This->ref)); +} + +static HRESULT WINAPI +DSFDCF_CreateInstance( + LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj ) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + + TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); + + if (pOuter) { + WARN("aggregation not supported\n"); + return CLASS_E_NOAGGREGATION; + } + + if (ppobj == NULL) { + WARN("invalid parameter\n"); + return E_INVALIDARG; + } + + *ppobj = NULL; + + if ( IsEqualGUID( &IID_IDirectSoundFullDuplex, riid ) ) { + /* FIXME: how do we do this one ? */ + FIXME("not implemented\n"); + return E_NOINTERFACE; + } + + WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj); + return E_NOINTERFACE; +} + +static HRESULT WINAPI +DSFDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + FIXME("(%p)->(%d),stub!\n",This,dolock); + return S_OK; +} + +static const IClassFactoryVtbl DSFDCF_Vtbl = +{ + DSFDCF_QueryInterface, + DSFDCF_AddRef, + DSFDCF_Release, + DSFDCF_CreateInstance, + DSFDCF_LockServer +}; + +IClassFactoryImpl DSOUND_FULLDUPLEX_CF = { &DSFDCF_Vtbl, 1 };