[PATCH 1/2] xaudio2: Implement CreateFX for legacy xaudio2 versions

Andrew Eikum aeikum at codeweavers.com
Fri Oct 23 14:31:09 CDT 2015


The various xapofx versions all use the same CLSID to identify the
same effect types. In order to differentiate the versions in Wine
without duplicating a ton of code into each xapofx DLL, I made new
internal CLSIDs for each version of xapofx, which xaudio2_7 registers
and uses to tell them apart.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
 dlls/xapofx1_1/Makefile.in        |   1 +
 dlls/xapofx1_1/main.c             |  16 +++++
 dlls/xapofx1_1/xapofx1_1.spec     |   2 +-
 dlls/xapofx1_2/Makefile.in        |   1 +
 dlls/xapofx1_2/main.c             |  16 +++++
 dlls/xapofx1_2/xapofx1_2.spec     |   2 +-
 dlls/xapofx1_3/Makefile.in        |   1 +
 dlls/xapofx1_3/main.c             |  20 +++++-
 dlls/xapofx1_3/xapofx1_3.spec     |   2 +-
 dlls/xapofx1_4/Makefile.in        |   1 +
 dlls/xapofx1_4/main.c             |  21 +++++-
 dlls/xapofx1_4/xapofx1_4.spec     |   2 +-
 dlls/xapofx1_5/main.c             |  12 +++-
 dlls/xaudio2_7/tests/xaudio2.c    | 137 ++++++++++++++++++++++++++++++++++++++
 dlls/xaudio2_7/xaudio_classes.idl |  35 ++++++++++
 dlls/xaudio2_7/xaudio_dll.c       |  49 +++++++++-----
 include/xapofx.h                  |  76 +++++++++++++++++++++
 17 files changed, 371 insertions(+), 23 deletions(-)
 create mode 100644 include/xapofx.h

diff --git a/dlls/xapofx1_1/Makefile.in b/dlls/xapofx1_1/Makefile.in
index aff49eb..48bd79e 100644
--- a/dlls/xapofx1_1/Makefile.in
+++ b/dlls/xapofx1_1/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = xapofx1_1.dll
+IMPORTS   = ole32
 
 C_SRCS = \
 	main.c
diff --git a/dlls/xapofx1_1/main.c b/dlls/xapofx1_1/main.c
index 8fd6022..3e4c839 100644
--- a/dlls/xapofx1_1/main.c
+++ b/dlls/xapofx1_1/main.c
@@ -19,8 +19,11 @@
 #include "config.h"
 #include <stdarg.h>
 
+#include "initguid.h"
 #include "windef.h"
 #include "winbase.h"
+#include "compobj.h"
+#include "xapofx.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(xapofx);
@@ -43,3 +46,16 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
     }
     return TRUE;
 }
+
+HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out)
+{
+    const GUID *class = clsid;
+
+    TRACE("%s %p\n", debugstr_guid(clsid), out);
+
+    if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
+            IsEqualGUID(clsid, &CLSID_FXReverb))
+        class = &CLSID_WINE_FXReverb11;
+
+    return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out);
+}
diff --git a/dlls/xapofx1_1/xapofx1_1.spec b/dlls/xapofx1_1/xapofx1_1.spec
index bc17511..9b768cb 100644
--- a/dlls/xapofx1_1/xapofx1_1.spec
+++ b/dlls/xapofx1_1/xapofx1_1.spec
@@ -1 +1 @@
-@ cdecl CreateFX(ptr ptr) xapofx1_5.CreateFX
+@ cdecl CreateFX(ptr ptr)
diff --git a/dlls/xapofx1_2/Makefile.in b/dlls/xapofx1_2/Makefile.in
index fb76b12..21a2ca7 100644
--- a/dlls/xapofx1_2/Makefile.in
+++ b/dlls/xapofx1_2/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = xapofx1_2.dll
+IMPORTS   = ole32
 
 C_SRCS = \
 	main.c
diff --git a/dlls/xapofx1_2/main.c b/dlls/xapofx1_2/main.c
index e873b58..b70a5e0 100644
--- a/dlls/xapofx1_2/main.c
+++ b/dlls/xapofx1_2/main.c
@@ -19,8 +19,11 @@
 #include "config.h"
 #include <stdarg.h>
 
+#include "initguid.h"
 #include "windef.h"
 #include "winbase.h"
