Merge remote-tracking branch 'RBDOOM-3-BFG/master'

This commit is contained in:
Robert Beckebans 2015-10-22 23:49:12 +02:00
commit cd084649c6
9 changed files with 332 additions and 201 deletions

View file

@ -170,6 +170,10 @@ _________________________
> yum install cmake SDL-devel openal-devel
On ArchLinux
> sudo pacman -S sdl2 ffmpeg openal cmake
On openSUSE (tested in 13.1)
> zypper in openal-soft-devel cmake libSDL-devel libffmpeg1-devel
@ -346,6 +350,8 @@ If you want to report an issue with the game, you should make sure that your rep
* If you are sending a console log, make sure to enable developer output:
RBDoom3BFG.exe +set developer 1 +set logfile 2
You can find your qconsole.log on Windows in C:\Users\<your user name>\Saved Games\id Software\RBDOOM 3 BFG\base\
NOTE: We cannot help you with OS-specific issues like configuring OpenGL correctly, configuring ALSA or configuring the network.

View file

@ -8,6 +8,9 @@ option(USE_MFC_TOOLS
option(MONOLITH
"Embed game logic into main executable" ON)
option(USE_PRECOMPILED_HEADERS
"Use precompiled headers during build" ON)
option(SDL2
"Use SDL2 instead of SDL1.2" ON)
@ -36,6 +39,12 @@ option(USE_SYSTEM_LIBJPEG
option(USE_SYSTEM_LIBGLEW
"Use the system libglew instead of the bundled one" OFF)
set(CPU_TYPE "" CACHE STRING "When set, passes this string as CPU-ID which will be embedded into the binary.")
set(CPU_OPTIMIZATION "-mmmx -msse -msse2" CACHE STRING "Which CPU specific optimitations should be used beside the compiler's default?")
option(USE_INTRINSICS "Compile using intrinsics (e.g mmx, sse, msse2)" ON)
if(UNIX)
set(OPENAL TRUE)
endif()
@ -61,7 +70,15 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
#add_definitions(-Wall)
add_definitions(-Werror=format-security)
add_definitions(-Werror=format)
add_definitions(-mmmx -msse -msse2)
if(CPU_TYPE)
add_definitions(-DCPUSTRING="${CPU_TYPE}")
endif()
if (CPU_OPTIMIZATION)
add_definitions(${CPU_OPTIMIZATION})
endif()
if (USE_INTRINSICS)
add_definitions(-DUSE_INTRINSICS)
endif()
if(WIN32)
# require msvcr70.dll or newer for _aligned_malloc etc
# I think it is from Visual C++ .NET 2002, so it should be available on any remotely modern system.
@ -179,6 +196,10 @@ elseif(MSVC)
if( WINRT ) # Windows RT
add_definitions(-DUSE_WINRT)
endif()
if (USE_INTRINSICS)
add_definitions(-DUSE_INTRINSICS)
endif()
if(NOT CMAKE_CL_64)
add_definitions(-D_USE_32BIT_TIME_T)
@ -1347,33 +1368,35 @@ if(MSVC)
list(REMOVE_DUPLICATES RBDOOM3_SOURCES)
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/framework/precompiled.cpp)
if(USE_PRECOMPILED_HEADERS)
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/framework/precompiled.cpp)
set_source_files_properties(
${RBDOOM3_PRECOMPILED_SOURCES}
PROPERTIES
COMPILE_FLAGS "/Yuprecompiled.h"
OBJECT_DEPENDS "precompiled.pch"
)
set_source_files_properties(framework/precompiled.cpp
PROPERTIES
COMPILE_FLAGS "/Ycprecompiled.h"
OBJECT_OUTPUTS "precompiled.pch"
)
set_source_files_properties(
${RBDOOM3_PRECOMPILED_SOURCES}
PROPERTIES
COMPILE_FLAGS "/Yuprecompiled.h"
OBJECT_DEPENDS "precompiled.pch"
)
set_source_files_properties(framework/precompiled.cpp
PROPERTIES
COMPILE_FLAGS "/Ycprecompiled.h"
OBJECT_OUTPUTS "precompiled.pch"
)
endif()
list(APPEND RBDOOM3_SOURCES ${WIN32_RESOURCES})
@ -1404,6 +1427,7 @@ if(MSVC)
${PNG_LIBRARY}
${JPEG_LIBRARY}
${GLEW_LIBRARY}
${CMAKE_DL_LIBS}
)
#CMAKE_BINARY_DIR
@ -1479,88 +1503,91 @@ else()
list(REMOVE_DUPLICATES RBDOOM3_SOURCES)
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp)
if(USE_PRECOMPILED_HEADERS)
set(RBDOOM3_PRECOMPILED_SOURCES ${RBDOOM3_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${TIMIDITY_SOURCES} ${JPEG_SOURCES} ${PNG_SOURCES} ${ZLIB_SOURCES} ${GLEW_SOURCES})
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libs/zlib/minizip/ioapi.c)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTDecoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/DXT/DXTEncoder_SSE2.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/dynamicshadowvolume/DynamicShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/prelightshadowvolume/PreLightShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/staticshadowvolume/StaticShadowVolume.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/jobs/ShadowShared.cpp)
list(REMOVE_ITEM RBDOOM3_PRECOMPILED_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/RenderLog.cpp)
foreach( src_file ${RBDOOM3_PRECOMPILED_SOURCES} )
#message(STATUS "-include precompiled.h for ${src_file}")
set_source_files_properties(
${src_file}
PROPERTIES
COMPILE_FLAGS "-include ${CMAKE_CURRENT_SOURCE_DIR}/idlib/precompiled.h"
)
endforeach()
# precompiled magic for GCC/clang, adapted from https://gist.github.com/573926
STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
SET(_compiler_FLAGS ${${_flags_var_name}})
GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
FOREACH(item ${_directory_flags})
LIST(APPEND _compiler_FLAGS " -I${item}")
ENDFOREACH(item)
foreach( src_file ${RBDOOM3_PRECOMPILED_SOURCES} )
#message(STATUS "-include precompiled.h for ${src_file}")
set_source_files_properties(
${src_file}
PROPERTIES
COMPILE_FLAGS "-include ${CMAKE_CURRENT_SOURCE_DIR}/idlib/precompiled.h"
)
endforeach()
# precompiled magic for GCC/clang, adapted from https://gist.github.com/573926
STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
SET(_compiler_FLAGS ${${_flags_var_name}})
GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
FOREACH(item ${_directory_flags})
LIST(APPEND _compiler_FLAGS " -I${item}")
ENDFOREACH(item)
endif()
GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS)
LIST(APPEND _compiler_FLAGS ${_directory_flags})
SEPARATE_ARGUMENTS(_compiler_FLAGS)
# we need to recreate the precompiled header for RBDoom3BFG
# (i.e. can't use the one created for idlib before)
# because some definitions (e.g. -D__IDLIB__ -D__DOOM_DLL__) differ
add_custom_target(precomp_header_rbdoom3bfg ALL
COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header idlib/precompiled.h -o idlib/precompiled.h.gch
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Creating idlib/precompiled.h.gch for RBDoom3BFG"
)
if(USE_PRECOMPILED_HEADERS)
# we need to recreate the precompiled header for RBDoom3BFG
# (i.e. can't use the one created for idlib before)
# because some definitions (e.g. -D__IDLIB__ -D__DOOM_DLL__) differ
add_custom_target(precomp_header_rbdoom3bfg ALL
COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header idlib/precompiled.h -o idlib/precompiled.h.gch
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Creating idlib/precompiled.h.gch for RBDoom3BFG"
)
endif()
if(WIN32)
set(remove_command "del")
else()
set(remove_command "rm")
endif()
# it's ugly enough that the precompiled header binary needs to be in the
# source directory (instead of the build directory), so let's at least
# delete it after build.
add_custom_target(rm_precomp_header ALL
COMMAND ${remove_command} "idlib/precompiled.h.gch"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "remove idlib/precompiled.h.gch"
)
# make sure this is run after creating idlib
add_dependencies(precomp_header_rbdoom3bfg idlib)
if (USE_PRECOMPILED_HEADERS)
# it's ugly enough that the precompiled header binary needs to be in the
# source directory (instead of the build directory), so let's at least
# delete it after build.
add_custom_target(rm_precomp_header ALL
COMMAND ${remove_command} "idlib/precompiled.h.gch"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "remove idlib/precompiled.h.gch"
)
# make sure this is run after creating idlib
add_dependencies(precomp_header_rbdoom3bfg idlib)
endif()
add_executable(RBDoom3BFG WIN32 ${RBDOOM3_SOURCES})
# make sure precompiled header is created before executable is compiled
add_dependencies(RBDoom3BFG precomp_header_rbdoom3bfg)
# make sure precompiled header is deleted after executable is compiled
add_dependencies(rm_precomp_header RBDoom3BFG)
if (USE_PRECOMPILED_HEADERS)
# make sure precompiled header is created before executable is compiled
add_dependencies(RBDoom3BFG precomp_header_rbdoom3bfg)
# make sure precompiled header is deleted after executable is compiled
add_dependencies(rm_precomp_header RBDoom3BFG)
endif()
if(NOT WIN32)
if(NOT "${CMAKE_SYSTEM}" MATCHES "Darwin")
set(RT_LIBRARY rt)
endif()
if(NOT "${CMAKE_SYSTEM}" MATCHES "FreeBSD")
set(DL_LIBRARY dl)
endif()
target_link_libraries(RBDoom3BFG
idlib
${OPENGL_LIBRARIES}
pthread
${DL_LIBRARY}
${RT_LIBRARY}
${SDLx_LIBRARY}
${OPENAL_LIBRARY}
@ -1569,6 +1596,7 @@ else()
${PNG_LIBRARY}
${JPEG_LIBRARY}
${GLEW_LIBRARY}
${CMAKE_DL_LIBS}
)
endif()

