Split property sets into two types: buffer and private.
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 14478ed..1011917 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -962,12 +962,18 @@
}
if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
- if (!This->iks)
- IKsPropertySetImpl_Create(This, &This->iks);
- *ppobj = This->iks;
- if (*ppobj) {
- IKsPropertySet_AddRef((LPKSPROPERTYSET)*ppobj);
- return S_OK;
+ /* only supported on hardware 3D secondary buffers */
+ if (!(This->dsbd.dwFlags & DSBCAPS_PRIMARYBUFFER) &&
+ (This->dsbd.dwFlags & DSBCAPS_CTRL3D) &&
+ (This->dsbd.dwFlags & DSBCAPS_LOCHARDWARE) &&
+ (This->hwbuf != NULL) ) {
+ if (!This->iks)
+ IKsBufferPropertySetImpl_Create(This, &This->iks);
+ *ppobj = This->iks;
+ if (*ppobj) {
+ IKsPropertySet_AddRef((LPKSPROPERTYSET)*ppobj);
+ return S_OK;
+ }
}
WARN("IID_IKsPropertySet\n");
return E_NOINTERFACE;
diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c
index 0917bf8..2047454 100644
--- a/dlls/dsound/dsound_main.c
+++ b/dlls/dsound/dsound_main.c
@@ -1235,7 +1235,7 @@
*ppobj = NULL;
if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
- return IKsPropertySetImpl_Create(0,(IKsPropertySetImpl**)ppobj);
+ return IKsPrivatePropertySetImpl_Create((IKsPrivatePropertySetImpl**)ppobj);
}
WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 393e1c2..f1fe3b9 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -52,7 +52,8 @@
typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl;
typedef struct IDirectSound3DListenerImpl IDirectSound3DListenerImpl;
typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl;
-typedef struct IKsPropertySetImpl IKsPropertySetImpl;
+typedef struct IKsBufferPropertySetImpl IKsBufferPropertySetImpl;
+typedef struct IKsPrivatePropertySetImpl IKsPrivatePropertySetImpl;
typedef struct PrimaryBufferImpl PrimaryBufferImpl;
typedef struct IClassFactoryImpl IClassFactoryImpl;
@@ -113,7 +114,7 @@
/* IDirectSoundBufferImpl fields */
IDirectSoundImpl* dsound;
IDirectSound3DBufferImpl* ds3db;
- IKsPropertySetImpl* iks;
+ IKsBufferPropertySetImpl* iks;
CRITICAL_SECTION lock;
PIDSDRIVERBUFFER hwbuf;
WAVEFORMATEX wfx;
@@ -256,9 +257,9 @@
IDirectSound3DListenerImpl **pdsl);
/*****************************************************************************
- * IKsPropertySet implementation structure
+ * IKsBufferPropertySet implementation structure
*/
-struct IKsPropertySetImpl
+struct IKsBufferPropertySetImpl
{
/* IUnknown fields */
ICOM_VFIELD(IKsPropertySet);
@@ -267,9 +268,22 @@
IDirectSoundBufferImpl* dsb;
};
-HRESULT WINAPI IKsPropertySetImpl_Create(
+HRESULT WINAPI IKsBufferPropertySetImpl_Create(
IDirectSoundBufferImpl *This,
- IKsPropertySetImpl **piks);
+ IKsBufferPropertySetImpl **piks);
+
+/*****************************************************************************
+ * IKsPrivatePropertySet implementation structure
+ */
+struct IKsPrivatePropertySetImpl
+{
+ /* IUnknown fields */
+ ICOM_VFIELD(IKsPropertySet);
+ DWORD ref;
+};
+
+HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
+ IKsPrivatePropertySetImpl **piks);
/*****************************************************************************
* IDirectSound3DBuffer implementation structure
diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
index f6630cf..55ec348 100644
--- a/dlls/dsound/propset.c
+++ b/dlls/dsound/propset.c
@@ -51,47 +51,150 @@
/*******************************************************************************
- * IKsPropertySet
+ * IKsBufferPropertySet
*/
/* IUnknown methods */
-static HRESULT WINAPI IKsPropertySetImpl_QueryInterface(
- LPKSPROPERTYSET iface, REFIID riid, LPVOID *ppobj
-) {
- ICOM_THIS(IKsPropertySetImpl,iface);
+static HRESULT WINAPI IKsBufferPropertySetImpl_QueryInterface(
+ LPKSPROPERTYSET iface,
+ REFIID riid,
+ LPVOID *ppobj )
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+ TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- /* FIXME: split this for DirectSoundPrivate */
- if (This->dsb == NULL) {
- FIXME("not used on a buffer\n");
- return DSERR_INVALIDPARAM;
- }
-
- return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj);
+ return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj);
}
-static ULONG WINAPI IKsPropertySetImpl_AddRef(LPKSPROPERTYSET iface) {
- ICOM_THIS(IKsPropertySetImpl,iface);
- ULONG ulReturn;
+static ULONG WINAPI IKsBufferPropertySetImpl_AddRef(LPKSPROPERTYSET iface)
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+ ULONG ulReturn;
- TRACE("(%p) ref was %ld\n", This, This->ref);
- ulReturn = InterlockedIncrement(&This->ref);
- if (ulReturn == 1)
- IDirectSoundBuffer_AddRef((LPDIRECTSOUND3DBUFFER)This->dsb);
+ TRACE("(%p) ref was %ld\n", This, This->ref);
+ ulReturn = InterlockedIncrement(&This->ref);
+ if (ulReturn == 1)
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUND3DBUFFER)This->dsb);
+ return ulReturn;
+}
+
+static ULONG WINAPI IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface)
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+ ULONG ulReturn;
+
+ TRACE("(%p) ref was %ld\n", This, This->ref);
+ ulReturn = InterlockedDecrement(&This->ref);
+ if (ulReturn)
return ulReturn;
+ IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
+ return 0;
}
-static ULONG WINAPI IKsPropertySetImpl_Release(LPKSPROPERTYSET iface) {
- ICOM_THIS(IKsPropertySetImpl,iface);
- ULONG ulReturn;
+static HRESULT WINAPI IKsBufferPropertySetImpl_Get(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ LPVOID pInstanceData,
+ ULONG cbInstanceData,
+ LPVOID pPropData,
+ ULONG cbPropData,
+ PULONG pcbReturned )
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+ FIXME("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p) stub!\n",
+ This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
- TRACE("(%p) ref was %ld\n", This, This->ref);
- ulReturn = InterlockedDecrement(&This->ref);
- if (ulReturn)
- return ulReturn;
- IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
- return 0;
+ return E_PROP_ID_UNSUPPORTED;
+}
+
+static HRESULT WINAPI IKsBufferPropertySetImpl_Set(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ LPVOID pInstanceData,
+ ULONG cbInstanceData,
+ LPVOID pPropData,
+ ULONG cbPropData )
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+
+ FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
+ return E_PROP_ID_UNSUPPORTED;
+}
+
+static HRESULT WINAPI IKsBufferPropertySetImpl_QuerySupport(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ PULONG pTypeSupport )
+{
+ ICOM_THIS(IKsBufferPropertySetImpl,iface);
+ FIXME("(%p,%s,%ld,%p) stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
+
+ return E_PROP_ID_UNSUPPORTED;
+}
+
+static ICOM_VTABLE(IKsPropertySet) iksbvt = {
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IKsBufferPropertySetImpl_QueryInterface,
+ IKsBufferPropertySetImpl_AddRef,
+ IKsBufferPropertySetImpl_Release,
+ IKsBufferPropertySetImpl_Get,
+ IKsBufferPropertySetImpl_Set,
+ IKsBufferPropertySetImpl_QuerySupport
+};
+
+HRESULT WINAPI IKsBufferPropertySetImpl_Create(
+ IDirectSoundBufferImpl *This,
+ IKsBufferPropertySetImpl **piks)
+{
+ IKsBufferPropertySetImpl *iks;
+
+ iks = (IKsBufferPropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
+ iks->ref = 0;
+ iks->dsb = This;
+ iks->lpVtbl = &iksbvt;
+
+ *piks = iks;
+ return S_OK;
+}
+
+/*******************************************************************************
+ * IKsPrivatePropertySet
+ */
+
+/* IUnknown methods */
+static HRESULT WINAPI IKsPrivatePropertySetImpl_QueryInterface(
+ LPKSPROPERTYSET iface,
+ REFIID riid,
+ LPVOID *ppobj )
+{
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
+ TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+
+ *ppobj = NULL;
+ return DSERR_INVALIDPARAM;
+}
+
+static ULONG WINAPI IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface)
+{
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
+ ULONG ulReturn;
+
+ TRACE("(%p) ref was %ld\n", This, This->ref);
+ ulReturn = InterlockedIncrement(&This->ref);
+ return ulReturn;
+}
+
+static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
+{
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
+ ULONG ulReturn;
+
+ TRACE("(%p) ref was %ld\n", This, This->ref);
+ ulReturn = InterlockedDecrement(&This->ref);
+ return ulReturn;
}
static HRESULT WINAPI DSPROPERTY_WaveDeviceMappingA(
@@ -581,13 +684,17 @@
return E_PROP_ID_UNSUPPORTED;
}
-static HRESULT WINAPI IKsPropertySetImpl_Get(LPKSPROPERTYSET iface,
- REFGUID guidPropSet, ULONG dwPropID,
- LPVOID pInstanceData, ULONG cbInstanceData,
- LPVOID pPropData, ULONG cbPropData,
+static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ LPVOID pInstanceData,
+ ULONG cbInstanceData,
+ LPVOID pPropData,
+ ULONG cbPropData,
PULONG pcbReturned
) {
- ICOM_THIS(IKsPropertySetImpl,iface);
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
@@ -625,21 +732,28 @@
return E_PROP_ID_UNSUPPORTED;
}
-static HRESULT WINAPI IKsPropertySetImpl_Set(LPKSPROPERTYSET iface,
- REFGUID guidPropSet, ULONG dwPropID,
- LPVOID pInstanceData, ULONG cbInstanceData,
- LPVOID pPropData, ULONG cbPropData
-) {
- ICOM_THIS(IKsPropertySetImpl,iface);
+static HRESULT WINAPI IKsPrivatePropertySetImpl_Set(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ LPVOID pInstanceData,
+ ULONG cbInstanceData,
+ LPVOID pPropData,
+ ULONG cbPropData )
+{
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
- FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
- return E_PROP_ID_UNSUPPORTED;
+ FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
+ return E_PROP_ID_UNSUPPORTED;
}
-static HRESULT WINAPI IKsPropertySetImpl_QuerySupport(LPKSPROPERTYSET iface,
- REFGUID guidPropSet, ULONG dwPropID, PULONG pTypeSupport
-) {
- ICOM_THIS(IKsPropertySetImpl,iface);
+static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
+ LPKSPROPERTYSET iface,
+ REFGUID guidPropSet,
+ ULONG dwPropID,
+ PULONG pTypeSupport )
+{
+ ICOM_THIS(IKsPrivatePropertySetImpl,iface);
TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
@@ -679,27 +793,25 @@
return E_PROP_ID_UNSUPPORTED;
}
-static ICOM_VTABLE(IKsPropertySet) iksvt = {
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- IKsPropertySetImpl_QueryInterface,
- IKsPropertySetImpl_AddRef,
- IKsPropertySetImpl_Release,
- IKsPropertySetImpl_Get,
- IKsPropertySetImpl_Set,
- IKsPropertySetImpl_QuerySupport
+static ICOM_VTABLE(IKsPropertySet) ikspvt = {
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IKsPrivatePropertySetImpl_QueryInterface,
+ IKsPrivatePropertySetImpl_AddRef,
+ IKsPrivatePropertySetImpl_Release,
+ IKsPrivatePropertySetImpl_Get,
+ IKsPrivatePropertySetImpl_Set,
+ IKsPrivatePropertySetImpl_QuerySupport
};
-HRESULT WINAPI IKsPropertySetImpl_Create(
- IDirectSoundBufferImpl *This,
- IKsPropertySetImpl **piks)
+HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
+ IKsPrivatePropertySetImpl **piks)
{
- IKsPropertySetImpl *iks;
+ IKsPrivatePropertySetImpl *iks;
- iks = (IKsPropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
- iks->ref = 0;
- iks->dsb = This;
- iks->lpVtbl = &iksvt;
+ iks = (IKsPrivatePropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
+ iks->ref = 0;
+ iks->lpVtbl = &ikspvt;
- *piks = iks;
- return S_OK;
+ *piks = iks;
+ return S_OK;
}