+#include "compobj.h"
+#include "xapofx.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(xapofx);
@@ -43,3 +46,16 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
     }
     return TRUE;
 }
+
+HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out)
+{
+    const GUID *class = clsid;
+
+    TRACE("%s %p\n", debugstr_guid(clsid), out);
+
+    if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
+            IsEqualGUID(clsid, &CLSID_FXReverb))
+        class = &CLSID_WINE_FXReverb12;
+
+    return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out);
+}
diff --git a/dlls/xapofx1_2/xapofx1_2.spec b/dlls/xapofx1_2/xapofx1_2.spec
index bc17511..9b768cb 100644
--- a/dlls/xapofx1_2/xapofx1_2.spec
+++ b/dlls/xapofx1_2/xapofx1_2.spec
@@ -1 +1 @@
-@ cdecl CreateFX(ptr ptr) xapofx1_5.CreateFX
+@ cdecl CreateFX(ptr ptr)
diff --git a/dlls/xapofx1_3/Makefile.in b/dlls/xapofx1_3/Makefile.in
index 3730872..31ef5b3 100644
--- a/dlls/xapofx1_3/Makefile.in
+++ b/dlls/xapofx1_3/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = xapofx1_3.dll
+IMPORTS   = ole32
 
 C_SRCS = \
 	main.c
diff --git a/dlls/xapofx1_3/main.c b/dlls/xapofx1_3/main.c
index 6a7f185..72e1d0d 100644
--- a/dlls/xapofx1_3/main.c
+++ b/dlls/xapofx1_3/main.c
@@ -17,11 +17,16 @@
  */
 
 #include "config.h"
-
 #include <stdarg.h>
 
+#include "initguid.h"
 #include "windef.h"
 #include "winbase.h"
+#include "compobj.h"
+#include "xapofx.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(xaudio2);
 
 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 {
@@ -36,3 +41,16 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 
     return TRUE;
 }
+
+HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out)
+{
+    const GUID *class = clsid;
+
+    TRACE("%s %p\n", debugstr_guid(clsid), out);
+
+    if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
+            IsEqualGUID(clsid, &CLSID_FXReverb))
+        class = &CLSID_WINE_FXReverb13;
+
+    return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out);
+}
diff --git a/dlls/xapofx1_3/xapofx1_3.spec b/dlls/xapofx1_3/xapofx1_3.spec
index bc17511..9b768cb 100644
--- a/dlls/xapofx1_3/xapofx1_3.spec
+++ b/dlls/xapofx1_3/xapofx1_3.spec
@@ -1 +1 @@
-@ cdecl CreateFX(ptr ptr) xapofx1_5.CreateFX
+@ cdecl CreateFX(ptr ptr)
diff --git a/dlls/xapofx1_4/Makefile.in b/dlls/xapofx1_4/Makefile.in
index 12978d8..b65ea90 100644
--- a/dlls/xapofx1_4/Makefile.in
+++ b/dlls/xapofx1_4/Makefile.in
@@ -1,4 +1,5 @@
 MODULE    = xapofx1_4.dll
+IMPORTS   = ole32
 
 C_SRCS = \
 	main.c
diff --git a/dlls/xapofx1_4/main.c b/dlls/xapofx1_4/main.c
index 1b223ad..991a4a7 100644
--- a/dlls/xapofx1_4/main.c
+++ b/dlls/xapofx1_4/main.c
@@ -15,12 +15,18 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+
 #include "config.h"
-
 #include <stdarg.h>
 
+#include "initguid.h"
 #include "windef.h"
 #include "winbase.h"
+#include "compobj.h"
+#include "xapofx.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(xaudio2);
 
 BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 {
@@ -35,3 +41,16 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 
     return TRUE;
 }
+
+HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out)
+{
+    const GUID *class = clsid;
+
+    TRACE("%s %p\n", debugstr_guid(clsid), out);
+
+    if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
+            IsEqualGUID(clsid, &CLSID_FXReverb))
+        class = &CLSID_WINE_FXReverb14;
+
+    return CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out);
+}
diff --git a/dlls/xapofx1_4/xapofx1_4.spec b/dlls/xapofx1_4/xapofx1_4.spec
index bc17511..9b768cb 100644
--- a/dlls/xapofx1_4/xapofx1_4.spec
+++ b/dlls/xapofx1_4/xapofx1_4.spec
@@ -1 +1 @@
-@ cdecl CreateFX(ptr ptr) xapofx1_5.CreateFX
+@ cdecl CreateFX(ptr ptr)
diff --git a/dlls/xapofx1_5/main.c b/dlls/xapofx1_5/main.c
index 4865d31..45ecefc 100644
--- a/dlls/xapofx1_5/main.c
+++ b/dlls/xapofx1_5/main.c
@@ -15,14 +15,15 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+
 #include "config.h"