View file

@ -642,13 +642,21 @@ bool idCollisionModelManagerLocal::LoadCollisionModelFile( const char* name, uns
file->ReadString( fileVersion );
if( fileID == CM_FILEID && fileVersion == CM_FILEVERSION && crc == mapFileCRC && numEntries > 0 )
{
loaded = true; // DG: moved this up here to prevent segfaults, see below
for( int i = 0; i < numEntries; i++ )
{
cm_model_t* model = LoadBinaryModelFromFile( file, currentTimeStamp );
// DG: handle the case that loading the binary model fails gracefully
// (otherwise we'll get a segfault when someone wants to use models[numModels])
if( model == NULL )
{
loaded = false;
break;
}
// DG end
models[ numModels ] = model;
numModels++;
}
loaded = true;
}
}

View file

@ -101,6 +101,7 @@ if(MSVC)
add_library(idlib ${ID_SOURCES_ALL} ${ID_INCLUDES_ALL})
else()
if (USE_PRECOMPILED_HEADERS)
foreach( src_file ${ID_PRECOMPILED_SOURCES} )
#message(STATUS "-include precompiled.h for ${src_file}")
set_source_files_properties(
@ -109,9 +110,11 @@ else()
COMPILE_FLAGS "-include ${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h"
)
endforeach()
endif()
include_directories(.)
if (USE_PRECOMPILED_HEADERS)
# precompiled magic for GCC/clang, adapted from https://gist.github.com/573926
STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
SET(_compiler_FLAGS ${${_flags_var_name}})
@ -119,20 +122,25 @@ else()
FOREACH(item ${_directory_flags})
LIST(APPEND _compiler_FLAGS " -I${item}")
ENDFOREACH(item)
endif()
GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS)
LIST(APPEND _compiler_FLAGS ${_directory_flags})
SEPARATE_ARGUMENTS(_compiler_FLAGS)
if (USE_PRECOMPILED_HEADERS)
add_custom_target(precomp_header_idlib ALL
COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header precompiled.h -o precompiled.h.gch
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Creating idlib/precompiled.h.gch for idlib"
)
endif()
add_library(idlib ${ID_SOURCES_ALL} ${ID_INCLUDES_ALL})
if (USE_PRECOMPILED_HEADERS)
add_dependencies(idlib precomp_header_idlib)
endif()
endif()

