mirror of
https://github.com/XWine1/XboxAudio2.git
synced 2026-07-24 12:32:42 -07:00
91 lines
3.1 KiB
C++
91 lines
3.1 KiB
C++
#include <Windows.h>
|
|
#include "xaudio2_impl.h"
|
|
#define ORDINAL_PROC(n) extern "C" void *OrdinalProc##n; void *OrdinalProc##n; __pragma(comment(linker, "/export:OrdinalThunk" #n ",@" #n ",NONAME"))
|
|
|
|
//
|
|
// Variant 1 (older ERA titles)
|
|
// 1: XAudio2Create
|
|
// 2: CreateAudioReverb
|
|
// 3: CreateAudioVolumeMeter
|
|
// 4: CreateFX
|
|
// 5: X3DAudioCalculate
|
|
// 6: X3DAudioInitialize
|
|
//
|
|
// Variant 2 (newer ERA titles)
|
|
// 1: CreateAudioReverb
|
|
// 2: CreateAudioVolumeMeter
|
|
// 3: CreateFX
|
|
// 4: CreateXAudio2Object
|
|
// 5: X3DAudioCalculate
|
|
// 6: X3DAudioInitialize
|
|
//
|
|
ORDINAL_PROC(1);
|
|
ORDINAL_PROC(2);
|
|
ORDINAL_PROC(3);
|
|
ORDINAL_PROC(4);
|
|
|
|
#pragma comment(linker, "/export:CreateXAudio2Object")
|
|
#pragma comment(linker, "/export:XAudio2Create=CreateXAudio2Object")
|
|
|
|
// We need to export everything because GetModuleHandle("XAudio2_9") may resolve to this DLL.
|
|
#define XAUDIO2_FORWARD(Name) __pragma(comment(linker, "/export:" #Name "=C:\\WINDOWS\\System32\\XAudio2_9." #Name))
|
|
#define XAUDIO2_FORWARD_ORDINAL(Name, Ordinal) __pragma(comment(linker, "/export:" #Name "=C:\\WINDOWS\\System32\\XAudio2_9." #Name ",@" #Ordinal))
|
|
XAUDIO2_FORWARD(CreateAudioReverb)
|
|
XAUDIO2_FORWARD(CreateAudioVolumeMeter)
|
|
XAUDIO2_FORWARD(CreateFX)
|
|
XAUDIO2_FORWARD_ORDINAL(X3DAudioCalculate, 5)
|
|
XAUDIO2_FORWARD_ORDINAL(X3DAudioInitialize, 6)
|
|
XAUDIO2_FORWARD_ORDINAL(CreateAudioReverbV2_8, 7)
|
|
XAUDIO2_FORWARD_ORDINAL(XAudio2CreateV2_9, 8)
|
|
XAUDIO2_FORWARD_ORDINAL(XAudio2CreateWithVersionInfo, 9)
|
|
XAUDIO2_FORWARD_ORDINAL(XAudio2CreateWithSharedContexts, 10)
|
|
|
|
BOOL WINAPI DllMain(
|
|
_In_ HINSTANCE hinstDLL,
|
|
_In_ DWORD fdwReason,
|
|
_In_ LPVOID lpvReserved)
|
|
{
|
|
OSVERSIONINFOW OsVersion = { sizeof(OsVersion) };
|
|
|
|
if (fdwReason != DLL_PROCESS_ATTACH)
|
|
return TRUE;
|
|
|
|
// This should link to kernelx.dll!GetVersionExW.
|
|
#pragma warning(suppress : 28159)
|
|
if (!GetVersionExW(&OsVersion))
|
|
return FALSE;
|
|
|
|
// 6.2.10698.0 is the oldest known OS version with CreateXAudio2Object.
|
|
if (OsVersion.dwMajorVersion > 6 ||
|
|
(OsVersion.dwMajorVersion == 6 && OsVersion.dwMinorVersion > 2) ||
|
|
(OsVersion.dwMajorVersion == 6 && OsVersion.dwMinorVersion == 2 && OsVersion.dwBuildNumber >= 10698))
|
|
{
|
|
OrdinalProc1 = GetProcAddress(hinstDLL, "CreateAudioReverb");
|
|
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
|
|
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateFX");
|
|
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateXAudio2Object");
|
|
}
|
|
else
|
|
{
|
|
OrdinalProc1 = GetProcAddress(hinstDLL, "XAudio2Create");
|
|
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioReverb");
|
|
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
|
|
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateFX");
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
HRESULT CreateXAudio2Object(
|
|
IXAudio2 **ppXAudio2,
|
|
UINT32 Flags,
|
|
XAUDIO2_PROCESSOR XAudio2Processor,
|
|
void *pSharedShapeContexts)
|
|
{
|
|
HRESULT hr;
|
|
Microsoft::WRL::ComPtr<IXAudio2> pXAudio2;
|
|
RETURN_IF_FAILED(hr = XAudio2Create(&pXAudio2, Flags, XAudio2Processor));
|
|
*ppXAudio2 = new CXAudio2(pXAudio2.Get());
|
|
return hr;
|
|
}
|