-
 #include <stdarg.h>
 
 #include "initguid.h"
 #include "windef.h"
 #include "winbase.h"
 #include "compobj.h"
+#include "xapofx.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(xaudio2);
@@ -43,6 +44,13 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
 
 HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out)
 {
+    const GUID *class = clsid;
+
     TRACE("%s %p\n", debugstr_guid(clsid), out);
-    return CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)out);
+
+    if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
+            IsEqualGUID(clsid, &CLSID_FXReverb))
+        class = &CLSID_WINE_FXReverb15;
+
+    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 23da38b..7d7ee17 100644
--- a/dlls/xaudio2_7/tests/xaudio2.c
+++ b/dlls/xaudio2_7/tests/xaudio2.c
@@ -25,6 +25,7 @@
 #include "xaudio2.h"
 #include "xaudio2fx.h"
 #include "xapo.h"
+#include "xapofx.h"
 #include "mmsystem.h"
 
 static BOOL xaudio27;
@@ -246,12 +247,26 @@ static void test_simple_streaming(IXAudio2 *xa)
 
     /* hook up volume meter */
     if(xaudio27){
+        IXAPO *xapo;
+
         hr = CoCreateInstance(&CLSID_AudioVolumeMeter, NULL,
                 CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&vumeter);
         ok(hr == S_OK, "CoCreateInstance(AudioVolumeMeter) failed: %08x\n", hr);
+
+        hr = IUnknown_QueryInterface(vumeter, &IID_IXAPO27, (void**)&xapo);
+        ok(hr == S_OK, "Couldn't get IXAPO27 interface: %08x\n", hr);
+        if(SUCCEEDED(hr))
+            IXAPO_Release(xapo);
     }else{
+        IXAPO *xapo;
+
         hr = pCreateAudioVolumeMeter(&vumeter);
         ok(hr == S_OK, "CreateAudioVolumeMeter failed: %08x\n", hr);
+
+        hr = IUnknown_QueryInterface(vumeter, &IID_IXAPO, (void**)&xapo);
+        ok(hr == S_OK, "Couldn't get IXAPO interface: %08x\n", hr);
+        if(SUCCEEDED(hr))
+            IXAPO_Release(xapo);
     }
 
     effect.InitialState = TRUE;
@@ -778,6 +793,126 @@ static UINT32 test_DeviceDetails(IXAudio27 *xa)
     return count;
 }
 
