From b35c63f37a51d6c673f0ee151620213ddab2b537 Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Fri, 8 May 2009 09:13:06 +0000 Subject: [PATCH] don't modify s_alDevice and add fallback to let openAL choose the device --- code/client/snd_openal.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index 8a6615a8..5087b726 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -1715,7 +1715,6 @@ static cvar_t *s_alCapture; #ifdef _WIN32 #define ALDRIVER_DEFAULT "OpenAL32.dll" -#define ALDEVICE_DEFAULT "Generic Software" #elif defined(MACOS_X) #define ALDRIVER_DEFAULT "/System/Library/Frameworks/OpenAL.framework/OpenAL" #else @@ -1965,8 +1964,7 @@ S_AL_Init qboolean S_AL_Init( soundInterface_t *si ) { #ifdef USE_OPENAL - - qboolean enumsupport, founddev = qfalse; + const char* device = NULL; int i; if( !si ) { @@ -1992,6 +1990,8 @@ qboolean S_AL_Init( soundInterface_t *si ) s_alDriver = Cvar_Get( "s_alDriver", ALDRIVER_DEFAULT, CVAR_ARCHIVE | CVAR_LATCH ); + s_alDevice = Cvar_Get("s_alDevice", "", CVAR_ARCHIVE | CVAR_LATCH); + // Load QAL if( !QAL_Init( s_alDriver->string ) ) { @@ -1999,8 +1999,12 @@ qboolean S_AL_Init( soundInterface_t *si ) return qfalse; } + device = s_alDevice->string; + if(device && !*device) + device = NULL; + // Device enumeration support (extension is implemented reasonably only on Windows right now). - if((enumsupport = qalcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT"))) + if(qalcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) { char devicenames[1024] = ""; const char *devicelist; @@ -2016,11 +2020,9 @@ qboolean S_AL_Init( soundInterface_t *si ) // Generic Software as that one works more reliably with various sound systems. // If it's not, use OpenAL's default selection as we don't want to ignore // native hardware acceleration. - if(!strcmp(defaultdevice, "Generic Hardware")) - s_alDevice = Cvar_Get("s_alDevice", ALDEVICE_DEFAULT, CVAR_ARCHIVE | CVAR_LATCH); - else + if(!device && !strcmp(defaultdevice, "Generic Hardware")) + device = "Generic Software"; #endif - s_alDevice = Cvar_Get("s_alDevice", defaultdevice, CVAR_ARCHIVE | CVAR_LATCH); // dump a list of available devices to a cvar for the user to see. while((curlen = strlen(devicelist))) @@ -2028,26 +2030,18 @@ qboolean S_AL_Init( soundInterface_t *si ) Q_strcat(devicenames, sizeof(devicenames), devicelist); Q_strcat(devicenames, sizeof(devicenames), "\n"); - // check whether the device we want to load is available at all. - if(!strcmp(s_alDevice->string, devicelist)) - founddev = qtrue; - devicelist += curlen + 1; } s_alAvailableDevices = Cvar_Get("s_alAvailableDevices", devicenames, CVAR_ROM | CVAR_NORESTART); - - if(!founddev) - { - Cvar_ForceReset("s_alDevice"); - founddev = 1; - } } - if(founddev) - alDevice = qalcOpenDevice(s_alDevice->string); - else + alDevice = qalcOpenDevice(device); + if( !alDevice && device ) + { + Com_Printf( "Failed to open OpenAL device '%s', trying default.\n", device ); alDevice = qalcOpenDevice(NULL); + } if( !alDevice ) { @@ -2056,9 +2050,6 @@ qboolean S_AL_Init( soundInterface_t *si ) return qfalse; } - if(enumsupport) - Cvar_Set("s_alDevice", qalcGetString(alDevice, ALC_DEVICE_SPECIFIER)); - // Create OpenAL context alContext = qalcCreateContext( alDevice, NULL ); if( !alContext )