dsound: class factory cleanup
Robert Reif
reif at earthlink.net
Fri Aug 18 00:13:31 CDT 2006
Consolidate all class factories into a single implementation.
Fixes a problem discovered by oleview.
-------------- next part --------------
diff -p -u -r1.66 capture.c
--- dlls/dsound/capture.c 2 Aug 2006 11:50:38 -0000 1.66
+++ dlls/dsound/capture.c 18 Aug 2006 05:04:15 -0000
@@ -85,13 +85,19 @@ static const char * captureStateString[]
"STATE_STOPPING"
};
-static HRESULT DSOUND_CaptureCreate(
- LPDIRECTSOUNDCAPTURE *ppDSC,
- IUnknown *pUnkOuter)
+HRESULT DSOUND_CaptureCreate(
+ REFIID riid,
+ LPDIRECTSOUNDCAPTURE *ppDSC)
{
LPDIRECTSOUNDCAPTURE pDSC;
HRESULT hr;
- TRACE("(%p,%p)\n",ppDSC,pUnkOuter);
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSoundCapture)) {
+ *ppDSC = 0;
+ return E_NOINTERFACE;
+ }
/* Get dsound configuration */
setup_dsound_options();
@@ -108,13 +114,19 @@ static HRESULT DSOUND_CaptureCreate(
return hr;
}
-static HRESULT DSOUND_CaptureCreate8(
- LPDIRECTSOUNDCAPTURE8 *ppDSC8,
- IUnknown *pUnkOuter)
+HRESULT DSOUND_CaptureCreate8(
+ REFIID riid,
+ LPDIRECTSOUNDCAPTURE8 *ppDSC8)
{
LPDIRECTSOUNDCAPTURE8 pDSC8;
HRESULT hr;
- TRACE("(%p,%p)\n",ppDSC8,pUnkOuter);
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC8);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSoundCapture8)) {
+ *ppDSC8 = 0;
+ return E_NOINTERFACE;
+ }
/* Get dsound configuration */
setup_dsound_options();
@@ -173,7 +185,7 @@ HRESULT WINAPI DirectSoundCaptureCreate(
return DSERR_NOAGGREGATION;
}
- hr = DSOUND_CaptureCreate(&pDSC, (IUnknown *)pUnkOuter);
+ hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture, &pDSC);
if (hr == DS_OK) {
hr = IDirectSoundCapture_Initialize(pDSC, lpcGUID);
if (hr != DS_OK) {
@@ -229,7 +241,7 @@ HRESULT WINAPI DirectSoundCaptureCreate8
return DSERR_NOAGGREGATION;
}
- hr = DSOUND_CaptureCreate8(&pDSC8, (IUnknown *)pUnkOuter);
+ hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture8, &pDSC8);
if (hr == DS_OK) {
hr = IDirectSoundCapture_Initialize(pDSC8, lpcGUID);
if (hr != DS_OK) {
@@ -1694,80 +1706,3 @@ ULONG DirectSoundCaptureDevice_Release(
}
return ref;
}
-
-/*******************************************************************************
- * DirectSoundCapture ClassFactory
- */
-
-static HRESULT WINAPI
-DSCCF_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
-DSCCF_AddRef(LPCLASSFACTORY iface)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %ld\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI
-DSCCF_Release(LPCLASSFACTORY iface)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %ld\n", This, ref + 1);
- /* static class, won't be freed */
- return ref;
-}
-
-static HRESULT WINAPI
-DSCCF_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_IDirectSoundCapture, riid ) )
- return DSOUND_CaptureCreate8((LPDIRECTSOUNDCAPTURE*)ppobj,pOuter);
-
- WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
-}
-
-static HRESULT WINAPI
-DSCCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p)->(%d),stub!\n",This,dolock);
- return S_OK;
-}
-
-static const IClassFactoryVtbl DSCCF_Vtbl =
-{
- DSCCF_QueryInterface,
- DSCCF_AddRef,
- DSCCF_Release,
- DSCCF_CreateInstance,
- DSCCF_LockServer
-};
-
-IClassFactoryImpl DSOUND_CAPTURE_CF = { &DSCCF_Vtbl, 1 };
diff -p -u -r1.52 dsound.c
--- dlls/dsound/dsound.c 2 Aug 2006 11:50:38 -0000 1.52
+++ dlls/dsound/dsound.c 18 Aug 2006 05:04:16 -0000
@@ -977,12 +977,18 @@ static HRESULT IDirectSound8_IDirectSoun
}
HRESULT DSOUND_Create(
- LPDIRECTSOUND *ppDS,
- IUnknown *pUnkOuter)
+ REFIID riid,
+ LPDIRECTSOUND *ppDS)
{
LPDIRECTSOUND8 pDS;
HRESULT hr;
- TRACE("(%p,%p)\n",ppDS,pUnkOuter);
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDS);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSound)) {
+ *ppDS = 0;
+ return E_NOINTERFACE;
+ }
/* Get dsound configuration */
setup_dsound_options();
@@ -1040,7 +1046,7 @@ HRESULT WINAPI DirectSoundCreate(
return DSERR_INVALIDPARAM;
}
- hr = DSOUND_Create(&pDS, pUnkOuter);
+ hr = DSOUND_Create(&IID_IDirectSound, &pDS);
if (hr == DS_OK) {
hr = IDirectSound_Initialize(pDS, lpcGUID);
if (hr != DS_OK) {
@@ -1058,12 +1064,18 @@ HRESULT WINAPI DirectSoundCreate(
}
HRESULT DSOUND_Create8(
- LPDIRECTSOUND8 *ppDS,
- IUnknown *pUnkOuter)
+ REFIID riid,
+ LPDIRECTSOUND8 *ppDS)
{
LPDIRECTSOUND8 pDS;
HRESULT hr;
- TRACE("(%p,%p)\n",ppDS,pUnkOuter);
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDS);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSound8)) {
+ *ppDS = 0;
+ return E_NOINTERFACE;
+ }
/* Get dsound configuration */
setup_dsound_options();
@@ -1121,7 +1133,7 @@ HRESULT WINAPI DirectSoundCreate8(
return DSERR_INVALIDPARAM;
}
- hr = DSOUND_Create8(&pDS, pUnkOuter);
+ hr = DSOUND_Create8(&IID_IDirectSound8, &pDS);
if (hr == DS_OK) {
hr = IDirectSound8_Initialize(pDS, lpcGUID);
if (hr != DS_OK) {
diff -p -u -r1.133 dsound_main.c
--- dlls/dsound/dsound_main.c 2 Aug 2006 11:50:38 -0000 1.133
+++ dlls/dsound/dsound_main.c 18 Aug 2006 05:04:17 -0000
@@ -426,12 +426,23 @@ HRESULT WINAPI DirectSoundEnumerateW(
* DirectSound ClassFactory
*/
-static HRESULT WINAPI
-DSCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+typedef HRESULT (*FnCreateInstance)(REFIID riid, LPVOID *ppobj);
+
+typedef struct {
+ const IClassFactoryVtbl *lpVtbl;
+ ULONG ref;
+ REFCLSID rclsid;
+ FnCreateInstance pfnCreateInstance;
+} IClassFactoryImpl;
- FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
+static HRESULT WINAPI
+DSCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ FIXME("(%p, %s, %p) stub!\n", This, debugstr_guid(riid), ppobj);
+ if (ppobj == NULL)
+ return E_POINTER;
+ return E_NOINTERFACE;
}
static ULONG WINAPI DSCF_AddRef(LPCLASSFACTORY iface)
@@ -452,114 +463,49 @@ static ULONG WINAPI DSCF_Release(LPCLASS
}
static HRESULT WINAPI DSCF_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)
- return CLASS_E_NOAGGREGATION;
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return DSERR_INVALIDPARAM;
- }
-
- *ppobj = NULL;
-
- if ( IsEqualIID( &IID_IDirectSound, riid ) )
- return DSOUND_Create((LPDIRECTSOUND*)ppobj,pOuter);
-
- if ( IsEqualIID( &IID_IDirectSound8, riid ) )
- return DSOUND_Create8((LPDIRECTSOUND8*)ppobj,pOuter);
-
- WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
-}
-
-static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p)->(%d),stub!\n",This,dolock);
- return S_OK;
-}
-
-static const IClassFactoryVtbl DSCF_Vtbl = {
- DSCF_QueryInterface,
- DSCF_AddRef,
- DSCF_Release,
- DSCF_CreateInstance,
- DSCF_LockServer
-};
-
-static IClassFactoryImpl DSOUND_CF = { &DSCF_Vtbl, 1 };
-
-/*******************************************************************************
- * DirectSoundPrivate ClassFactory
- */
-
-static HRESULT WINAPI
-DSPCF_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 DSPCF_AddRef(LPCLASSFACTORY iface)
+ LPCLASSFACTORY iface,
+ LPUNKNOWN pOuter,
+ REFIID riid,
+ LPVOID *ppobj)
{
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %ld\n", This, ref - 1);
- return ref;
-}
+ TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), ppobj);
-static ULONG WINAPI DSPCF_Release(LPCLASSFACTORY iface)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %ld\n", This, ref + 1);
- /* static class, won't be freed */
- return ref;
-}
-
-static HRESULT WINAPI
-DSPCF_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 (ppobj == NULL) {
- WARN("invalid parameter\n");
- return DSERR_INVALIDPARAM;
- }
-
- *ppobj = NULL;
-
- if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
- return IKsPrivatePropertySetImpl_Create((IKsPrivatePropertySetImpl**)ppobj);
- }
+ if (pOuter)
+ return CLASS_E_NOAGGREGATION;
- WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
+ if (ppobj == NULL) {
+ WARN("invalid parameter\n");
+ return DSERR_INVALIDPARAM;
+ }
+ *ppobj = NULL;
+ return This->pfnCreateInstance(riid, ppobj);
}
-
-static HRESULT WINAPI
-DSPCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p)->(%d),stub!\n",This,dolock);
- return S_OK;
+
+static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ FIXME("(%p, %d) stub!\n", This, dolock);
+ return S_OK;
}
-static const IClassFactoryVtbl DSPCF_Vtbl = {
- DSPCF_QueryInterface,
- DSPCF_AddRef,
- DSPCF_Release,
- DSPCF_CreateInstance,
- DSPCF_LockServer
+static const IClassFactoryVtbl DSCF_Vtbl = {
+ DSCF_QueryInterface,
+ DSCF_AddRef,
+ DSCF_Release,
+ DSCF_CreateInstance,
+ DSCF_LockServer
};
-static IClassFactoryImpl DSOUND_PRIVATE_CF = { &DSPCF_Vtbl, 1 };
+static IClassFactoryImpl DSOUND_CF[] = {
+ { &DSCF_Vtbl, 1, &CLSID_DirectSound, (FnCreateInstance)DSOUND_Create },
+ { &DSCF_Vtbl, 1, &CLSID_DirectSound8, (FnCreateInstance)DSOUND_Create8 },
+ { &DSCF_Vtbl, 1, &CLSID_DirectSoundCapture, (FnCreateInstance)DSOUND_CaptureCreate },
+ { &DSCF_Vtbl, 1, &CLSID_DirectSoundCapture8, (FnCreateInstance)DSOUND_CaptureCreate8 },
+ { &DSCF_Vtbl, 1, &CLSID_DirectSoundFullDuplex, (FnCreateInstance)DSOUND_FullDuplexCreate },
+ { &DSCF_Vtbl, 1, &CLSID_DirectSoundPrivate, (FnCreateInstance)IKsPrivatePropertySetImpl_Create },
+ { NULL, 0, NULL, NULL }
+};
/*******************************************************************************
* DllGetClassObject [DSOUND.@]
@@ -580,62 +526,33 @@ static IClassFactoryImpl DSOUND_PRIVATE_
*/
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
- TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+ int i = 0;
+ TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
if (ppv == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
+ WARN("invalid parameter\n");
+ return E_INVALIDARG;
}
*ppv = NULL;
- if ( IsEqualCLSID( &CLSID_DirectSound, rclsid ) ||
- IsEqualCLSID( &CLSID_DirectSound8, rclsid ) ) {
- if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
- *ppv = (LPVOID)&DSOUND_CF;
- IClassFactory_AddRef((IClassFactory*)*ppv);
- return S_OK;
- }
- WARN("(%s,%s,%p): no interface found.\n",
- debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- return S_FALSE;
- }
-
- if ( IsEqualCLSID( &CLSID_DirectSoundCapture, rclsid ) ||
- IsEqualCLSID( &CLSID_DirectSoundCapture8, rclsid ) ) {
- if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
- *ppv = (LPVOID)&DSOUND_CAPTURE_CF;
- IClassFactory_AddRef((IClassFactory*)*ppv);
- return S_OK;
- }
- WARN("(%s,%s,%p): no interface found.\n",
- debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- return S_FALSE;
+ if (!IsEqualIID(riid, &IID_IClassFactory) &&
+ !IsEqualIID(riid, &IID_IUnknown)) {
+ WARN("no interface for %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
}
- if ( IsEqualCLSID( &CLSID_DirectSoundFullDuplex, rclsid ) ) {
- if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
- *ppv = (LPVOID)&DSOUND_FULLDUPLEX_CF;
- IClassFactory_AddRef((IClassFactory*)*ppv);
- return S_OK;
- }
- WARN("(%s,%s,%p): no interface found.\n",
- debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- return S_FALSE;
- }
-
- if ( IsEqualCLSID( &CLSID_DirectSoundPrivate, rclsid ) ) {
- if ( IsEqualCLSID( &IID_IClassFactory, riid ) ) {
- *ppv = (LPVOID)&DSOUND_PRIVATE_CF;
- IClassFactory_AddRef((IClassFactory*)*ppv);
- return S_OK;
- }
- WARN("(%s,%s,%p): no interface found.\n",
- debugstr_guid(rclsid), debugstr_guid(riid), ppv);
- return S_FALSE;
+ while (NULL != DSOUND_CF[i].rclsid) {
+ if (IsEqualGUID(rclsid, DSOUND_CF[i].rclsid)) {
+ DSCF_AddRef((IClassFactory*) &DSOUND_CF[i]);
+ *ppv = &DSOUND_CF[i];
+ return S_OK;
+ }
+ i++;
}
- WARN("(%s,%s,%p): no class found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+ WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),
+ debugstr_guid(riid), ppv);
return CLASS_E_CLASSNOTAVAILABLE;
}
diff -p -u -r1.47 dsound_private.h
--- dlls/dsound/dsound_private.h 2 Aug 2006 11:50:38 -0000 1.47
+++ dlls/dsound/dsound_private.h 18 Aug 2006 05:04:17 -0000
@@ -68,7 +68,6 @@ typedef struct IKsBufferPropertySetImpl
typedef struct IKsPrivatePropertySetImpl IKsPrivatePropertySetImpl;
typedef struct PrimaryBufferImpl PrimaryBufferImpl;
typedef struct SecondaryBufferImpl SecondaryBufferImpl;
-typedef struct IClassFactoryImpl IClassFactoryImpl;
typedef struct DirectSoundDevice DirectSoundDevice;
typedef struct DirectSoundCaptureDevice DirectSoundCaptureDevice;
@@ -391,6 +390,7 @@ struct IKsPrivatePropertySetImpl
};
HRESULT IKsPrivatePropertySetImpl_Create(
+ REFIID riid,
IKsPrivatePropertySetImpl **piks);
/*****************************************************************************
@@ -412,25 +412,12 @@ HRESULT IDirectSound3DBufferImpl_Destroy
IDirectSound3DBufferImpl *pds3db);
/*******************************************************************************
- * DirectSound ClassFactory implementation structure
- */
-struct IClassFactoryImpl
-{
- /* IUnknown fields */
- const IClassFactoryVtbl *lpVtbl;
- LONG ref;
-};
-
-extern IClassFactoryImpl DSOUND_CAPTURE_CF;
-extern IClassFactoryImpl DSOUND_FULLDUPLEX_CF;
-
-/*******************************************************************************
*/
/* dsound.c */
-HRESULT DSOUND_Create(LPDIRECTSOUND *ppDS, IUnknown *pUnkOuter);
-HRESULT DSOUND_Create8(LPDIRECTSOUND8 *ppDS, IUnknown *pUnkOuter);
+HRESULT DSOUND_Create(REFIID riid, LPDIRECTSOUND *ppDS);
+HRESULT DSOUND_Create8(REFIID riid, LPDIRECTSOUND8 *ppDS);
/* primary.c */
@@ -441,6 +428,10 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDe
HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LPDWORD writepos);
HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex);
+/* duplex.c */
+
+HRESULT DSOUND_FullDuplexCreate(REFIID riid, LPDIRECTSOUNDFULLDUPLEX* ppDSFD);
+
/* buffer.c */
DWORD DSOUND_CalcPlayPosition(IDirectSoundBufferImpl *This, DWORD pplay, DWORD pwrite);
@@ -462,7 +453,9 @@ void CALLBACK DSOUND_callback(HWAVEOUT h
void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb);
/* capture.c */
-
+
+HRESULT DSOUND_CaptureCreate(REFIID riid, LPDIRECTSOUNDCAPTURE *ppDSC);
+HRESULT DSOUND_CaptureCreate8(REFIID riid, LPDIRECTSOUNDCAPTURE8 *ppDSC8);
HRESULT WINAPI IDirectSoundCaptureImpl_CreateCaptureBuffer(
LPDIRECTSOUNDCAPTURE iface,
LPCDSCBUFFERDESC lpcDSCBufferDesc,
diff -p -u -r1.10 duplex.c
--- dlls/dsound/duplex.c 2 Aug 2006 11:50:38 -0000 1.10
+++ dlls/dsound/duplex.c 18 Aug 2006 05:04:18 -0000
@@ -760,21 +760,24 @@ static const IDirectSoundFullDuplexVtbl
IDirectSoundFullDuplexImpl_Initialize
};
-static HRESULT DSOUND_FullDuplexCreate(LPDIRECTSOUNDFULLDUPLEX* ppDSFD, IUnknown *pUnkOuter)
+HRESULT DSOUND_FullDuplexCreate(
+ REFIID riid,
+ LPDIRECTSOUNDFULLDUPLEX* ppDSFD)
{
IDirectSoundFullDuplexImpl *This = NULL;
-
- if (pUnkOuter) {
- WARN("pUnkOuter != 0\n");
- *ppDSFD = NULL;
- return DSERR_NOAGGREGATION;
- }
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSFD);
if (ppDSFD == NULL) {
WARN("invalid parameter: ppDSFD == NULL\n");
return DSERR_INVALIDPARAM;
}
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSoundFullDuplex)) {
+ *ppDSFD = 0;
+ return E_NOINTERFACE;
+ }
+
/* Get dsound configuration */
setup_dsound_options();
@@ -907,79 +910,3 @@ DirectSoundFullDuplexCreate(
return hres;
}
-
-/*******************************************************************************
- * 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 ) )
- return DSOUND_FullDuplexCreate((LPDIRECTSOUNDFULLDUPLEX*)ppobj,pOuter);
-
- 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 -p -u -r1.48 propset.c
--- dlls/dsound/propset.c 23 May 2006 12:47:56 -0000 1.48
+++ dlls/dsound/propset.c 18 Aug 2006 05:04:19 -0000
@@ -1504,9 +1504,17 @@ static const IKsPropertySetVtbl ikspvt =
};
HRESULT IKsPrivatePropertySetImpl_Create(
+ REFIID riid,
IKsPrivatePropertySetImpl **piks)
{
IKsPrivatePropertySetImpl *iks;
+ TRACE("(%s, %p)\n", debugstr_guid(riid), piks);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IKsPropertySet)) {
+ *piks = 0;
+ return E_NOINTERFACE;
+ }
iks = HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
iks->ref = 1;
More information about the wine-patches
mailing list