+static void test_xapo_creation_legacy(const char *module, unsigned int version)
+{
+    HANDLE xapofxdll;
+    HRESULT hr;
+    IUnknown *fx_unk;
+    unsigned int i;
+
+    HRESULT (CDECL *pCreateFX)(REFCLSID,IUnknown**) = NULL;
+
+    /* CLSIDs are the same across all versions */
+    static struct {
+        const GUID *clsid;
+        BOOL todo;
+    } const_clsids[] = {
+        { &CLSID_FXEQ27, TRUE },
+        { &CLSID_FXMasteringLimiter27, TRUE },
+        { &CLSID_FXReverb27, FALSE },
+        { &CLSID_FXEcho27, TRUE},
+        /* older versions of xapofx actually have support for new clsids */
+        { &CLSID_FXEQ, TRUE },
+        { &CLSID_FXMasteringLimiter, TRUE },
+        { &CLSID_FXReverb, FALSE },
+        { &CLSID_FXEcho, TRUE}
+    };
+
+    /* different CLSID for each version */
+    static const GUID *avm_clsids[] = {
+        &CLSID_AudioVolumeMeter20,
+        &CLSID_AudioVolumeMeter21,
+        &CLSID_AudioVolumeMeter22,
+        &CLSID_AudioVolumeMeter23,
+        &CLSID_AudioVolumeMeter24,
+        &CLSID_AudioVolumeMeter25,
+        &CLSID_AudioVolumeMeter26,
+        &CLSID_AudioVolumeMeter
+    };
+
+    static const GUID *ar_clsids[] = {
+        &CLSID_AudioReverb20,
+        &CLSID_AudioReverb21,
+        &CLSID_AudioReverb22,
+        &CLSID_AudioReverb23,
+        &CLSID_AudioReverb24,
+        &CLSID_AudioReverb25,
+        &CLSID_AudioReverb26,
+        &CLSID_AudioReverb
+    };
+
+    xapofxdll = LoadLibraryA(module);
+    if(xapofxdll){
+        pCreateFX = (void*)GetProcAddress(xapofxdll, "CreateFX");
+        ok(pCreateFX != NULL, "%s did not have CreateFX?\n", module);
+        if(!pCreateFX){
+            FreeLibrary(xapofxdll);
+            return;
+        }
+    }else{
+        win_skip("Couldn't load %s\n", module);
+        return;
+    }
+
+    if(pCreateFX){
+        for(i = 0; i < sizeof(const_clsids) / sizeof(*const_clsids); ++i){
+            hr = pCreateFX(const_clsids[i].clsid, &fx_unk);
+            if(const_clsids[i].todo)
+                todo_wine ok(hr == S_OK, "%s: CreateFX(%s) failed: %08x\n", module, wine_dbgstr_guid(const_clsids[i].clsid), hr);
+            else
+                ok(hr == S_OK, "%s: CreateFX(%s) failed: %08x\n", module, wine_dbgstr_guid(const_clsids[i].clsid), hr);
+            if(SUCCEEDED(hr)){
+                IXAPO *xapo;
+                hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO27, (void**)&xapo);
+                ok(hr == S_OK, "Couldn't get IXAPO27 interface: %08x\n", hr);
+                if(SUCCEEDED(hr))
+                    IXAPO_Release(xapo);
+                IUnknown_Release(fx_unk);
+            }
+
+            hr = CoCreateInstance(const_clsids[i].clsid, NULL, CLSCTX_INPROC_SERVER,
+                    &IID_IUnknown, (void**)&fx_unk);
+            ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance should have failed: %08x\n", hr);
+            if(SUCCEEDED(hr))
+                IUnknown_Release(fx_unk);
+        }
+
+        hr = pCreateFX(avm_clsids[version - 20], &fx_unk);
+        ok(hr == S_OK, "%s: CreateFX(%s) failed: %08x\n", module, wine_dbgstr_guid(avm_clsids[version - 20]), hr);
+        if(SUCCEEDED(hr)){
+            IXAPO *xapo;
+            hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO27, (void**)&xapo);
+            ok(hr == S_OK, "Couldn't get IXAPO27 interface: %08x\n", hr);
+            if(SUCCEEDED(hr))
+                IXAPO_Release(xapo);
+            IUnknown_Release(fx_unk);
+        }
+
+        hr = pCreateFX(ar_clsids[version - 20], &fx_unk);
+        ok(hr == S_OK, "%s: CreateFX(%s) failed: %08x\n", module, wine_dbgstr_guid(ar_clsids[version - 20]), hr);
+        if(SUCCEEDED(hr)){
+            IXAPO *xapo;
+            hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO27, (void**)&xapo);
+            ok(hr == S_OK, "Couldn't get IXAPO27 interface: %08x\n", hr);
+            if(SUCCEEDED(hr))
+                IXAPO_Release(xapo);
+            IUnknown_Release(fx_unk);
+        }
+    }
+
+    FreeLibrary(xapofxdll);
+}
+
+static void test_xapo_creation(void)
+{
+    test_xapo_creation_legacy("xapofx1_1.dll", 22);
+    test_xapo_creation_legacy("xapofx1_2.dll", 23);
+    test_xapo_creation_legacy("xapofx1_3.dll", 24);
+    test_xapo_creation_legacy("xapofx1_3.dll", 25);
+    test_xapo_creation_legacy("xapofx1_4.dll", 26);
+    test_xapo_creation_legacy("xapofx1_5.dll", 27);
+}
+
 static UINT32 check_has_devices(IXAudio2 *xa)
 {
     HRESULT hr;
@@ -808,6 +943,8 @@ START_TEST(xaudio2)
         pCreateAudioVolumeMeter = (void*)GetProcAddress(xa28dll, "CreateAudioVolumeMeter");
     }
 
+    test_xapo_creation();
+
     /* XAudio 2.7 (Jun 2010 DirectX) */
     hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER,
             &IID_IXAudio27, (void**)&xa27);
