dsound: Merge IKsPropertySet into the secondary buffer object.
This commit is contained in:
parent
fd04e770f1
commit
48ca5924b4
|
@ -829,15 +829,9 @@ static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(IDirectSoundBuffer8
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
|
if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
|
||||||
if (!This->iks)
|
IKsPropertySet_AddRef(&This->IKsPropertySet_iface);
|
||||||
IKsBufferPropertySetImpl_Create(This, &(This->iks));
|
*ppobj = &This->IKsPropertySet_iface;
|
||||||
if (This->iks) {
|
return S_OK;
|
||||||
IKsPropertySet_AddRef((LPKSPROPERTYSET)This->iks);
|
|
||||||
*ppobj = This->iks;
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
WARN("IID_IKsPropertySet\n");
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
|
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
|
||||||
|
@ -901,10 +895,11 @@ HRESULT IDirectSoundBufferImpl_Create(
|
||||||
TRACE("Created buffer at %p\n", dsb);
|
TRACE("Created buffer at %p\n", dsb);
|
||||||
|
|
||||||
dsb->ref = 0;
|
dsb->ref = 0;
|
||||||
|
dsb->refiks = 0;
|
||||||
dsb->numIfaces = 0;
|
dsb->numIfaces = 0;
|
||||||
dsb->device = device;
|
dsb->device = device;
|
||||||
dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt;
|
dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt;
|
||||||
dsb->iks = NULL;
|
dsb->IKsPropertySet_iface.lpVtbl = &iksbvt;
|
||||||
|
|
||||||
/* size depends on version */
|
/* size depends on version */
|
||||||
CopyMemory(&dsb->dsbd, dsbd, dsbd->dwSize);
|
CopyMemory(&dsb->dsbd, dsbd, dsbd->dwSize);
|
||||||
|
@ -1045,12 +1040,6 @@ HRESULT IDirectSoundBufferImpl_Destroy(
|
||||||
* this object until it is ready to be deleted */
|
* this object until it is ready to be deleted */
|
||||||
InterlockedIncrement(&pdsb->numIfaces);
|
InterlockedIncrement(&pdsb->numIfaces);
|
||||||
|
|
||||||
if (pdsb->iks) {
|
|
||||||
WARN("iks not NULL\n");
|
|
||||||
IKsBufferPropertySetImpl_Destroy(pdsb->iks);
|
|
||||||
pdsb->iks = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdsb->ds3db) {
|
if (pdsb->ds3db) {
|
||||||
WARN("ds3db not NULL\n");
|
WARN("ds3db not NULL\n");
|
||||||
IDirectSound3DBufferImpl_Destroy(pdsb->ds3db);
|
IDirectSound3DBufferImpl_Destroy(pdsb->ds3db);
|
||||||
|
@ -1100,8 +1089,9 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
|
|
||||||
dsb->buffer->ref++;
|
dsb->buffer->ref++;
|
||||||
list_add_head(&dsb->buffer->buffers, &dsb->entry);
|
list_add_head(&dsb->buffer->buffers, &dsb->entry);
|
||||||
dsb->ref = 1;
|
dsb->ref = 0;
|
||||||
dsb->numIfaces = 1;
|
dsb->refiks = 0;
|
||||||
|
dsb->numIfaces = 0;
|
||||||
dsb->state = STATE_STOPPED;
|
dsb->state = STATE_STOPPED;
|
||||||
dsb->buf_mixpos = dsb->sec_mixpos = 0;
|
dsb->buf_mixpos = dsb->sec_mixpos = 0;
|
||||||
dsb->notify = NULL;
|
dsb->notify = NULL;
|
||||||
|
@ -1109,7 +1099,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
dsb->nrofnotifies = 0;
|
dsb->nrofnotifies = 0;
|
||||||
dsb->device = device;
|
dsb->device = device;
|
||||||
dsb->ds3db = NULL;
|
dsb->ds3db = NULL;
|
||||||
dsb->iks = NULL; /* FIXME? */
|
|
||||||
DSOUND_RecalcFormat(dsb);
|
DSOUND_RecalcFormat(dsb);
|
||||||
|
|
||||||
RtlInitializeResource(&dsb->lock);
|
RtlInitializeResource(&dsb->lock);
|
||||||
|
@ -1125,6 +1114,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
dsb = NULL;
|
dsb = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IDirectSoundBuffer8_AddRef(&dsb->IDirectSoundBuffer8_iface);
|
||||||
*ppdsb = dsb;
|
*ppdsb = dsb;
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
@ -1133,36 +1123,44 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
* IKsPropertySet
|
* IKsPropertySet
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static inline IDirectSoundBufferImpl *impl_from_IKsPropertySet(IKsPropertySet *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, IDirectSoundBufferImpl, IKsPropertySet_iface);
|
||||||
|
}
|
||||||
|
|
||||||
/* IUnknown methods */
|
/* IUnknown methods */
|
||||||
static HRESULT WINAPI IKsPropertySetImpl_QueryInterface(IKsPropertySet *iface, REFIID riid,
|
static HRESULT WINAPI IKsPropertySetImpl_QueryInterface(IKsPropertySet *iface, REFIID riid,
|
||||||
void **ppobj)
|
void **ppobj)
|
||||||
{
|
{
|
||||||
IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
|
IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface);
|
||||||
|
|
||||||
TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
|
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)
|
static ULONG WINAPI IKsPropertySetImpl_AddRef(IKsPropertySet *iface)
|
||||||
{
|
{
|
||||||
IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
|
IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface);
|
||||||
ULONG ref = InterlockedIncrement(&(This->ref));
|
ULONG ref = InterlockedIncrement(&This->refiks);
|
||||||
|
|
||||||
TRACE("(%p) ref was %d\n", This, ref - 1);
|
TRACE("(%p) ref was %d\n", This, ref - 1);
|
||||||
|
|
||||||
|
if(ref == 1)
|
||||||
|
InterlockedIncrement(&This->numIfaces);
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ULONG WINAPI IKsPropertySetImpl_Release(IKsPropertySet *iface)
|
static ULONG WINAPI IKsPropertySetImpl_Release(IKsPropertySet *iface)
|
||||||
{
|
{
|
||||||
IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
|
IDirectSoundBufferImpl *This = impl_from_IKsPropertySet(iface);
|
||||||
ULONG ref = InterlockedDecrement(&(This->ref));
|
ULONG ref = InterlockedDecrement(&This->refiks);
|
||||||
|
|
||||||
TRACE("(%p) ref was %d\n", This, ref + 1);
|
TRACE("(%p) ref was %d\n", This, ref + 1);
|
||||||
|
|
||||||
if (!ref) {
|
if (!ref && !InterlockedDecrement(&This->numIfaces))
|
||||||
This->dsb->iks = 0;
|
secondarybuffer_destroy(This);
|
||||||
IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
|
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
|
||||||
TRACE("(%p) released\n", This);
|
|
||||||
}
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1170,7 +1168,7 @@ static HRESULT WINAPI IKsPropertySetImpl_Get(IKsPropertySet *iface, REFGUID guid
|
||||||
ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData,
|
ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData,
|
||||||
ULONG cbPropData, ULONG *pcbReturned)
|
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",
|
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);
|
This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
|
||||||
|
@ -1182,7 +1180,7 @@ static HRESULT WINAPI IKsPropertySetImpl_Set(IKsPropertySet *iface, REFGUID guid
|
||||||
ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData,
|
ULONG dwPropID, void *pInstanceData, ULONG cbInstanceData, void *pPropData,
|
||||||
ULONG cbPropData)
|
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);
|
TRACE("(%p,%s,%d,%p,%d,%p,%d)\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
|
||||||
|
|
||||||
|
@ -1192,14 +1190,14 @@ static HRESULT WINAPI IKsPropertySetImpl_Set(IKsPropertySet *iface, REFGUID guid
|
||||||
static HRESULT WINAPI IKsPropertySetImpl_QuerySupport(IKsPropertySet *iface, REFGUID guidPropSet,
|
static HRESULT WINAPI IKsPropertySetImpl_QuerySupport(IKsPropertySet *iface, REFGUID guidPropSet,
|
||||||
ULONG dwPropID, ULONG *pTypeSupport)
|
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);
|
TRACE("(%p,%s,%d,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
|
||||||
|
|
||||||
return E_PROP_ID_UNSUPPORTED;
|
return E_PROP_ID_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const IKsPropertySetVtbl iksbvt = {
|
const IKsPropertySetVtbl iksbvt = {
|
||||||
IKsPropertySetImpl_QueryInterface,
|
IKsPropertySetImpl_QueryInterface,
|
||||||
IKsPropertySetImpl_AddRef,
|
IKsPropertySetImpl_AddRef,
|
||||||
IKsPropertySetImpl_Release,
|
IKsPropertySetImpl_Release,
|
||||||
|
@ -1207,39 +1205,3 @@ static const IKsPropertySetVtbl iksbvt = {
|
||||||
IKsPropertySetImpl_Set,
|
IKsPropertySetImpl_Set,
|
||||||
IKsPropertySetImpl_QuerySupport
|
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -50,7 +50,6 @@ typedef struct IDirectSoundCaptureImpl IDirectSoundCaptureImpl;
|
||||||
typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
|
typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
|
||||||
typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl;
|
typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl;
|
||||||
typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl;
|
typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl;
|
||||||
typedef struct IKsBufferPropertySetImpl IKsBufferPropertySetImpl;
|
|
||||||
typedef struct DirectSoundDevice DirectSoundDevice;
|
typedef struct DirectSoundDevice DirectSoundDevice;
|
||||||
typedef struct DirectSoundCaptureDevice DirectSoundCaptureDevice;
|
typedef struct DirectSoundCaptureDevice DirectSoundCaptureDevice;
|
||||||
|
|
||||||
|
@ -166,8 +165,9 @@ struct IDirectSoundBufferImpl
|
||||||
{
|
{
|
||||||
IDirectSoundBuffer8 IDirectSoundBuffer8_iface;
|
IDirectSoundBuffer8 IDirectSoundBuffer8_iface;
|
||||||
IDirectSound3DListener IDirectSound3DListener_iface; /* only primary buffer */
|
IDirectSound3DListener IDirectSound3DListener_iface; /* only primary buffer */
|
||||||
|
IKsPropertySet IKsPropertySet_iface;
|
||||||
LONG numIfaces; /* "in use interfaces" refcount */
|
LONG numIfaces; /* "in use interfaces" refcount */
|
||||||
LONG ref, ref3D;
|
LONG ref, ref3D, refiks;
|
||||||
/* IDirectSoundBufferImpl fields */
|
/* IDirectSoundBufferImpl fields */
|
||||||
DirectSoundDevice* device;
|
DirectSoundDevice* device;
|
||||||
RTL_RWLOCK lock;
|
RTL_RWLOCK lock;
|
||||||
|
@ -194,9 +194,7 @@ struct IDirectSoundBufferImpl
|
||||||
DS3DBUFFER ds3db_ds3db;
|
DS3DBUFFER ds3db_ds3db;
|
||||||
LONG ds3db_lVolume;
|
LONG ds3db_lVolume;
|
||||||
BOOL ds3db_need_recalc;
|
BOOL ds3db_need_recalc;
|
||||||
|
|
||||||
/* IKsPropertySet fields */
|
/* IKsPropertySet fields */
|
||||||
IKsBufferPropertySetImpl* iks;
|
|
||||||
bitsconvertfunc convert;
|
bitsconvertfunc convert;
|
||||||
struct list entry;
|
struct list entry;
|
||||||
};
|
};
|
||||||
|
@ -213,6 +211,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
|
||||||
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
|
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
|
||||||
void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
||||||
const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
const IDirectSound3DListenerVtbl ds3dlvt DECLSPEC_HIDDEN;
|
||||||
|
const IKsPropertySetVtbl iksbvt DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* DirectSoundCaptureDevice implementation structure
|
* DirectSoundCaptureDevice implementation structure
|
||||||
|
@ -259,24 +258,6 @@ struct IDirectSoundCaptureBufferImpl
|
||||||
int nrofnotifies;
|
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;
|
HRESULT IKsPrivatePropertySetImpl_Create(REFIID riid, IKsPropertySet **piks) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue