xaudio2_8: Implement CreateFX.
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
539d7fb4e4
commit
05111fd815
|
@ -903,6 +903,113 @@ static void test_xapo_creation_legacy(const char *module, unsigned int version)
|
||||||
FreeLibrary(xapofxdll);
|
FreeLibrary(xapofxdll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_xapo_creation_modern(const char *module)
|
||||||
|
{
|
||||||
|
HANDLE xaudio2dll;
|
||||||
|
HRESULT hr;
|
||||||
|
IUnknown *fx_unk;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
HRESULT (CDECL *pCreateFX)(REFCLSID,IUnknown**,void*,UINT32) = NULL;
|
||||||
|
HRESULT (WINAPI *pCAVM)(IUnknown**) = NULL;
|
||||||
|
HRESULT (WINAPI *pCAR)(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}
|
||||||
|
};
|
||||||
|
|
||||||
|
xaudio2dll = LoadLibraryA(module);
|
||||||
|
if(xaudio2dll){
|
||||||
|
pCreateFX = (void*)GetProcAddress(xaudio2dll, "CreateFX");
|
||||||
|
ok(pCreateFX != NULL, "%s did not have CreateFX?\n", module);
|
||||||
|
if(!pCreateFX){
|
||||||
|
FreeLibrary(xaudio2dll);
|
||||||
|
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, NULL, 0);
|
||||||
|
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_IXAPO, (void**)&xapo);
|
||||||
|
ok(hr == S_OK, "Couldn't get IXAPO 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* test legacy CLSID */
|
||||||
|
hr = pCreateFX(&CLSID_AudioVolumeMeter, &fx_unk, NULL, 0);
|
||||||
|
ok(hr == S_OK, "%s: CreateFX(CLSID_AudioVolumeMeter) failed: %08x\n", module, hr);
|
||||||
|
if(SUCCEEDED(hr)){
|
||||||
|
IXAPO *xapo;
|
||||||
|
hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO, (void**)&xapo);
|
||||||
|
ok(hr == S_OK, "Couldn't get IXAPO interface: %08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
IXAPO_Release(xapo);
|
||||||
|
IUnknown_Release(fx_unk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pCAVM = (void*)GetProcAddress(xaudio2dll, "CreateAudioVolumeMeter");
|
||||||
|
ok(pCAVM != NULL, "%s did not have CreateAudioVolumeMeter?\n", module);
|
||||||
|
|
||||||
|
hr = pCAVM(&fx_unk);
|
||||||
|
ok(hr == S_OK, "CreateAudioVolumeMeter failed: %08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr)){
|
||||||
|
IXAPO *xapo;
|
||||||
|
hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO, (void**)&xapo);
|
||||||
|
ok(hr == S_OK, "Couldn't get IXAPO interface: %08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
IXAPO_Release(xapo);
|
||||||
|
IUnknown_Release(fx_unk);
|
||||||
|
}
|
||||||
|
|
||||||
|
pCAR = (void*)GetProcAddress(xaudio2dll, "CreateAudioReverb");
|
||||||
|
ok(pCAR != NULL, "%s did not have CreateAudioReverb?\n", module);
|
||||||
|
|
||||||
|
hr = pCAR(&fx_unk);
|
||||||
|
ok(hr == S_OK, "CreateAudioReverb failed: %08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr)){
|
||||||
|
IXAPO *xapo;
|
||||||
|
hr = IUnknown_QueryInterface(fx_unk, &IID_IXAPO, (void**)&xapo);
|
||||||
|
ok(hr == S_OK, "Couldn't get IXAPO interface: %08x\n", hr);
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
IXAPO_Release(xapo);
|
||||||
|
IUnknown_Release(fx_unk);
|
||||||
|
}
|
||||||
|
|
||||||
|
FreeLibrary(xaudio2dll);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_xapo_creation(void)
|
static void test_xapo_creation(void)
|
||||||
{
|
{
|
||||||
test_xapo_creation_legacy("xapofx1_1.dll", 22);
|
test_xapo_creation_legacy("xapofx1_1.dll", 22);
|
||||||
|
@ -911,6 +1018,7 @@ static void test_xapo_creation(void)
|
||||||
test_xapo_creation_legacy("xapofx1_3.dll", 25);
|
test_xapo_creation_legacy("xapofx1_3.dll", 25);
|
||||||
test_xapo_creation_legacy("xapofx1_4.dll", 26);
|
test_xapo_creation_legacy("xapofx1_4.dll", 26);
|
||||||
test_xapo_creation_legacy("xapofx1_5.dll", 27);
|
test_xapo_creation_legacy("xapofx1_5.dll", 27);
|
||||||
|
test_xapo_creation_modern("xaudio2_8.dll");
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT32 check_has_devices(IXAudio2 *xa)
|
static UINT32 check_has_devices(IXAudio2 *xa)
|
||||||
|
|
|
@ -82,3 +82,10 @@ coclass FXReverb14 { interface IXAPO; }
|
||||||
uuid(a90bc001-e897-e897-7439-43FF02000105)
|
uuid(a90bc001-e897-e897-7439-43FF02000105)
|
||||||
]
|
]
|
||||||
coclass FXReverb15 { interface IXAPO; }
|
coclass FXReverb15 { interface IXAPO; }
|
||||||
|
|
||||||
|
[
|
||||||
|
helpstring("XAudio2.8 FXReverb Class (Wine)"),
|
||||||
|
threading(both),
|
||||||
|
uuid(a90bc001-e897-e897-7439-43FF02000208)
|
||||||
|
]
|
||||||
|
coclass FXReverb28 { interface IXAPO; }
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
@ stdcall XAudio2Create(ptr long long)
|
@ stdcall XAudio2Create(ptr long long)
|
||||||
@ stdcall CreateAudioVolumeMeter(ptr)
|
@ stdcall CreateAudioVolumeMeter(ptr)
|
||||||
|
@ stdcall CreateAudioReverb(ptr)
|
||||||
|
@ cdecl CreateFX(ptr ptr ptr long)
|
||||||
|
|
|
@ -23,11 +23,15 @@
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
#include "initguid.h"
|
#include "initguid.h"
|
||||||
#include "xaudio2.h"
|
#include "xaudio2.h"
|
||||||
#include "xaudio2fx.h"
|
#include "xaudio2fx.h"
|
||||||
#include "xapo.h"
|
#include "xapo.h"
|
||||||
|
#include "xapofx.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(xaudio2);
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
|
@ -85,3 +89,44 @@ HRESULT WINAPI CreateAudioReverb(IUnknown **out)
|
||||||
return CoCreateInstance(&CLSID_AudioReverb, NULL, CLSCTX_INPROC_SERVER,
|
return CoCreateInstance(&CLSID_AudioReverb, NULL, CLSCTX_INPROC_SERVER,
|
||||||
&IID_IUnknown, (void**)out);
|
&IID_IUnknown, (void**)out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT CDECL CreateFX(REFCLSID clsid, IUnknown **out, void *initdata, UINT32 initdata_bytes)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
IUnknown *obj;
|
||||||
|
const GUID *class;
|
||||||
|
|
||||||
|
*out = NULL;
|
||||||
|
class = clsid;
|
||||||
|
|
||||||
|
if(IsEqualGUID(clsid, &CLSID_FXReverb27) ||
|
||||||
|
IsEqualGUID(clsid, &CLSID_FXReverb))
|
||||||
|
class = &CLSID_WINE_FXReverb28;
|
||||||
|
|
||||||
|
hr = CoCreateInstance(class, NULL, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&obj);
|
||||||
|
if(FAILED(hr)){
|
||||||
|
WARN("CoCreateInstance failed: %08x\n", hr);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(initdata && initdata_bytes > 0){
|
||||||
|
IXAPO *xapo;
|
||||||
|
|
||||||
|
hr = IUnknown_QueryInterface(obj, &IID_IXAPO, (void**)&xapo);
|
||||||
|
if(SUCCEEDED(hr)){
|
||||||
|
hr = IXAPO_Initialize(xapo, initdata, initdata_bytes);
|
||||||
|
|
||||||
|
IXAPO_Release(xapo);
|
||||||
|
|
||||||
|
if(FAILED(hr)){
|
||||||
|
WARN("Initialize failed: %08x\n", hr);
|
||||||
|
IUnknown_Release(obj);
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = obj;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue