From daed36fbe3bcad9a287c295a583c46da77a03eac Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Tue, 27 Oct 2015 14:34:00 -0500 Subject: [PATCH] xaudio2: Add stub interface for FXEQ. Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard --- dlls/xapofx1_1/main.c | 3 + dlls/xapofx1_2/main.c | 3 + dlls/xapofx1_3/main.c | 3 + dlls/xapofx1_4/main.c | 3 + dlls/xapofx1_5/main.c | 3 + dlls/xaudio2_7/tests/xaudio2.c | 9 +- dlls/xaudio2_7/xapofx.c | 219 ++++++++++++++++++++++++++++++++++++++ dlls/xaudio2_7/xaudio_classes.idl | 42 ++++++++ dlls/xaudio2_7/xaudio_dll.c | 16 +++ dlls/xaudio2_8/xaudio_dll.c | 3 + 10 files changed, 299 insertions(+), 5 deletions(-) diff --git a/dlls/xapofx1_1/main.c b/dlls/xapofx1_1/main.c index 3e4c839569b..00fe3fffa66 100644 --- a/dlls/xapofx1_1/main.c +++ b/dlls/xapofx1_1/main.c @@ -56,6 +56,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out) if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb11; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ11; return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } diff --git a/dlls/xapofx1_2/main.c b/dlls/xapofx1_2/main.c index b70a5e03761..6eeed2292b1 100644 --- a/dlls/xapofx1_2/main.c +++ b/dlls/xapofx1_2/main.c @@ -56,6 +56,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out) if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb12; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ12; return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } diff --git a/dlls/xapofx1_3/main.c b/dlls/xapofx1_3/main.c index 72e1d0d9fbf..ba846a488fb 100644 --- a/dlls/xapofx1_3/main.c +++ b/dlls/xapofx1_3/main.c @@ -51,6 +51,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out) if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb13; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ13; return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } diff --git a/dlls/xapofx1_4/main.c b/dlls/xapofx1_4/main.c index 991a4a7d0dd..15219cebb33 100644 --- a/dlls/xapofx1_4/main.c +++ b/dlls/xapofx1_4/main.c @@ -51,6 +51,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out) if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb14; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ14; return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } diff --git a/dlls/xapofx1_5/main.c b/dlls/xapofx1_5/main.c index 45ecefc6dc4..64d9475c4a2 100644 --- a/dlls/xapofx1_5/main.c +++ b/dlls/xapofx1_5/main.c @@ -51,6 +51,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out) if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb15; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ15; return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out); } diff --git a/dlls/xaudio2_7/tests/xaudio2.c b/dlls/xaudio2_7/tests/xaudio2.c index a664817342c..3f03cc647c8 100644 --- a/dlls/xaudio2_7/tests/xaudio2.c +++ b/dlls/xaudio2_7/tests/xaudio2.c @@ -807,12 +807,12 @@ static void test_xapo_creation_legacy(const char *module, unsigned int version) const GUID *clsid; BOOL todo; } const_clsids[] = { - { &CLSID_FXEQ27, TRUE }, + { &CLSID_FXEQ27, FALSE }, { &CLSID_FXMasteringLimiter27, TRUE }, { &CLSID_FXReverb27, FALSE }, { &CLSID_FXEcho27, TRUE}, /* older versions of xapofx actually have support for new clsids */ - { &CLSID_FXEQ, TRUE }, + { &CLSID_FXEQ, FALSE }, { &CLSID_FXMasteringLimiter, TRUE }, { &CLSID_FXReverb, FALSE }, { &CLSID_FXEcho, TRUE} @@ -919,12 +919,11 @@ static void test_xapo_creation_modern(const char *module) const GUID *clsid; BOOL todo; } const_clsids[] = { - { &CLSID_FXEQ27, TRUE }, + { &CLSID_FXEQ27, FALSE }, { &CLSID_FXMasteringLimiter27, TRUE }, { &CLSID_FXReverb27, FALSE }, { &CLSID_FXEcho27, TRUE}, - /* older versions of xapofx actually have support for new clsids */ - { &CLSID_FXEQ, TRUE }, + { &CLSID_FXEQ, FALSE }, { &CLSID_FXMasteringLimiter, TRUE }, { &CLSID_FXReverb, FALSE }, { &CLSID_FXEcho, TRUE} diff --git a/dlls/xaudio2_7/xapofx.c b/dlls/xaudio2_7/xapofx.c index c23c336ffe5..0fd008a0d94 100644 --- a/dlls/xaudio2_7/xapofx.c +++ b/dlls/xaudio2_7/xapofx.c @@ -438,6 +438,209 @@ static const IXAPOParametersVtbl RVBXAPOParameters_Vtbl = { RVBXAPOParams_GetParameters }; +typedef struct _EQImpl { + IXAPO IXAPO_iface; + IXAPOParameters IXAPOParameters_iface; + + LONG ref; + + DWORD version; +} EQImpl; + +static EQImpl *EQImpl_from_IXAPO(IXAPO *iface) +{ + return CONTAINING_RECORD(iface, EQImpl, IXAPO_iface); +} + +static EQImpl *EQImpl_from_IXAPOParameters(IXAPOParameters *iface) +{ + return CONTAINING_RECORD(iface, EQImpl, IXAPOParameters_iface); +} + +static HRESULT WINAPI EQXAPO_QueryInterface(IXAPO *iface, REFIID riid, void **ppvObject) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + + TRACE("%p, %s, %p\n", This, wine_dbgstr_guid(riid), ppvObject); + + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IXAPO) || + IsEqualGUID(riid, &IID_IXAPO27)) + *ppvObject = &This->IXAPO_iface; + else if(IsEqualGUID(riid, &IID_IXAPOParameters)) + *ppvObject = &This->IXAPOParameters_iface; + else + *ppvObject = NULL; + + if(*ppvObject){ + IUnknown_AddRef((IUnknown*)*ppvObject); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI EQXAPO_AddRef(IXAPO *iface) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + ULONG ref = InterlockedIncrement(&This->ref); + TRACE("(%p)->(): Refcount now %u\n", This, ref); + return ref; +} + +static ULONG WINAPI EQXAPO_Release(IXAPO *iface) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): Refcount now %u\n", This, ref); + + if(!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI EQXAPO_GetRegistrationProperties(IXAPO *iface, + XAPO_REGISTRATION_PROPERTIES **props) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %p\n", This, props); + /* TODO: check for version == 20 and use XAPO20_REGISTRATION_PROPERTIES */ + return E_NOTIMPL; +} + +static HRESULT WINAPI EQXAPO_IsInputFormatSupported(IXAPO *iface, + const WAVEFORMATEX *output_fmt, const WAVEFORMATEX *input_fmt, + WAVEFORMATEX **supported_fmt) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %p, %p, %p\n", This, output_fmt, input_fmt, supported_fmt); + return E_NOTIMPL; +} + +static HRESULT WINAPI EQXAPO_IsOutputFormatSupported(IXAPO *iface, + const WAVEFORMATEX *input_fmt, const WAVEFORMATEX *output_fmt, + WAVEFORMATEX **supported_fmt) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %p, %p, %p\n", This, input_fmt, output_fmt, supported_fmt); + return E_NOTIMPL; +} + +static HRESULT WINAPI EQXAPO_Initialize(IXAPO *iface, const void *data, + UINT32 data_len) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %p, %u\n", This, data, data_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI EQXAPO_Reset(IXAPO *iface) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI EQXAPO_LockForProcess(IXAPO *iface, UINT32 in_params_count, + const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, + const XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS *out_params) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %u, %p, %u, %p\n", This, in_params_count, in_params, + out_params_count, out_params); + return E_NOTIMPL; +} + +static void WINAPI EQXAPO_UnlockForProcess(IXAPO *iface) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p\n", This); +} + +static void WINAPI EQXAPO_Process(IXAPO *iface, UINT32 in_params_count, + const XAPO_PROCESS_BUFFER_PARAMETERS *in_params, + UINT32 out_params_count, + const XAPO_PROCESS_BUFFER_PARAMETERS *out_params, BOOL enabled) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %u, %p, %u, %p, %u\n", This, in_params_count, in_params, + out_params_count, out_params, enabled); +} + +static UINT32 WINAPI EQXAPO_CalcInputFrames(IXAPO *iface, UINT32 output_frames) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %u\n", This, output_frames); + return 0; +} + +static UINT32 WINAPI EQXAPO_CalcOutputFrames(IXAPO *iface, UINT32 input_frames) +{ + EQImpl *This = EQImpl_from_IXAPO(iface); + TRACE("%p, %u\n", This, input_frames); + return 0; +} + +static const IXAPOVtbl EQXAPO_Vtbl = { + EQXAPO_QueryInterface, + EQXAPO_AddRef, + EQXAPO_Release, + EQXAPO_GetRegistrationProperties, + EQXAPO_IsInputFormatSupported, + EQXAPO_IsOutputFormatSupported, + EQXAPO_Initialize, + EQXAPO_Reset, + EQXAPO_LockForProcess, + EQXAPO_UnlockForProcess, + EQXAPO_Process, + EQXAPO_CalcInputFrames, + EQXAPO_CalcOutputFrames +}; + +static HRESULT WINAPI EQXAPOParams_QueryInterface(IXAPOParameters *iface, + REFIID riid, void **ppvObject) +{ + EQImpl *This = EQImpl_from_IXAPOParameters(iface); + return EQXAPO_QueryInterface(&This->IXAPO_iface, riid, ppvObject); +} + +static ULONG WINAPI EQXAPOParams_AddRef(IXAPOParameters *iface) +{ + EQImpl *This = EQImpl_from_IXAPOParameters(iface); + return EQXAPO_AddRef(&This->IXAPO_iface); +} + +static ULONG WINAPI EQXAPOParams_Release(IXAPOParameters *iface) +{ + EQImpl *This = EQImpl_from_IXAPOParameters(iface); + return EQXAPO_Release(&This->IXAPO_iface); +} + +static void WINAPI EQXAPOParams_SetParameters(IXAPOParameters *iface, + const void *params, UINT32 params_len) +{ + EQImpl *This = EQImpl_from_IXAPOParameters(iface); + TRACE("%p, %p, %u\n", This, params, params_len); +} + +static void WINAPI EQXAPOParams_GetParameters(IXAPOParameters *iface, void *params, + UINT32 params_len) +{ + EQImpl *This = EQImpl_from_IXAPOParameters(iface); + TRACE("%p, %p, %u\n", This, params, params_len); +} + +static const IXAPOParametersVtbl EQXAPOParameters_Vtbl = { + EQXAPOParams_QueryInterface, + EQXAPOParams_AddRef, + EQXAPOParams_Release, + EQXAPOParams_SetParameters, + EQXAPOParams_GetParameters +}; + struct xapo_cf { IClassFactory IClassFactory_iface; LONG ref; @@ -528,6 +731,22 @@ static HRESULT WINAPI xapocf_CreateInstance(IClassFactory *iface, IUnknown *pOut HeapFree(GetProcessHeap(), 0, object); return hr; } + }else if(IsEqualGUID(This->class, &CLSID_FXEQ)){ + EQImpl *object; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if(!object) + return E_OUTOFMEMORY; + + object->IXAPO_iface.lpVtbl = &EQXAPO_Vtbl; + object->IXAPOParameters_iface.lpVtbl = &EQXAPOParameters_Vtbl; + object->version = This->version; + + hr = IXAPO_QueryInterface(&object->IXAPO_iface, riid, ppobj); + if(FAILED(hr)){ + HeapFree(GetProcessHeap(), 0, object); + return hr; + } }else return E_INVALIDARG; diff --git a/dlls/xaudio2_7/xaudio_classes.idl b/dlls/xaudio2_7/xaudio_classes.idl index 42a8cbfd1ee..a8ee9bf72ce 100644 --- a/dlls/xaudio2_7/xaudio_classes.idl +++ b/dlls/xaudio2_7/xaudio_classes.idl @@ -89,3 +89,45 @@ coclass FXReverb15 { interface IXAPO; } uuid(a90bc001-e897-e897-7439-43FF02000208) ] coclass FXReverb28 { interface IXAPO; } + +[ + helpstring("XAPOFX1.1 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000101) +] +coclass FXEQ11 { interface IXAPO; } + +[ + helpstring("XAPOFX1.2 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000102) +] +coclass FXEQ12 { interface IXAPO; } + +[ + helpstring("XAPOFX1.3 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000103) +] +coclass FXEQ13 { interface IXAPO; } + +[ + helpstring("XAPOFX1.4 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000104) +] +coclass FXEQ14 { interface IXAPO; } + +[ + helpstring("XAPOFX1.5 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000105) +] +coclass FXEQ15 { interface IXAPO; } + +[ + helpstring("XAudio2.8 FXEQ Class (Wine)"), + threading(both), + uuid(a90bc001-e897-e897-7439-43FF00000208) +] +coclass FXEQ28 { interface IXAPO; } diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 08814f196ec..9cf6ba6f580 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -2067,6 +2067,22 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXReverb28)){ factory = make_xapo_factory(&CLSID_AudioReverb, 28); + + + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ10)){ + factory = make_xapo_factory(&CLSID_FXEQ, 21); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ11)){ + factory = make_xapo_factory(&CLSID_FXEQ, 22); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ12)){ + factory = make_xapo_factory(&CLSID_FXEQ, 23); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ13)){ + factory = make_xapo_factory(&CLSID_FXEQ, 24); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ14)){ + factory = make_xapo_factory(&CLSID_FXEQ, 26); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ15)){ + factory = make_xapo_factory(&CLSID_FXEQ, 27); + }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXEQ28)){ + factory = make_xapo_factory(&CLSID_FXEQ, 28); } if(!factory) return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/xaudio2_8/xaudio_dll.c b/dlls/xaudio2_8/xaudio_dll.c index 0a0ef4a9b38..b3813240acf 100644 --- a/dlls/xaudio2_8/xaudio_dll.c +++ b/dlls/xaudio2_8/xaudio_dll.c @@ -103,6 +103,9 @@ HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out, void *initdata, UINT32 in if(IsEqualGUID(clsid, &CLSID_FXReverb27) || IsEqualGUID(clsid, &CLSID_FXReverb)) class = &CLSID_WINE_FXReverb28; + else if(IsEqualGUID(clsid, &CLSID_FXEQ27) || + IsEqualGUID(clsid, &CLSID_FXEQ)) + class = &CLSID_WINE_FXEQ28; hr = CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&obj); if(FAILED(hr)){ -- 2.11.4.GIT