diff --git a/dlls/xaudio2_7/xaudio_classes.idl b/dlls/xaudio2_7/xaudio_classes.idl
index 7be37fd..1f8b020 100644
--- a/dlls/xaudio2_7/xaudio_classes.idl
+++ b/dlls/xaudio2_7/xaudio_classes.idl
@@ -47,3 +47,38 @@ coclass AudioReverb { interface IUnknown; }
     uuid(962f5027-99be-4692-a468-85802cf8de61)
 ]
 coclass XACT31 { interface IUnknown; }
+
+[
+    helpstring("XAPOFX1.1 FXReverb Class (Wine)"),
+    threading(both),
+    uuid(a90bc001-e897-e897-7439-43FF02000101)
+]
+coclass FXReverb11 { interface IXAPO; }
+
+[
+    helpstring("XAPOFX1.2 FXReverb Class (Wine)"),
+    threading(both),
+    uuid(a90bc001-e897-e897-7439-43FF02000102)
+]
+coclass FXReverb12 { interface IXAPO; }
+
+[
+    helpstring("XAPOFX1.3 FXReverb Class (Wine)"),
+    threading(both),
+    uuid(a90bc001-e897-e897-7439-43FF02000103)
+]
+coclass FXReverb13 { interface IXAPO; }
+
+[
+    helpstring("XAPOFX1.4 FXReverb Class (Wine)"),
+    threading(both),
+    uuid(a90bc001-e897-e897-7439-43FF02000104)
+]
+coclass FXReverb14 { interface IXAPO; }
+
+[
+    helpstring("XAPOFX1.5 FXReverb Class (Wine)"),
+    threading(both),
+    uuid(a90bc001-e897-e897-7439-43FF02000105)
+]
+coclass FXReverb15 { interface IXAPO; }
diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index a4a9399..d55d39e 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -29,6 +29,8 @@
 #include "ole2.h"
 #include "rpcproxy.h"
 
+#include "xapofx.h"
+
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(xaudio2);
@@ -2507,13 +2509,13 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
 
     TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 
-    if IsEqualGUID(rclsid, &CLSID_XAudio20){
+    if(IsEqualGUID(rclsid, &CLSID_XAudio20)){
         factory = make_xaudio2_factory(20);
-    }else if IsEqualGUID(rclsid, &CLSID_XAudio21){
+    }else if(IsEqualGUID(rclsid, &CLSID_XAudio21)){
         factory = make_xaudio2_factory(21);
-    }else if IsEqualGUID(rclsid, &CLSID_XAudio22){
+    }else if(IsEqualGUID(rclsid, &CLSID_XAudio22)){
         factory = make_xaudio2_factory(22);
-    }else if IsEqualGUID(rclsid, &CLSID_XAudio23){
+    }else if(IsEqualGUID(rclsid, &CLSID_XAudio23)){
         factory = make_xaudio2_factory(23);
     }else if(IsEqualGUID(rclsid, &CLSID_XAudio24)){
         factory = make_xaudio2_factory(24);
@@ -2524,13 +2526,13 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
     }else if(IsEqualGUID(rclsid, &CLSID_XAudio2)){
         factory = make_xaudio2_factory(27);
 
-    }else if IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter20){
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter20)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 20);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter21){
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter21)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 21);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter22){
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter22)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 22);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter23){
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter23)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 23);
     }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter24)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 24);
@@ -2541,23 +2543,40 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
     }else if(IsEqualGUID(rclsid, &CLSID_AudioVolumeMeter)){
         factory = make_xapo_factory(&CLSID_AudioVolumeMeter, 27);
 
-    }else if IsEqualGUID(rclsid, &CLSID_AudioReverb20){
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb20)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 20);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioReverb21){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb21) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb10)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 21);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioReverb22){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb22) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb11)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 22);
-    }else if IsEqualGUID(rclsid, &CLSID_AudioReverb23){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb23) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb12)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 23);
-    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb24)){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb24) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb13)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 24);
+
     }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb25)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 25);
-    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb26)){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb26) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb14)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 26);
-    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb)){
+
+    }else if(IsEqualGUID(rclsid, &CLSID_AudioReverb) ||
+            IsEqualGUID(rclsid, &CLSID_WINE_FXReverb15)){
         factory = make_xapo_factory(&CLSID_AudioReverb, 27);
+
+    }else if(IsEqualGUID(rclsid, &CLSID_WINE_FXReverb28)){
+        factory = make_xapo_factory(&CLSID_AudioReverb, 28);
     }
