mirror of
https://github.com/XWine1/XboxAudio2.git
synced 2026-07-24 12:32:42 -07:00
Add dynamic OS version check
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(XboxAudio2 LANGUAGES CXX ASM_MASM)
|
||||
add_subdirectory(lib)
|
||||
|
||||
file(GLOB_RECURSE XAUDIO_SOURCES CONFIGURE_DEPENDS "include/*.h" "source/*.cpp" "source/*.h" "source/*.asm")
|
||||
add_library(XAudio2_9 SHARED ${XAUDIO_SOURCES})
|
||||
@@ -12,3 +13,6 @@ target_link_libraries(XAudio2_9 PRIVATE ${FFMPEG_LIBRARIES})
|
||||
|
||||
find_package(wil CONFIG REQUIRED)
|
||||
target_link_libraries(XAudio2_9 PRIVATE WIL::WIL)
|
||||
|
||||
target_link_directories(XAudio2_9 PRIVATE lib)
|
||||
target_link_libraries(XAudio2_9 PRIVATE kernelx)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
*.exp
|
||||
*.lib
|
||||
@@ -0,0 +1,18 @@
|
||||
file(GLOB DEF_FILES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.def")
|
||||
cmake_path(CONVERT "${DEF_FILES}" TO_NATIVE_PATH_LIST DEF_FILES)
|
||||
|
||||
foreach(DEF_FILE ${DEF_FILES})
|
||||
get_filename_component(DEF_NAME_WE "${DEF_FILE}" NAME_WE)
|
||||
|
||||
execute_process(
|
||||
COMMAND lib
|
||||
/machine:x64
|
||||
"/def:${DEF_FILE}"
|
||||
"/out:${CMAKE_CURRENT_SOURCE_DIR}\\${DEF_NAME_WE}.lib"
|
||||
RESULT_VARIABLE LIB_RESULT
|
||||
ERROR_VARIABLE LIB_ERROR)
|
||||
|
||||
if(NOT LIB_RESULT EQUAL 0)
|
||||
message(FATAL_ERROR "${LIB_ERROR}")
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -0,0 +1,3 @@
|
||||
LIBRARY kernelx.dll
|
||||
EXPORTS
|
||||
GetVersionExW
|
||||
+29
-16
@@ -47,25 +47,38 @@ BOOL WINAPI DllMain(
|
||||
_In_ DWORD fdwReason,
|
||||
_In_ LPVOID lpvReserved)
|
||||
{
|
||||
OSVERSIONINFOW OsVersion = { sizeof(OsVersion) };
|
||||
|
||||
if (fdwReason != DLL_PROCESS_ATTACH)
|
||||
return TRUE;
|
||||
|
||||
// TODO: Dynamic check
|
||||
#if 1
|
||||
OrdinalProc1 = GetProcAddress(hinstDLL, "CreateAudioReverb");
|
||||
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
|
||||
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateFX");
|
||||
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateXAudio2Object");
|
||||
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
|
||||
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
|
||||
#else
|
||||
OrdinalProc1 = GetProcAddress(hinstDLL, "XAudio2Create");
|
||||
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioReverb");
|
||||
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
|
||||
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateFX");
|
||||
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
|
||||
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
|
||||
#endif
|
||||
// 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");
|
||||
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
|
||||
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
|
||||
}
|
||||
else
|
||||
{
|
||||
OrdinalProc1 = GetProcAddress(hinstDLL, "XAudio2Create");
|
||||
OrdinalProc2 = GetProcAddress(hinstDLL, "CreateAudioReverb");
|
||||
OrdinalProc3 = GetProcAddress(hinstDLL, "CreateAudioVolumeMeter");
|
||||
OrdinalProc4 = GetProcAddress(hinstDLL, "CreateFX");
|
||||
OrdinalProc5 = GetProcAddress(hinstDLL, "X3DAudioCalculate");
|
||||
OrdinalProc6 = GetProcAddress(hinstDLL, "X3DAudioInitialize");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user