diff --git a/Engine/source/sfx/openal/LoadOAL.h b/Engine/source/sfx/openal/LoadOAL.h index 9b2792657..01455797a 100644 --- a/Engine/source/sfx/openal/LoadOAL.h +++ b/Engine/source/sfx/openal/LoadOAL.h @@ -165,6 +165,13 @@ typedef void (ALAPIENTRY *LPALGETAUXILIARYEFFECTSLOTIV)(ALuint effectslot, A typedef void (ALAPIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint effectslot, ALenum param, ALfloat *value); typedef void (ALAPIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint effectslot, ALenum param, ALfloat *values); typedef void (ALAPIENTRY *LPALSOURCE3I)(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3); +// Changes for Filters. +typedef void (ALAPIENTRY* LPALGENFILTERS)(ALsizei n, ALuint* filter); +typedef void (ALAPIENTRY* LPALDELETEFILTERS)(ALsizei n, const ALuint* filters); +typedef void (ALAPIENTRY* LPALFILTERI)(ALuint filter , ALenum param, ALint value); +// Changes for HRTF +typedef const ALCchar* (ALCAPIENTRY* LPALCGETSTRINGISOFT)(ALCdevice* device, ALCenum param, ALint value1); + typedef struct { @@ -261,6 +268,12 @@ typedef struct LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf; LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv; #endif + LPALGENFILTERS alGenFilters; + LPALDELETEFILTERS alDeleteFilters; + LPALFILTERI alFilteri; + + LPALCGETSTRINGISOFT alcGetStringiSOFT; + } OPENALFNTABLE, *LPOPENALFNTABLE; #endif diff --git a/Engine/source/sfx/openal/aldlist.cpp b/Engine/source/sfx/openal/aldlist.cpp index 27d0f043a..3dafd01d9 100644 --- a/Engine/source/sfx/openal/aldlist.cpp +++ b/Engine/source/sfx/openal/aldlist.cpp @@ -1,17 +1,17 @@ /* * Copyright (c) 2006, Creative Labs Inc. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are permitted provided * that the following conditions are met: - * + * * * Redistributions of source code must retain the above copyright notice, this list of conditions and * the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions * and the following disclaimer in the documentation and/or other materials provided with the distribution. * * Neither the name of Creative Labs Inc. nor the names of its contributors may be used to endorse or * promote products derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR @@ -33,20 +33,19 @@ #include #endif -/* +/* * Init call */ -ALDeviceList::ALDeviceList(const OPENALFNTABLE& oalft) +ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft ) { - VECTOR_SET_ASSOCIATION(vDeviceInfo); + VECTOR_SET_ASSOCIATION( vDeviceInfo ); - ALDEVICEINFO ALDeviceInfo; - char* devices; - int index; - const char* defaultDeviceName; - const char* actualDeviceName; + ALDEVICEINFO ALDeviceInfo; + char *devices; + int index; + const char *defaultDeviceName; - dMemcpy(&ALFunction, &oalft, sizeof(OPENALFNTABLE)); + dMemcpy( &ALFunction, &oalft, sizeof( OPENALFNTABLE ) ); // DeviceInfo vector stores, for each enumerated device, it's device name, selection status, spec version #, and extension support vDeviceInfo.clear(); @@ -54,176 +53,41 @@ ALDeviceList::ALDeviceList(const OPENALFNTABLE& oalft) defaultDeviceIndex = 0; - if (ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) + // grab function pointers for 1.0-API functions, and if successful proceed to enumerate all devices + if (ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) { + devices = (char *)ALFunction.alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); + defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); + } + else { - devices = (char*)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER); - defaultDeviceName = (char*)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); - index = 0; - while (*devices != NULL) - { - if (dStrcmp(defaultDeviceName, devices) == 0) - { - defaultDeviceIndex = index; - } - ALCdevice* device = ALFunction.alcOpenDevice(devices); - - if (device) - { - ALCcontext* context = ALFunction.alcCreateContext(device, NULL); - if (context) - { - ALFunction.alcMakeContextCurrent(context); - - actualDeviceName = ALFunction.alcGetString(device, ALC_DEVICE_SPECIFIER); - bool bNewName = true; - for (int i = 0; i < GetNumDevices(); i++) { - if (dStrcmp(GetDeviceName(i), actualDeviceName) == 0) { - bNewName = false; - } - } - - if ((bNewName) && (actualDeviceName != NULL) && (dStrlen(actualDeviceName) > 0)) - { - dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO)); - ALDeviceInfo.bSelected = true; - dStrncpy(ALDeviceInfo.strDeviceName, actualDeviceName, sizeof(ALDeviceInfo.strDeviceName)); - - ALFunction.alcGetIntegerv(device, ALC_MAJOR_VERSION, sizeof(int), &ALDeviceInfo.iMajorVersion); - ALFunction.alcGetIntegerv(device, ALC_MINOR_VERSION, sizeof(int), &ALDeviceInfo.iMinorVersion); - - ALDeviceInfo.iCapsFlags = 0; - - if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_CAPTURE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALCapture; - - if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_EFX") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEFX; - - if (ALFunction.alIsExtensionPresent("AL_EXT_OFFSET") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALOffset; - - if (ALFunction.alIsExtensionPresent("AL_EXT_LINEAR_DISTANCE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALLinearDistance; - - if (ALFunction.alIsExtensionPresent("AL_EXT_EXPONENT_DISTANCE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALExponentDistance; - - if (ALFunction.alIsExtensionPresent("EAX2.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX2; - - if (ALFunction.alIsExtensionPresent("EAX3.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX3; - - if (ALFunction.alIsExtensionPresent("EAX4.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX4; - - if (ALFunction.alIsExtensionPresent("EAX5.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX5; - - if (ALFunction.alIsExtensionPresent("EAX-RAM") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAXRAM; - - // Get Source Count - ALDeviceInfo.uiSourceCount = GetMaxNumSources(); - - vDeviceInfo.push_back(ALDeviceInfo); - - } - ALFunction.alcMakeContextCurrent(NULL); - ALFunction.alcDestroyContext(context); - } - ALFunction.alcCloseDevice(device); - } - devices += dStrlen(devices) + 1; - index += 1; - } + devices = (char *)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER); + defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); } index = 0; - - if (ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) - { - devices = (char*)ALFunction.alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); - defaultDeviceName = (char*)ALFunction.alcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER); - index = 0; - while (*devices != NULL) - { - if (dStrcmp(defaultDeviceName, devices) == 0) - { - defaultDeviceIndex = index; - } - ALCdevice* device = ALFunction.alcOpenDevice(devices); - - if (device) - { - ALCcontext* context = ALFunction.alcCreateContext(device, NULL); - if (context) - { - ALFunction.alcMakeContextCurrent(context); - - actualDeviceName = ALFunction.alcGetString(device, ALC_ALL_DEVICES_SPECIFIER); - bool bNewName = true; - for (int i = 0; i < GetNumDevices(); i++) { - if (dStrcmp(GetDeviceName(i), actualDeviceName) == 0) { - bNewName = false; - } - } - - if ((bNewName) && (actualDeviceName != NULL) && (dStrlen(actualDeviceName) > 0)) - { - dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO)); - ALDeviceInfo.bSelected = true; - dStrncpy(ALDeviceInfo.strDeviceName, actualDeviceName, sizeof(ALDeviceInfo.strDeviceName)); - - ALFunction.alcGetIntegerv(device, ALC_MAJOR_VERSION, sizeof(int), &ALDeviceInfo.iMajorVersion); - ALFunction.alcGetIntegerv(device, ALC_MINOR_VERSION, sizeof(int), &ALDeviceInfo.iMinorVersion); - - ALDeviceInfo.iCapsFlags = 0; - - if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_CAPTURE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALCapture; - - if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_EFX") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEFX; - - if (ALFunction.alIsExtensionPresent("AL_EXT_OFFSET") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALOffset; - - if (ALFunction.alIsExtensionPresent("AL_EXT_LINEAR_DISTANCE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALLinearDistance; - - if (ALFunction.alIsExtensionPresent("AL_EXT_EXPONENT_DISTANCE") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALExponentDistance; - - if (ALFunction.alIsExtensionPresent("EAX2.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX2; - - if (ALFunction.alIsExtensionPresent("EAX3.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX3; - - if (ALFunction.alIsExtensionPresent("EAX4.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX4; - - if (ALFunction.alIsExtensionPresent("EAX5.0") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAX5; - - if (ALFunction.alIsExtensionPresent("EAX-RAM") == AL_TRUE) - ALDeviceInfo.iCapsFlags |= SFXALEAXRAM; - - // Get Source Count - ALDeviceInfo.uiSourceCount = GetMaxNumSources(); - - vDeviceInfo.push_back(ALDeviceInfo); - - } - ALFunction.alcMakeContextCurrent(NULL); - ALFunction.alcDestroyContext(context); - } - ALFunction.alcCloseDevice(device); - } - devices += dStrlen(devices) + 1; - index += 1; + // go through device list (each device terminated with a single NULL, list terminated with double NULL) + while (*devices != 0) { + if (String::compare(defaultDeviceName, devices) == 0) { + defaultDeviceIndex = index; } + + bool bNewName = true; + for (int i = 0; i < GetNumDevices(); i++) { + if (String::compare(GetDeviceName(i), devices) == 0) { + bNewName = false; + } + } + + if ((bNewName) && (devices != NULL) && (dStrlen(devices) > 0)) + { + dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO)); + ALDeviceInfo.bSelected = true; + dStrncpy(ALDeviceInfo.strDeviceName, devices, sizeof(ALDeviceInfo.strDeviceName)); + vDeviceInfo.push_back(ALDeviceInfo); + } + + devices += dStrlen(devices) + 1; + index += 1; } ResetFilters(); diff --git a/Engine/source/sfx/openal/aldlist.h b/Engine/source/sfx/openal/aldlist.h index 929cb3bf0..fe52f68cd 100644 --- a/Engine/source/sfx/openal/aldlist.h +++ b/Engine/source/sfx/openal/aldlist.h @@ -31,12 +31,12 @@ typedef struct { - char strDeviceName[256]; - S32 iMajorVersion; - S32 iMinorVersion; - U32 uiSourceCount; - S32 iCapsFlags; - bool bSelected; + char strDeviceName[256]; + S32 iMajorVersion; + S32 iMinorVersion; + U32 uiSourceCount; + S32 iCapsFlags; + bool bSelected; } ALDEVICEINFO, *LPALDEVICEINFO; class ALDeviceList diff --git a/Engine/source/sfx/openal/sfxALDevice.cpp b/Engine/source/sfx/openal/sfxALDevice.cpp index 9dd308c58..111c92362 100644 --- a/Engine/source/sfx/openal/sfxALDevice.cpp +++ b/Engine/source/sfx/openal/sfxALDevice.cpp @@ -24,6 +24,201 @@ #include "sfx/openal/sfxALBuffer.h" #include "platform/async/asyncUpdate.h" +//---------------------------------------------------------------------------- +// STATIC OPENAL FUNCTIONS +//---------------------------------------------------------------------------- +void SFXALDevice::printALInfo(ALCdevice* device) +{ + ALCint major, minor; + if (device) + { + const ALCchar* devname = NULL; + Con::printBlankLine(); + + if (mOpenAL.alcIsExtensionPresent(device, "ALC_ENUMERATE_ALL_EXT") != AL_FALSE) + { + devname = mOpenAL.alcGetString(device, ALC_ALL_DEVICES_SPECIFIER); + } + else + { + devname = mOpenAL.alcGetString(device, ALC_DEVICE_SPECIFIER); + } + + Con::printf("| Device info for: %s ", devname); + } + + mOpenAL.alcGetIntegerv(device, ALC_MAJOR_VERSION, 1, &major); + mOpenAL.alcGetIntegerv(device, ALC_MINOR_VERSION, 1, &minor); + Con::printf("| OpenAL Version: %d.%d", major, minor); + + if (device) + { + Con::printf("%s", mOpenAL.alcGetString(device, ALC_EXTENSIONS)); + + U32 err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Retrieving ALC Extensions: %s", mOpenAL.alcGetString(device, err)); + } + +} + +void SFXALDevice::printHRTFInfo(ALCdevice* device) +{ + if (mOpenAL.alcIsExtensionPresent(device, "ALC_SOFT_HRTF") == AL_FALSE) + { + Con::printf("HRTF Extensions not compatible"); + return; + } + + ALCint numHrtfs; + + mOpenAL.alcGetIntegerv(device, ALC_NUM_HRTF_SPECIFIERS_SOFT, 1, &numHrtfs); + if (!numHrtfs) + Con::printf("No HRTFs Found"); + else + { + Con::printf("Available HRTFs"); + for (U32 i = 0; i < numHrtfs; ++i) + { + const ALCchar* name = mOpenAL.alcGetStringiSOFT(device, ALC_HRTF_SPECIFIER_SOFT, i); + printf(" %s", name); + } + } + + U32 err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Retrieving HRTF info: %s", mOpenAL.alcGetString(device, err)); + +} + +void SFXALDevice::getEFXInfo(ALCdevice *device) +{ + static const ALint filters[] = { + AL_FILTER_LOWPASS, AL_FILTER_HIGHPASS, AL_FILTER_BANDPASS, + AL_FILTER_NULL + }; + + char filterNames[] = "Low-pass,High-pass,Band-pass,"; + static const ALint effects[] = { + AL_EFFECT_EAXREVERB, AL_EFFECT_REVERB, AL_EFFECT_CHORUS, + AL_EFFECT_DISTORTION, AL_EFFECT_ECHO, AL_EFFECT_FLANGER, + AL_EFFECT_FREQUENCY_SHIFTER, AL_EFFECT_VOCAL_MORPHER, + AL_EFFECT_PITCH_SHIFTER, AL_EFFECT_RING_MODULATOR, + AL_EFFECT_AUTOWAH, AL_EFFECT_COMPRESSOR, AL_EFFECT_EQUALIZER, + AL_EFFECT_NULL + }; + static const ALint dedeffects[] = { + AL_EFFECT_DEDICATED_DIALOGUE, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, + AL_EFFECT_NULL + }; + char effectNames[] = "EAX Reverb,Reverb,Chorus,Distortion,Echo,Flanger," + "Frequency Shifter,Vocal Morpher,Pitch Shifter,Ring Modulator,Autowah," + "Compressor,Equalizer,Dedicated Dialog,Dedicated LFE,"; + + ALCint major, minor, sends; + ALuint obj; + + char* current; + U32 i; + + if (mOpenAL.alcIsExtensionPresent(device, "ALC_EXT_EFX") == AL_FALSE) + { + Con::printf("SFXALDevice - EFX Not available."); + return; + } + + mOpenAL.alcGetIntegerv(device, ALC_EFX_MAJOR_VERSION, 1, &major); + mOpenAL.alcGetIntegerv(device, ALC_EFX_MINOR_VERSION, 1, &minor); + U32 err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Retrieving EFX Version: %s", mOpenAL.alcGetString(device, err)); + else + { + Con::printf("| EFX Version: %d.%d", major, minor); + } + + mOpenAL.alcGetIntegerv(device, ALC_MAX_AUXILIARY_SENDS, 1, &sends); + err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Retrieving Auxiliary Sends: %s", mOpenAL.alcGetString(device, err)); + else + { + Con::printf("| Max Aux Sends: %d", sends); + } + + mOpenAL.alGenFilters(1, &obj); + err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Generating filter: %s", mOpenAL.alcGetString(device, err)); + + current = filterNames; + for (i = 0; filters[i] != AL_FILTER_NULL; i++) + { + char* next = dStrchr(current, ','); + + mOpenAL.alFilteri(obj, AL_FILTER_TYPE, filters[i]); + if (mOpenAL.alGetError() != AL_NO_ERROR) + dMemmove(current, next + 1, strlen(next)); + else + current = next + 1; + } + + Con::printf("| Supported Filters: %s", filterNames); + + mOpenAL.alDeleteFilters(1, &obj); + + mOpenAL.alGenEffects(1, &obj); + err = mOpenAL.alcGetError(device); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Error Generating effects: %s", mOpenAL.alcGetString(device, err)); + + current = effectNames; + for (i = 0; effects[i] != AL_EFFECT_NULL; i++) + { + char* next = dStrchr(current, ','); + mOpenAL.alEffecti(obj, AL_FILTER_TYPE, effects[i]); + if (mOpenAL.alGetError() != AL_NO_ERROR) + dMemmove(current, next + 1, strlen(next)); + else + current = next + 1; + } + + if (mOpenAL.alcIsExtensionPresent(device, "ALC_EXT_DEDICATED")) + { + for (i = 0; dedeffects[i] != AL_EFFECT_NULL; i++) + { + char* next = dStrchr(current, ','); + mOpenAL.alEffecti(obj, AL_FILTER_TYPE, dedeffects[i]); + if (mOpenAL.alGetError() != AL_NO_ERROR) + dMemmove(current, next + 1, strlen(next)); + else + current = next + 1; + } + } + else + { + for (i = 0; dedeffects[i] != AL_EFFECT_NULL; i++) + { + char* next = dStrchr(current, ','); + dMemmove(current, next + 1, strlen(next)); + } + } + + Con::printf("| Supported Effects: %s", effectNames); + + mOpenAL.alDeleteEffects(1, &obj); +} + +S32 SFXALDevice::getMaxSources() +{ + // Clear AL Error Code + mOpenAL.alGetError(); + + ALCint nummono; + mOpenAL.alcGetIntegerv(mDevice, ALC_MONO_SOURCES, 1, &nummono); + + return nummono; +} //----------------------------------------------------------------------------- @@ -54,20 +249,24 @@ SFXALDevice::SFXALDevice( SFXProvider *provider, attribs[1] = 4; mDevice = mOpenAL.alcOpenDevice( name ); - mOpenAL.alcGetError( mDevice ); + U32 err = mOpenAL.alcGetError(mDevice); + if (err != ALC_NO_ERROR) + Con::errorf("SFXALDevice - Device Initialization Error: %s", mOpenAL.alcGetString(mDevice, err)); + if( mDevice ) { mContext = mOpenAL.alcCreateContext( mDevice, attribs ); if( mContext ) mOpenAL.alcMakeContextCurrent( mContext ); + #if defined(AL_ALEXT_PROTOTYPES) mOpenAL.alcGetIntegerv(mDevice, ALC_MAX_AUXILIARY_SENDS, 1, &iSends); #endif U32 err = mOpenAL.alcGetError( mDevice ); if( err != ALC_NO_ERROR ) - Con::errorf( "SFXALDevice - Initialization Error: %s", mOpenAL.alcGetString( mDevice, err ) ); + Con::errorf( "SFXALDevice - Context Initialization Error: %s", mOpenAL.alcGetString( mDevice, err ) ); } AssertFatal( mDevice != NULL && mContext != NULL, "Failed to create OpenAL device and/or context!" ); @@ -89,6 +288,16 @@ SFXALDevice::SFXALDevice( SFXProvider *provider, dMemset(effect, 0, sizeof(effect)); uLoop = 0; #endif + + printALInfo(mDevice); + printHRTFInfo(mDevice); + getEFXInfo(mDevice); + + mMaxBuffers = getMaxSources(); + + // this should be max sources. + Con::printf("| Max Sources: %d", mMaxBuffers); + } //----------------------------------------------------------------------------- diff --git a/Engine/source/sfx/openal/sfxALDevice.h b/Engine/source/sfx/openal/sfxALDevice.h index d6aa7ea82..f4d7374c6 100644 --- a/Engine/source/sfx/openal/sfxALDevice.h +++ b/Engine/source/sfx/openal/sfxALDevice.h @@ -53,7 +53,12 @@ class SFXALDevice : public SFXDevice typedef SFXDevice Parent; friend class SFXALVoice; // mDistanceFactor, mRolloffFactor - SFXALDevice( SFXProvider *provider, + void printALInfo(ALCdevice* device); + void printHRTFInfo(ALCdevice* device); + void getEFXInfo(ALCdevice* device); + S32 getMaxSources(); + + SFXALDevice( SFXProvider *provider, const OPENALFNTABLE &openal, String name, bool useHardware, diff --git a/Engine/source/sfx/openal/sfxALProvider.cpp b/Engine/source/sfx/openal/sfxALProvider.cpp index df4e4f206..5c8f90b48 100644 --- a/Engine/source/sfx/openal/sfxALProvider.cpp +++ b/Engine/source/sfx/openal/sfxALProvider.cpp @@ -100,26 +100,6 @@ void SFXALProvider::init() info->name = String( mALDL->GetDeviceName( i ) ); - S32 major, minor, eax = 0; - - mALDL->GetDeviceVersion( i, &major, &minor ); - - // Apologies for the blatent enum hack -patw - for( S32 j = SFXALEAX2; j < SFXALEAXRAM; j++ ) - eax += (int)mALDL->IsExtensionSupported( i, (SFXALCaps)j ); - - if( eax > 0 ) - { - eax += 2; // EAX support starts at 2.0 - dSprintf( temp, sizeof( temp ), "[EAX %d.0] %s", eax, ( mALDL->IsExtensionSupported( i, SFXALEAXRAM ) ? "EAX-RAM" : "" ) ); - } - else - dStrcpy( temp, "", 256 ); - - info->driver = String::ToString( deviceFormat, major, minor, temp ); - info->hasHardware = eax > 0; - info->maxBuffers = mALDL->GetMaxNumSources( i ); - mDeviceInfo.push_back( info ); } diff --git a/Engine/source/sfx/openal/win32/LoadOAL.cpp b/Engine/source/sfx/openal/win32/LoadOAL.cpp index f591c7477..14ad3f044 100644 --- a/Engine/source/sfx/openal/win32/LoadOAL.cpp +++ b/Engine/source/sfx/openal/win32/LoadOAL.cpp @@ -552,6 +552,35 @@ ALboolean LoadOAL10Library(char *szOALFullPathName, LPOPENALFNTABLE lpOALFnTable OutputDebugStringA("Failed to retrieve 'alGetAuxiliaryEffectSlotiv' function address\n"); } lpOALFnTable->alSource3i = (LPALSOURCE3I)GetProcAddress(g_hOpenALDLL, "alSource3i"); + + lpOALFnTable->alGenFilters = (LPALGENFILTERS)GetProcAddress(g_hOpenALDLL, "alGenFilters"); + if (lpOALFnTable->alGenFilters == NULL) + { + OutputDebugStringA("Failed to retrieve 'alGenFilters' function address\n"); + return AL_FALSE; + } + + lpOALFnTable->alDeleteFilters = (LPALDELETEFILTERS)GetProcAddress(g_hOpenALDLL, "alDeleteFilters"); + if (lpOALFnTable->alGenFilters == NULL) + { + OutputDebugStringA("Failed to retrieve 'alDeleteFilters' function address\n"); + return AL_FALSE; + } + + lpOALFnTable->alFilteri = (LPALFILTERI)GetProcAddress(g_hOpenALDLL, "alFilteri"); + if (lpOALFnTable->alGenFilters == NULL) + { + OutputDebugStringA("Failed to retrieve 'alFilteri' function address\n"); + return AL_FALSE; + } + + lpOALFnTable->alcGetStringiSOFT = (LPALCGETSTRINGISOFT)GetProcAddress(g_hOpenALDLL, "alcGetStringiSOFT"); + if (lpOALFnTable->alcGetStringiSOFT == NULL) + { + OutputDebugStringA("Failed to retrieve 'alcGetStringiSOFT' function address\n"); + return AL_FALSE; + } + #endif return AL_TRUE; }