From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfsrcsnk/factory.c | 86 ++------------------------------ dlls/mfsrcsnk/mfsrcsnk_private.h | 50 ++++++++++++++++++- dlls/mfsrcsnk/wave.c | 61 ++++++++++------------ 3 files changed, 80 insertions(+), 117 deletions(-)
diff --git a/dlls/mfsrcsnk/factory.c b/dlls/mfsrcsnk/factory.c index 2e03451a523..66434ef7092 100644 --- a/dlls/mfsrcsnk/factory.c +++ b/dlls/mfsrcsnk/factory.c @@ -16,86 +16,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#define COBJMACROS - -#include "mfidl.h" -#include "wine/mfinternal.h" - #include "mfsrcsnk_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
-struct class_factory -{ - IClassFactory IClassFactory_iface; - HRESULT (*create_instance)(REFIID riid, void **out); -}; - -static inline struct class_factory *impl_from_IClassFactory(IClassFactory *iface) -{ - return CONTAINING_RECORD(iface, struct class_factory, IClassFactory_iface); -} - -static HRESULT WINAPI class_factory_QueryInterface(IClassFactory *iface, REFIID riid, void **out) -{ - if (IsEqualGUID(riid, &IID_IClassFactory) || - IsEqualGUID(riid, &IID_IUnknown)) - { - IClassFactory_AddRef(iface); - *out = iface; - return S_OK; - } - - *out = NULL; - WARN("Interface %s is not supported.\n", debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI class_factory_AddRef(IClassFactory *iface) -{ - return 2; -} - -static ULONG WINAPI class_factory_Release(IClassFactory *iface) -{ - return 1; -} - -static HRESULT WINAPI class_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, - REFIID riid, void **out) -{ - struct class_factory *factory = impl_from_IClassFactory(iface); - - TRACE("%p, %s, %p.\n", outer, debugstr_guid(riid), out); - - *out = NULL; - - if (outer) - return CLASS_E_NOAGGREGATION; - - return factory->create_instance(riid, out); -} - -static HRESULT WINAPI class_factory_LockServer(IClassFactory *iface, BOOL dolock) -{ - FIXME("%p, %d.\n", iface, dolock); - - return S_OK; -} - -static const IClassFactoryVtbl class_factory_vtbl = -{ - class_factory_QueryInterface, - class_factory_AddRef, - class_factory_Release, - class_factory_CreateInstance, - class_factory_LockServer, -}; - -static struct class_factory wave_sink_factory = { { &class_factory_vtbl }, wave_sink_factory_create }; - /*********************************************************************** * DllGetClassObject (mfsrcsnk.@) */ @@ -104,12 +30,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out) *out = NULL;
if (IsEqualGUID(clsid, &CLSID_MFWAVESinkClassFactory)) - { - return IClassFactory_QueryInterface(&wave_sink_factory.IClassFactory_iface, riid, out); - } - else - { - FIXME("Unknown clsid %s.\n", debugstr_guid(clsid)); - return CLASS_E_CLASSNOTAVAILABLE; - } + return IClassFactory_QueryInterface(wave_sink_class_factory, riid, out); + + FIXME("Unknown clsid %s.\n", debugstr_guid(clsid)); + return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/mfsrcsnk/mfsrcsnk_private.h b/dlls/mfsrcsnk/mfsrcsnk_private.h index 6654daebbd3..28caea2a1d2 100644 --- a/dlls/mfsrcsnk/mfsrcsnk_private.h +++ b/dlls/mfsrcsnk/mfsrcsnk_private.h @@ -16,6 +16,54 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#define COBJMACROS + +#include "mfapi.h" +#include "mfidl.h" +#include "mferror.h" + #include "wine/mfinternal.h"
-extern HRESULT wave_sink_factory_create(REFIID riid, void **out); +extern IClassFactory *wave_sink_class_factory; + +static inline HRESULT WINAPI class_factory_QueryInterface(IClassFactory *iface, REFIID riid, void **out) +{ + *out = IsEqualGUID(riid, &IID_IClassFactory) || IsEqualGUID(riid, &IID_IUnknown) ? iface : NULL; + return *out ? S_OK : E_NOINTERFACE; +} +static inline ULONG WINAPI class_factory_AddRef(IClassFactory *iface) +{ + return 2; +} +static inline ULONG WINAPI class_factory_Release(IClassFactory *iface) +{ + return 1; +} +static inline HRESULT WINAPI class_factory_LockServer(IClassFactory *iface, BOOL dolock) +{ + return S_OK; +} + +struct sink_class_factory +{ + IClassFactory IClassFactory_iface; + IMFSinkClassFactory IMFSinkClassFactory_iface; +}; + +static inline struct sink_class_factory *sink_class_factory_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, struct sink_class_factory, IClassFactory_iface); +} +static inline HRESULT WINAPI sink_class_factory_QueryInterface(IMFSinkClassFactory *iface, REFIID riid, void **out) +{ + *out = IsEqualGUID(riid, &IID_IMFSinkClassFactory) || IsEqualGUID(riid, &IID_IUnknown) ? iface : NULL; + return *out ? S_OK : E_NOINTERFACE; +} +static inline ULONG WINAPI sink_class_factory_AddRef(IMFSinkClassFactory *iface) +{ + return 2; +} +static inline ULONG WINAPI sink_class_factory_Release(IMFSinkClassFactory *iface) +{ + return 1; +} diff --git a/dlls/mfsrcsnk/wave.c b/dlls/mfsrcsnk/wave.c index 736bbb5aa3c..bae70960a72 100644 --- a/dlls/mfsrcsnk/wave.c +++ b/dlls/mfsrcsnk/wave.c @@ -16,12 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#define COBJMACROS - -#include "mfapi.h" -#include "mfidl.h" -#include "mferror.h" - #include "mfsrcsnk_private.h"
#include "wine/debug.h" @@ -1000,30 +994,6 @@ failed: return hr; }
-static HRESULT WINAPI sink_class_factory_QueryInterface(IMFSinkClassFactory *iface, REFIID riid, void **out) -{ - if (IsEqualIID(riid, &IID_IMFSinkClassFactory) - || IsEqualIID(riid, &IID_IUnknown)) - { - *out = iface; - IMFSinkClassFactory_AddRef(iface); - return S_OK; - } - - *out = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI sink_class_factory_AddRef(IMFSinkClassFactory *iface) -{ - return 2; -} - -static ULONG WINAPI sink_class_factory_Release(IMFSinkClassFactory *iface) -{ - return 1; -} - static HRESULT WINAPI sink_class_factory_CreateMediaSink(IMFSinkClassFactory *iface, IMFByteStream *stream, IMFMediaType *video_type, IMFMediaType *audio_type, IMFMediaSink **sink) { @@ -1040,9 +1010,32 @@ static const IMFSinkClassFactoryVtbl wave_sink_factory_vtbl = sink_class_factory_CreateMediaSink, };
-static IMFSinkClassFactory wave_sink_factory = { &wave_sink_factory_vtbl }; - -HRESULT wave_sink_factory_create(REFIID riid, void **out) +static HRESULT WINAPI class_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **out) { - return IMFSinkClassFactory_QueryInterface(&wave_sink_factory, riid, out); + struct sink_class_factory *factory = sink_class_factory_from_IClassFactory(iface); + + TRACE("iface %p, outer %p, riid %s, out %p stub!.\n", iface, outer, debugstr_guid(riid), out); + + *out = NULL; + if (outer) + return CLASS_E_NOAGGREGATION; + + return IMFSinkClassFactory_QueryInterface(&factory->IMFSinkClassFactory_iface, riid, out); } + +static const IClassFactoryVtbl wave_sink_class_factory_vtbl = +{ + class_factory_QueryInterface, + class_factory_AddRef, + class_factory_Release, + class_factory_CreateInstance, + class_factory_LockServer, +}; + +struct sink_class_factory wave_sink_factory = +{ + { &wave_sink_class_factory_vtbl }, + { &wave_sink_factory_vtbl }, +}; + +IClassFactory *wave_sink_class_factory = &wave_sink_factory.IClassFactory_iface;