[PATCH 10/15] dsound: Merge IUnknown into the main DirectSoundFullDuplex object.
Michael Stefaniuc
mstefani at redhat.de
Wed Aug 15 18:43:25 CDT 2012
---
dlls/dsound/duplex.c | 121 ++++++++++++++++----------------------------------
1 files changed, 39 insertions(+), 82 deletions(-)
diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c
index 0e9320a..7ec8590 100644
--- a/dlls/dsound/duplex.c
+++ b/dlls/dsound/duplex.c
@@ -42,23 +42,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound);
*/
typedef struct IDirectSoundFullDuplexImpl
{
+ IUnknown IUnknown_iface;
IDirectSoundFullDuplex IDirectSoundFullDuplex_iface;
- LONG ref, numIfaces;
+ LONG ref, refdsfd, numIfaces;
/* IDirectSoundFullDuplexImpl fields */
IDirectSound8 *renderer_device;
IDirectSoundCapture *capture_device;
-
- LPUNKNOWN pUnknown;
LPDIRECTSOUND8 pDS8;
LPDIRECTSOUNDCAPTURE pDSC;
} IDirectSoundFullDuplexImpl;
-typedef struct IDirectSoundFullDuplex_IUnknown {
- const IUnknownVtbl *lpVtbl;
- LONG ref;
- IDirectSoundFullDuplexImpl *pdsfd;
-} IDirectSoundFullDuplex_IUnknown;
-
typedef struct IDirectSoundFullDuplex_IDirectSound8 {
const IDirectSound8Vtbl *lpVtbl;
LONG ref;
@@ -82,81 +75,51 @@ static void fullduplex_destroy(IDirectSoundFullDuplexImpl *This)
}
/*******************************************************************************
- * IUnknown
+ * IUnknown implemetation for DirectSoundFullDuplex
*/
-static HRESULT WINAPI IDirectSoundFullDuplex_IUnknown_QueryInterface(
- LPUNKNOWN iface,
- REFIID riid,
- LPVOID * ppobj)
+static inline IDirectSoundFullDuplexImpl *impl_from_IUnknown(IUnknown *iface)
{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundFullDuplex_QueryInterface((LPDIRECTSOUNDFULLDUPLEX)This->pdsfd, riid, ppobj);
+ return CONTAINING_RECORD(iface, IDirectSoundFullDuplexImpl, IUnknown_iface);
}
-static ULONG WINAPI IDirectSoundFullDuplex_IUnknown_AddRef(
- LPUNKNOWN iface)
+static HRESULT WINAPI IUnknownImpl_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
+ IDirectSoundFullDuplexImpl *This = impl_from_IUnknown(iface);
+ TRACE("(%p,%s,%p)\n", This, debugstr_guid(riid), ppv);
+ return IDirectSoundFullDuplex_QueryInterface(&This->IDirectSoundFullDuplex_iface, riid, ppv);
}
-static ULONG WINAPI IDirectSoundFullDuplex_IUnknown_Release(
- LPUNKNOWN iface)
+static ULONG WINAPI IUnknownImpl_AddRef(IUnknown *iface)
{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- This->pdsfd->pUnknown = NULL;
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
+ IDirectSoundFullDuplexImpl *This = impl_from_IUnknown(iface);
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) ref=%d\n", This, ref);
+
+ if(ref == 1)
+ InterlockedIncrement(&This->numIfaces);
return ref;
}
-static const IUnknownVtbl DirectSoundFullDuplex_Unknown_Vtbl =
-{
- IDirectSoundFullDuplex_IUnknown_QueryInterface,
- IDirectSoundFullDuplex_IUnknown_AddRef,
- IDirectSoundFullDuplex_IUnknown_Release
-};
-
-static HRESULT IDirectSoundFullDuplex_IUnknown_Create(
- LPDIRECTSOUNDFULLDUPLEX pdsfd,
- LPUNKNOWN * ppunk)
+static ULONG WINAPI IUnknownImpl_Release(IUnknown *iface)
{
- IDirectSoundFullDuplex_IUnknown * pdsfdunk;
- TRACE("(%p,%p)\n",pdsfd,ppunk);
-
- if (pdsfd == NULL) {
- ERR("invalid parameter: pdsfd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppunk == NULL) {
- ERR("invalid parameter: ppunk == NULL\n");
- return DSERR_INVALIDPARAM;
- }
+ IDirectSoundFullDuplexImpl *This = impl_from_IUnknown(iface);
+ ULONG ref = InterlockedDecrement(&This->ref);
- pdsfdunk = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfdunk));
- if (pdsfdunk == NULL) {
- WARN("out of memory\n");
- *ppunk = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsfdunk->lpVtbl = &DirectSoundFullDuplex_Unknown_Vtbl;
- pdsfdunk->ref = 0;
- pdsfdunk->pdsfd = (IDirectSoundFullDuplexImpl *)pdsfd;
-
- *ppunk = (LPUNKNOWN)pdsfdunk;
+ TRACE("(%p) ref=%d\n", This, ref);
- return DS_OK;
+ if (!ref && !InterlockedDecrement(&This->numIfaces))
+ fullduplex_destroy(This);
+ return ref;
}
+static const IUnknownVtbl unk_vtbl =
+{
+ IUnknownImpl_QueryInterface,
+ IUnknownImpl_AddRef,
+ IUnknownImpl_Release
+};
+
/*******************************************************************************
* IDirectSoundFullDuplex_IDirectSound8
*/
@@ -457,7 +420,7 @@ static inline IDirectSoundFullDuplexImpl *impl_from_IDirectSoundFullDuplex(IDire
static ULONG WINAPI IDirectSoundFullDuplexImpl_AddRef(IDirectSoundFullDuplex *iface)
{
IDirectSoundFullDuplexImpl *This = impl_from_IDirectSoundFullDuplex(iface);
- ULONG ref = InterlockedIncrement(&(This->ref));
+ ULONG ref = InterlockedIncrement(&This->refdsfd);
TRACE("(%p) ref=%d\n", This, ref);
@@ -480,16 +443,8 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_QueryInterface(IDirectSoundFull
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown)) {
- if (!This->pUnknown) {
- IDirectSoundFullDuplex_IUnknown_Create(iface, &This->pUnknown);
- if (!This->pUnknown) {
- WARN("IDirectSoundFullDuplex_IUnknown_Create() failed\n");
- *ppv = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSoundFullDuplex_IUnknown_AddRef(This->pUnknown);
- *ppv = This->pUnknown;
+ IUnknown_AddRef(&This->IUnknown_iface);
+ *ppv = &This->IUnknown_iface;
return S_OK;
} else if (IsEqualIID(riid, &IID_IDirectSoundFullDuplex)) {
IDirectSoundFullDuplexImpl_AddRef(iface);
@@ -528,7 +483,7 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_QueryInterface(IDirectSoundFull
static ULONG WINAPI IDirectSoundFullDuplexImpl_Release(IDirectSoundFullDuplex *iface)
{
IDirectSoundFullDuplexImpl *This = impl_from_IDirectSoundFullDuplex(iface);
- ULONG ref = InterlockedDecrement(&(This->ref));
+ ULONG ref = InterlockedDecrement(&This->refdsfd);
TRACE("(%p) ref=%d\n", This, ref);
@@ -641,11 +596,13 @@ HRESULT DSOUND_FullDuplexCreate(REFIID riid, void **ppv)
setup_dsound_options();
obj->IDirectSoundFullDuplex_iface.lpVtbl = &dsfd_vtbl;
+ obj->IUnknown_iface.lpVtbl = &unk_vtbl;
obj->ref = 1;
+ obj->refdsfd = 0;
obj->numIfaces = 1;
- hr = IUnknown_QueryInterface((IUnknown*)obj, riid, ppv);
- IUnknown_Release((IUnknown*)obj);
+ hr = IUnknown_QueryInterface(&obj->IUnknown_iface, riid, ppv);
+ IUnknown_Release(&obj->IUnknown_iface);
return hr;
}
--
1.7.6.5
More information about the wine-patches
mailing list