View file

@ -102,12 +102,16 @@ If you have questions concerning this license or the applicable additional terms
#endif
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) || defined(__GNUC__) || defined(__clang__)
#ifndef CPUSTRING
#if defined(__i386__)
#define CPUSTRING "x86"
#elif defined(__x86_64__)
#define CPUSTRING "x86_86"
#else
#error unknown CPU
#endif
#endif
#if defined(__FreeBSD__)
@ -116,6 +120,8 @@ If you have questions concerning this license or the applicable additional terms
#define BUILD_STRING "linux-" CPUSTRING
#elif defined(__APPLE__)
#define BUILD_STRING "osx-" CPUSTRING
#else
#define BUILD_STRING "other-" CPUSTRING
#endif
#define _alloca alloca
@ -146,6 +152,8 @@ If you have questions concerning this license or the applicable additional terms
#define CALLBACK
#define __cdecl
#else
#error unknown build enviorment
#endif
// RB end

View file

@ -29,8 +29,6 @@ If you have questions concerning this license or the applicable additional terms
#ifndef __SYS_INTRIINSICS_H__
#define __SYS_INTRIINSICS_H__
#define USE_INTRINSICS
#if defined(USE_INTRINSICS)
#include <emmintrin.h>
#endif

View file

@ -40,6 +40,123 @@ idCVar s_device( "s_device", "-1", CVAR_INTEGER | CVAR_ARCHIVE, "Which audio dev
idCVar s_showPerfData( "s_showPerfData", "0", CVAR_BOOL, "Show XAudio2 Performance data" );
extern idCVar s_volume_dB;
#if defined(USE_WINRT)
HRESULT GetAudioDeviceDetails( _In_ IMMDevice* immDevice, _Out_ AudioDevice* pInfo )
{
IPropertyStore* propStore = nullptr;
PROPVARIANT varName;
PROPVARIANT varId;
PropVariantInit( &varId );
PropVariantInit( &varName );
HRESULT hResult = immDevice->OpenPropertyStore( STGM_READ, &propStore );
if( SUCCEEDED( hResult ) )
{
hResult = propStore->GetValue( PKEY_AudioEndpoint_Path, &varId );
}
if( SUCCEEDED( hResult ) )
{
hResult = propStore->GetValue( PKEY_Device_FriendlyName, &varName );
}
if( SUCCEEDED( hResult ) )
{
assert( varId.vt == VT_LPWSTR );
assert( varName.vt == VT_LPWSTR );
// Now save somewhere the device display name & id
pInfo->name = varName.pwszVal;
pInfo->id = varId.pwszVal;
}
PropVariantClear( &varName );
PropVariantClear( &varId );
if( propStore != nullptr )
{
propStore->Release();
}
return hResult;
}
std::vector<AudioDevice> EnumerateAudioDevices( _Out_opt_ AudioDevice* defaultDevice = nullptr )
{
UINT32 deviceCount = 0;
IMMDeviceEnumerator* immDevEnum = nullptr;
IMMDeviceCollection* immDevCollection = nullptr;
IMMDevice* immDev = nullptr;
std::vector<AudioDevice> vAudioDevices;
HRESULT hResult = CoCreateInstance(
__uuidof( MMDeviceEnumerator ), NULL,
CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), ( void** ) &immDevEnum );
if( FAILED( hResult ) )
{
idLib::Warning( "Failed to get audio enumerator" );
return std::move( vAudioDevices );
}
if( defaultDevice != nullptr )
{
ZeroMemory( defaultDevice, sizeof( AudioDevice ) );
IMMDevice* defaultImmDev = nullptr;
// @pjb: get the default audio endpoint and make it the first one in the list
if( SUCCEEDED( immDevEnum->GetDefaultAudioEndpoint( eRender, eConsole, &defaultImmDev ) ) )
{
GetAudioDeviceDetails( defaultImmDev, defaultDevice );
defaultImmDev->Release();
}
}
hResult = immDevEnum->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &immDevCollection );
if( FAILED( hResult ) )
{
idLib::Warning( "Failed to get audio endpoints" );
return std::move( vAudioDevices );
}
hResult = immDevCollection->GetCount( &deviceCount );
if( FAILED( hResult ) )
{
idLib::Warning( "No audio devices found" );
return std::move( vAudioDevices );
}
for( UINT i = 0; i < deviceCount; i++ )
{
AudioDevice ad;
hResult = immDevCollection->Item( i, &immDev );
if( SUCCEEDED( hResult ) )
{
hResult = GetAudioDeviceDetails( immDev, &ad );
}
if( SUCCEEDED( hResult ) )
{
vAudioDevices.push_back( ad );
}
if( immDev != nullptr )
{
immDev->Release();
}
}
immDevCollection->Release();
immDevEnum->Release();
return std::move( vAudioDevices );
}
#endif
/*
========================
idSoundHardware_XAudio2::idSoundHardware_XAudio2
@ -77,11 +194,18 @@ void listDevices_f( const idCmdArgs& args )
// RB: not available on Windows 8 SDK
#if defined(USE_WINRT) //(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
// FIXME
AudioDevice defaultDevice;
auto vAudioDevices = EnumerateAudioDevices( &defaultDevice );
if( vAudioDevices.size() == 0 )
{
idLib::Warning( "No audio devices found" );
return;
}
idLib::Warning( "No audio devices found" );
return;
for( size_t i = 0; i < vAudioDevices.size(); ++i )
{
idLib::Printf( "%s %3d: %S %S\n", vAudioDevices[i].id == defaultDevice.id ? "*" : " ", i, vAudioDevices[i].name.c_str(), vAudioDevices[i].id.c_str() );
}
#else
UINT32 deviceCount = 0;
if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 )
@ -258,110 +382,45 @@ void idSoundHardware_XAudio2::Init()
// Register the sound engine callback
pXAudio2->RegisterForCallbacks( &soundEngineCallback );
soundEngineCallback.hardware = this;
UINT32 deviceCount = 0;
DWORD outputSampleRate = 44100; // Max( (DWORD)XAUDIO2FX_REVERB_MIN_FRAMERATE, Min( (DWORD)XAUDIO2FX_REVERB_MAX_FRAMERATE, deviceDetails.OutputFormat.Format.nSamplesPerSec ) );
idCmdArgs args;
listDevices_f( args );
// RB: not available on Windows 8 SDK
#if defined(USE_WINRT) //(_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
AudioDevice defaultDevice;
std::vector<AudioDevice> vAudioDevices = EnumerateAudioDevices( &defaultDevice );
IMMDeviceEnumerator* immDevEnum = nullptr;
IMMDeviceCollection* immDevCollection = nullptr;
IMMDevice* immDev = nullptr;
std::vector<AudioDevice> vAudioDevices;
HRESULT hResult = CoCreateInstance(
__uuidof( MMDeviceEnumerator ), NULL,
CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), ( void** ) &immDevEnum );
if( FAILED( hResult ) )
{
idLib::Warning( "Failed to get audio enumerator" );
pXAudio2->Release();
pXAudio2 = NULL;
return;
}
hResult = immDevEnum->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &immDevCollection );
if( FAILED( hResult ) )
{
idLib::Warning( "Failed to get audio endpoints" );
pXAudio2->Release();
pXAudio2 = NULL;
return;
}
hResult = immDevCollection->GetCount( &deviceCount );
if( FAILED( hResult ) )
{
idLib::Warning( "No audio devices found" );
pXAudio2->Release();
pXAudio2 = NULL;
return;
}
for( UINT i = 0; i < deviceCount; i++ )
{
IPropertyStore* propStore = nullptr;
PROPVARIANT varName;
PROPVARIANT varId;
PropVariantInit( &varId );
PropVariantInit( &varName );
hResult = immDevCollection->Item( i, &immDev );
if( SUCCEEDED( hResult ) )
{
hResult = immDev->OpenPropertyStore( STGM_READ, &propStore );
}
if( SUCCEEDED( hResult ) )
{
hResult = propStore->GetValue( PKEY_AudioEndpoint_Path, &varId );
}
if( SUCCEEDED( hResult ) )
{
hResult = propStore->GetValue( PKEY_Device_FriendlyName, &varName );
}
if( SUCCEEDED( hResult ) )
{
assert( varId.vt == VT_LPWSTR );
assert( varName.vt == VT_LPWSTR );
// Now save somewhere the device display name & id
AudioDevice ad;
ad.name = varName.pwszVal;
ad.id = varId.pwszVal;
vAudioDevices.push_back( ad );
}
PropVariantClear( &varName );
PropVariantClear( &varId );
if( propStore != nullptr )
{
propStore->Release();
}
if( immDev != nullptr )
{
immDev->Release();
}
}
immDevCollection->Release();
immDevEnum->Release();
int preferredDevice = s_device.GetInteger();
if( !vAudioDevices.empty() )
{
AudioDevice selectedDevice;
int preferredDevice = s_device.GetInteger();
bool validPreference = ( preferredDevice >= 0 && preferredDevice < ( int )vAudioDevices.size() );
// Do we select a device automatically?
if( validPreference )
{
// Use the user's selected device
selectedDevice = vAudioDevices[preferredDevice];
}
else if( !defaultDevice.id.empty() )
{
// Fall back to the default device if there is one
selectedDevice = defaultDevice;
}
else
{
// Fall back to first device
selectedDevice = vAudioDevices[0];
}
if( SUCCEEDED( pXAudio2->CreateMasteringVoice( &pMasterVoice,
XAUDIO2_DEFAULT_CHANNELS,
outputSampleRate,
0,
vAudioDevices.at( 0 ).id.c_str(),
selectedDevice.id.c_str(),
NULL,
AudioCategory_GameEffects ) ) )
{
@ -375,7 +434,7 @@ void idSoundHardware_XAudio2::Init()
pMasterVoice->GetChannelMask( &win8_channelMask );
channelMask = ( unsigned int )win8_channelMask;
idLib::Printf( "Using device %s\n", vAudioDevices.at( 0 ).name );
idLib::Printf( "Using device %S\n", selectedDevice.name );
}
else
{
@ -387,6 +446,7 @@ void idSoundHardware_XAudio2::Init()
}
#else
UINT32 deviceCount = 0;
if( pXAudio2->GetDeviceCount( &deviceCount ) != S_OK || deviceCount == 0 )
{
idLib::Warning( "No audio devices found" );
@ -395,9 +455,6 @@ void idSoundHardware_XAudio2::Init()
return;
}
idCmdArgs args;
listDevices_f( args );
int preferredDevice = s_device.GetInteger();
if( preferredDevice < 0 || preferredDevice >= ( int )deviceCount )
{

View file

@ -835,18 +835,6 @@ void Sys_Sleep( int msec )
#endif
}
char* Sys_GetClipboardData()
{
Sys_Printf( "TODO: Sys_GetClipboardData\n" );
return NULL;
}
void Sys_SetClipboardData( const char* string )
{
Sys_Printf( "TODO: Sys_SetClipboardData\n" );
}
// stub pretty much everywhere - heavy calling
void Sys_FlushCacheMemory( void* base, int bytes )
{

View file

@ -1731,6 +1731,36 @@ const char* Sys_GetKeyName( keyNum_t keynum )
return NULL;
}
char* Sys_GetClipboardData()
{
#if SDL_VERSION_ATLEAST(2, 0, 0)
char* txt = SDL_GetClipboardText();
if( txt == NULL )
{
return NULL;
}
else if( txt[0] == '\0' )
{
SDL_free( txt );
return NULL;
}
char* ret = Mem_CopyString( txt );
SDL_free( txt );
return ret;
#else
return NULL; // SDL1.2 doesn't support clipboard
#endif
}
void Sys_SetClipboardData( const char* string )
{
#if SDL_VERSION_ATLEAST(2, 0, 0)
SDL_SetClipboardText( string );
#endif
}
//=====================================================================================
// Joystick Input Handling