From: Vijay Kiran Kamuju Subject: [PATCH 4/4] xactengine3_7: Implement classfactory for IXACT3Engine. Message-Id: Date: Thu, 2 Jul 2020 22:40:47 +0200 Based on patch from Ethan Lee. Signed-off-by: Vijay Kiran Kamuju From c33bf8abe659fd55c052979b078a39b3c22d3e71 Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju Date: Thu, 2 Jul 2020 09:40:58 +0200 Subject: [PATCH 4/4] xactengine3_7: Implement classfactory for IXACT3Engine. Based on patch from Ethan Lee. Signed-off-by: Vijay Kiran Kamuju --- dlls/xactengine3_7/Makefile.in | 5 +- dlls/xactengine3_7/xact_dll.c | 85 +++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/dlls/xactengine3_7/Makefile.in b/dlls/xactengine3_7/Makefile.in index 416660bfa5..5259ed1cbd 100644 --- a/dlls/xactengine3_7/Makefile.in +++ b/dlls/xactengine3_7/Makefile.in @@ -1,8 +1,11 @@ MODULE = xactengine3_7.dll +IMPORTS = ole32 uuid +PARENTSRC = ../xaudio2_7 EXTRALIBS = $(FAUDIO_LIBS) EXTRAINCL = $(FAUDIO_CFLAGS) C_SRCS = \ - xact_dll.c + xact_dll.c \ + xaudio_allocator.c IDL_SRCS = xact_classes.idl diff --git a/dlls/xactengine3_7/xact_dll.c b/dlls/xactengine3_7/xact_dll.c index 5c395480d9..7e2401f7c9 100644 --- a/dlls/xactengine3_7/xact_dll.c +++ b/dlls/xactengine3_7/xact_dll.c @@ -23,6 +23,9 @@ #define NONAMELESSUNION #define COBJMACROS +#include "xaudio_private.h" + +#include "initguid.h" #include "xact3.h" #include @@ -394,6 +397,83 @@ static const IXACT3EngineVtbl XACT3Engine_Vtbl = IXACT3EngineImpl_GetGlobalVariable }; +static HRESULT WINAPI XACT3CF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppobj) +{ + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + *ppobj = iface; + return S_OK; + } + + *ppobj = NULL; + WARN("(%p)->(%s, %p): interface not found\n", iface, debugstr_guid(riid), ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI XACT3CF_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI XACT3CF_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI XACT3CF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, + REFIID riid, void **ppobj) +{ + HRESULT hr; + XACT3EngineImpl *object; + + TRACE("(%p)->(%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if(pOuter) + return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if(!object) + return E_OUTOFMEMORY; + + object->IXACT3Engine_iface.lpVtbl = &XACT3Engine_Vtbl; + + FACTCreateEngineWithCustomAllocatorEXT( + 0, + &object->fact_engine, + XAudio_Internal_Malloc, + XAudio_Internal_Free, + XAudio_Internal_Realloc + ); + + hr = IXACT3Engine_QueryInterface(&object->IXACT3Engine_iface, riid, ppobj); + if(FAILED(hr)){ + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + return hr; +} + +static HRESULT WINAPI XACT3CF_LockServer(IClassFactory *iface, BOOL dolock) +{ + TRACE("(%p)->(%d): stub!\n", iface, dolock); + return S_OK; +} + +static const IClassFactoryVtbl XACT3CF_Vtbl = +{ + XACT3CF_QueryInterface, + XACT3CF_AddRef, + XACT3CF_Release, + XACT3CF_CreateInstance, + XACT3CF_LockServer +}; + +static IClassFactory XACTFactory = { &XACT3CF_Vtbl }; + BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, void *pReserved) { TRACE("(%p, %d, %p)\n", hinstDLL, reason, pReserved); @@ -415,7 +495,10 @@ HRESULT WINAPI DllCanUnloadNow(void) HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) { - FIXME("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + + if (IsEqualGUID(rclsid, &CLSID_XACTEngine37)) + return IClassFactory_QueryInterface(&XACTFactory, riid, ppv); return CLASS_E_CLASSNOTAVAILABLE; } -- 2.27.0