+
     if(!factory) return CLASS_E_CLASSNOTAVAILABLE;
 
     return IClassFactory_QueryInterface(factory, riid, ppv);
diff --git a/include/xapofx.h b/include/xapofx.h
new file mode 100644
index 0000000..9a51689
--- /dev/null
+++ b/include/xapofx.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2015 Andrew Eikum for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* CLSIDs used by CreateFX, but never registered */
+
+#ifndef _XAPOFX_H
+#define _XAPOFX_H
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXEQ27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x00);
+/* xaudio 2.8 */
+DEFINE_GUID(CLSID_FXEQ, 0xf5e01117, 0xd6c4, 0x485a, 0xa3, 0xf5, 0x69, 0x51, 0x96, 0xf3, 0xdb, 0xfa);
+/* wine internal */
+DEFINE_GUID(CLSID_WINE_FXEQ10, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x00);
+DEFINE_GUID(CLSID_WINE_FXEQ11, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x01);
+DEFINE_GUID(CLSID_WINE_FXEQ12, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x02);
+DEFINE_GUID(CLSID_WINE_FXEQ13, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x03);
+DEFINE_GUID(CLSID_WINE_FXEQ14, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x04);
+DEFINE_GUID(CLSID_WINE_FXEQ15, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x01, 0x05);
+DEFINE_GUID(CLSID_WINE_FXEQ28, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x00, 0x00, 0x02, 0x08);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXMasteringLimiter27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x01);
+/* xaudio 2.8 */
+DEFINE_GUID(CLSID_FXMasteringLimiter, 0xc4137916, 0x2be1, 0x46fd, 0x85, 0x99, 0x44, 0x15, 0x36, 0xf4, 0x98, 0x56);
+/* wine internal */
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter10, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x00);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter11, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x01);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter12, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x02);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter13, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x03);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter14, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x04);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter15, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x01, 0x05);
+DEFINE_GUID(CLSID_WINE_FXMasteringLimiter28, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x01, 0x00, 0x02, 0x08);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXReverb27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x02);
+/* xaudio 2.8 */
+DEFINE_GUID(CLSID_FXReverb, 0x7d9aca56, 0xcb68, 0x4807, 0xb6, 0x32, 0xb1, 0x37, 0x35, 0x2e, 0x85, 0x96);
+/* wine internal */
+DEFINE_GUID(CLSID_WINE_FXReverb10, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x00);
+DEFINE_GUID(CLSID_WINE_FXReverb11, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x01);
+DEFINE_GUID(CLSID_WINE_FXReverb12, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x02);
+DEFINE_GUID(CLSID_WINE_FXReverb13, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x03);
+DEFINE_GUID(CLSID_WINE_FXReverb14, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x04);
+DEFINE_GUID(CLSID_WINE_FXReverb15, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x01, 0x05);
+DEFINE_GUID(CLSID_WINE_FXReverb28, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x02, 0x00, 0x02, 0x08);
+
+/* xapofx 1.0 through 1.5 */
+DEFINE_GUID(CLSID_FXEcho27, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0x55, 0x00, 0x00, 0x00, 0x03);
+/* xaudio 2.8 */
+DEFINE_GUID(CLSID_FXEcho, 0x5039d740, 0xf736, 0x449a, 0x84, 0xd3, 0xa5, 0x62, 0x02, 0x55, 0x7b, 0x87);
+/* wine internal */
+DEFINE_GUID(CLSID_WINE_FXEcho10, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x00);
+DEFINE_GUID(CLSID_WINE_FXEcho11, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x01);
+DEFINE_GUID(CLSID_WINE_FXEcho12, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x02);
+DEFINE_GUID(CLSID_WINE_FXEcho13, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x03);
+DEFINE_GUID(CLSID_WINE_FXEcho14, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x04);
+DEFINE_GUID(CLSID_WINE_FXEcho15, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x01, 0x05);
+DEFINE_GUID(CLSID_WINE_FXEcho28, 0xa90bc001, 0xe897, 0xe897, 0x74, 0x39, 0x43, 0xFF, 0x03, 0x00, 0x02, 0x08);
+
+#endif
-- 
2.6.2





More information about the wine-patches mailing list