From: Michael Stefaniuc Subject: [PATCH 2/3] dsound: Merge IKsPropertySet into the secondary buffer object. Message-Id: <20120117005310.GB14506@redhat.com> Date: Tue, 17 Jan 2012 01:53:10 +0100 --- dlls/dsound/buffer.c | 104 +++++++++++++---------------------------- dlls/dsound/dsound_private.h | 25 +--------- 2 files changed, 36 insertions(+), 93 deletions(-) diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index d76d837..b905782 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -829,15 +829,9 @@ static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(IDirectSoundBuffer8 } if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) { - if (!This->iks) - IKsBufferPropertySetImpl_Create(This, &(This->iks)); - if (This->iks) { - IKsPropertySet_AddRef((LPKSPROPERTYSET)This->iks); - *ppobj = This->iks; - return S_OK; - } - WARN("IID_IKsPropertySet\n"); - return E_NOINTERFACE; + IKsPropertySet_AddRef(&This->IKsPropertySet_iface); + *ppobj = &This->IKsPropertySet_iface; + return S_OK; } FIXME( "Unknown IID %s\n", debugstr_guid( riid ) ); @@ -901,10 +895,11 @@ HRESULT IDirectSoundBufferImpl_Create( TRACE("Created buffer at %p\n", dsb); dsb->ref = 0; + dsb->refiks = 0; dsb->numIfaces = 0; dsb->device = device; dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt; - dsb->iks = NULL; + dsb->IKsPropertySet_iface.lpVtbl = &iksbvt; /* size depends on version */ CopyMemory(&dsb->dsbd, dsbd, dsbd->dwSize); @@ -1045,12 +1040,6 @@ HRESULT IDirectSoundBufferImpl_Destroy( * this object until it is ready to be deleted */ InterlockedIncrement(&pdsb->numIfaces); - if (pdsb->iks) { - WARN("iks not NULL\n"); - IKsBufferPropertySetImpl_Destroy(pdsb->iks); - pdsb->iks = NULL; - } - if (pdsb->ds3db) { WARN("ds3db not NULL\n"); IDirectSound3DBufferImpl_Destroy(pdsb->ds3db); @@ -1094,8 +1083,9 @@ HRESULT IDirectSoundBufferImpl_Duplicate( dsb->buffer->ref++; list_add_head(&dsb->buffer->buffers, &dsb->entry); - dsb->ref = 1; - dsb->numIfaces = 1; + dsb->ref = 0; + dsb->refiks = 0; + dsb->numIfaces = 0; dsb->state = STATE_STOPPED; dsb->buf_mixpos = dsb->sec_mixpos = 0; dsb->notify = NULL; @@ -1103,7 +1093,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate( dsb->nrofnotifies = 0; dsb->device = device; dsb->ds3db = NULL; - dsb->iks = NULL; /* FIXME? */ DSOUND_RecalcFormat(dsb); RtlInitializeResource(&dsb->lock); @@ -1119,6 +1108,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate( dsb = NULL; } + IDirectSoundBuffer8_AddRef(&dsb->IDirectSoundBuffer8_iface); *ppdsb = dsb; return hres; } @@ -1127,36 +1117,44 @@ HRESULT IDirectSoundBufferImpl_Duplicate( * IKsPropertySet */ +static inline IDirectSoundBufferImpl *impl_from_IKsPropertySet(IKsPropertySet *iface) +{ + return CONTAINING_RECORD(iface, IDirectSoundBufferImpl, IKsPropertySet_iface); +} + /* IUnknown methods */ static HRESULT WINAPI IKsPropertySetImpl_QueryInterface(IKsPropertySet *iface, REFIID riid, void **ppobj) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); + TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj); - return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj); + return IDirectSoundBuffer_QueryInterface(&This->IDirectSoundBuffer8_iface, riid, ppobj); } static ULONG WINAPI IKsPropertySetImpl_AddRef(IKsPropertySet *iface) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; - ULONG ref = InterlockedIncrement(&(This->ref)); + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); + ULONG ref = InterlockedIncrement(&This->refiks); + TRACE("(%p) ref was %d\n", This, ref - 1); + + if(ref == 1) + InterlockedIncrement(&This->numIfaces); + return ref; } static ULONG WINAPI IKsPropertySetImpl_Release(IKsPropertySet *iface) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; - ULONG ref = InterlockedDecrement(&(This->ref)); + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); + ULONG ref = InterlockedDecrement(&This->refiks); + TRACE("(%p) ref was %d\n", This, ref + 1); - if (!ref) { - This->dsb->iks = 0; - IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb); - HeapFree(GetProcessHeap(), 0, This); - TRACE("(%p) released\n", This); - } + if (!ref && !InterlockedDecrement(&This->numIfaces)) + secondarybuffer_destroy(This); return ref; } @@ -1164,7 +1162,7 @@ static HRESULT WINAPI IKsPropertySetImpl_Get(IKsPropertySet *iface, REFGUID guid ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData, ULONG *pcbReturned) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); TRACE("(iface=%p,guidPropSet=%s,dwPropID=%d,pInstanceData=%p,cbInstanceData=%d,pPropData=%p,cbPropData=%d,pcbReturned=%p)\n", This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned); @@ -1176,7 +1174,7 @@ static HRESULT WINAPI IKsPropertySetImpl_Set(IKsPropertySet *iface, REFGUID guid ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData, ULONG cbPropData) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); TRACE("(%p,%s,%d,%p,%d,%p,%d)\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData); @@ -1186,14 +1184,14 @@ static HRESULT WINAPI IKsPropertySetImpl_Set(IKsPropertySet *iface, REFGUID guid static HRESULT WINAPI IKsPropertySetImpl_QuerySupport(IKsPropertySet *iface, REFGUID guidPropSet, ULONG dwPropID, ULONG *pTypeSupport) { - IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface; + IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface); TRACE("(%p,%s,%d,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport); return E_PROP_ID_UNSUPPORTED; } -static const IKsPropertySetVtbl iksbvt = { +const IKsPropertySetVtbl iksbvt = { IKsPropertySetImpl_QueryInterface, IKsPropertySetImpl_AddRef, IKsPropertySetImpl_Release, @@ -1201,39 +1199,3 @@ static const IKsPropertySetVtbl iksbvt = { IKsPropertySetImpl_Set, IKsPropertySetImpl_QuerySupport }; - -HRESULT IKsBufferPropertySetImpl_Create( - IDirectSoundBufferImpl *dsb, - IKsBufferPropertySetImpl **piks) -{ - IKsBufferPropertySetImpl *iks; - TRACE("(%p,%p)\n",dsb,piks); - *piks = NULL; - - iks = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*iks)); - if (iks == 0) { - WARN("out of memory\n"); - *piks = NULL; - return DSERR_OUTOFMEMORY; - } - - iks->ref = 0; - iks->dsb = dsb; - dsb->iks = iks; - iks->lpVtbl = &iksbvt; - - IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb); - - *piks = iks; - return S_OK; -} - -HRESULT IKsBufferPropertySetImpl_Destroy( - IKsBufferPropertySetImpl *piks) -{ - TRACE("(%p)\n",piks); - - while (IKsPropertySetImpl_Release((LPKSPROPERTYSET)piks) > 0); - - return S_OK; -} diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index d945b41..92faff7 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -50,7 +50,6 @@ typedef struct IDirectSoundCaptureImpl IDirectSoundCaptureImpl; typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl; typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl; typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl; -typedef struct IKsBufferPropertySetImpl IKsBufferPropertySetImpl; typedef struct DirectSoundDevice DirectSoundDevice; typedef struct DirectSoundCaptureDevice DirectSoundCaptureDevice; @@ -166,8 +165,9 @@ struct IDirectSoundBufferImpl { IDirectSoundBuffer8 IDirectSoundBuffer8_iface; IDirectSound3DListener IDirectSound3DListener_iface; /* only primary buffer */ + IKsPropertySet IKsPropertySet_iface; LONG numIfaces; /* "in use interfaces" refcount */ - LONG ref, ref3D; + LONG ref, ref3D, refiks; /* IDirectSoundBufferImpl fields */ DirectSoundDevice* device; RTL_RWLOCK lock; @@ -194,9 +194,7 @@ struct IDirectSoundBufferImpl DS3DBUFFER ds3db_ds3db; LONG ds3db_lVolume; BOOL ds3db_need_recalc; - /* IKsPropertySet fields */ - IKsBufferPropertySetImpl* iks; bitsconvertfunc convert; struct list entry; }; @@ -213,6 +211,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate( IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN; void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN; const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN; +const IKsPropertySetVtbl iksbvt DECLSPEC_HIDDEN; /***************************************************************************** * DirectSoundCaptureDevice implementation structure @@ -259,24 +258,6 @@ struct IDirectSoundCaptureBufferImpl int nrofnotifies; }; -/***************************************************************************** - * IKsBufferPropertySet implementation structure - */ -struct IKsBufferPropertySetImpl -{ - /* IUnknown fields */ - const IKsPropertySetVtbl *lpVtbl; - LONG ref; - /* IKsPropertySetImpl fields */ - IDirectSoundBufferImpl* dsb; -}; - -HRESULT IKsBufferPropertySetImpl_Create( - IDirectSoundBufferImpl *dsb, - IKsBufferPropertySetImpl **piks) DECLSPEC_HIDDEN; -HRESULT IKsBufferPropertySetImpl_Destroy( - IKsBufferPropertySetImpl *piks) DECLSPEC_HIDDEN; - HRESULT IKsPrivatePropertySetImpl_Create(REFIID riid, IKsPropertySet **piks) DECLSPEC_HIDDEN; /***************************************************************************** -- 1.7.6.5