From e47fe2b1f3e40db07f1243b59d270dd486b810da Mon Sep 17 00:00:00 2001 From: JeffR Date: Thu, 30 Jan 2025 15:18:51 -0600 Subject: [PATCH] Adjusts the OpenAL device listing query to ensure more reliable results. --- Engine/source/sfx/openal/aldlist.cpp | 74 +++++++++++----------- Engine/source/sfx/openal/aldlist.h | 1 - Engine/source/sfx/openal/sfxALProvider.cpp | 10 +-- 3 files changed, 41 insertions(+), 44 deletions(-) diff --git a/Engine/source/sfx/openal/aldlist.cpp b/Engine/source/sfx/openal/aldlist.cpp index b80efd21f..f55a56569 100644 --- a/Engine/source/sfx/openal/aldlist.cpp +++ b/Engine/source/sfx/openal/aldlist.cpp @@ -33,10 +33,11 @@ #include #endif + /* * Init call */ -ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft ) +ALDeviceList::ALDeviceList( const OPENALFNTABLE& oalft ) { VECTOR_SET_ASSOCIATION( vDeviceInfo ); @@ -44,8 +45,9 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft ) char *devices; int index; const char *defaultDeviceName; + const char *actualDeviceName; - 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(); @@ -66,44 +68,48 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft ) index = 0; // go through device list (each device terminated with a single NULL, list terminated with double NULL) - while (*devices != 0) { + 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)) + ALCdevice* device = ALFunction.alcOpenDevice(devices); + if (device) { - dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO)); - ALDeviceInfo.bSelected = true; - dStrncpy(ALDeviceInfo.strInternalDeviceName, devices, sizeof(ALDeviceInfo.strInternalDeviceName)); - char deviceExternal[256]; - dStrcpy(deviceExternal, devices, 256); - char* openFind = dStrchr(deviceExternal, '('); - if (openFind) + ALCcontext* ctx = ALFunction.alcCreateContext(device, nullptr); + + if (ctx) { - char* deviceName = openFind + 1; - char* closeFind = dStrchr(deviceName, ')'); - if (closeFind) - (*closeFind) = '\0'; + ALFunction.alcMakeContextCurrent(ctx); + actualDeviceName = ALFunction.alcGetString(device, ALC_DEVICE_SPECIFIER); + bool bNewName = true; - dStrncpy(ALDeviceInfo.strDeviceName, deviceName, sizeof(ALDeviceInfo.strDeviceName)); + if (actualDeviceName) + { + for (int i = 0; i < GetNumDevices(); i++) { + if (String::compare(GetDeviceName(i), devices) == 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)); + char deviceExternal[256]; + dStrcpy(deviceExternal, devices, 256); + + vDeviceInfo.push_back(ALDeviceInfo); + } + + ALFunction.alcMakeContextCurrent(nullptr); + ALFunction.alcDestroyContext(ctx); } - else - { - dStrncpy(ALDeviceInfo.strDeviceName, devices, sizeof(ALDeviceInfo.strDeviceName)); - } - - vDeviceInfo.push_back(ALDeviceInfo); + ALFunction.alcCloseDevice(device); } - + devices += dStrlen(devices) + 1; index += 1; } @@ -129,14 +135,6 @@ int ALDeviceList::GetNumDevices() /* * Returns the device name at an index in the complete device list */ -const char *ALDeviceList::GetInternalDeviceName(int index) -{ - if (index < GetNumDevices()) - return vDeviceInfo[index].strInternalDeviceName; - else - return NULL; -} - const char* ALDeviceList::GetDeviceName(int index) { if (index < GetNumDevices()) diff --git a/Engine/source/sfx/openal/aldlist.h b/Engine/source/sfx/openal/aldlist.h index 7927914cf..20f110361 100644 --- a/Engine/source/sfx/openal/aldlist.h +++ b/Engine/source/sfx/openal/aldlist.h @@ -53,7 +53,6 @@ public: ~ALDeviceList (); S32 GetNumDevices(); const char *GetDeviceName(S32 index); - const char *GetInternalDeviceName(S32 index); void GetDeviceVersion(S32 index, S32 *major, S32 *minor); U32 GetMaxNumSources(S32 index); bool IsExtensionSupported(S32 index, SFXALCaps caps); diff --git a/Engine/source/sfx/openal/sfxALProvider.cpp b/Engine/source/sfx/openal/sfxALProvider.cpp index 28a28b9e4..b3a62c4ba 100644 --- a/Engine/source/sfx/openal/sfxALProvider.cpp +++ b/Engine/source/sfx/openal/sfxALProvider.cpp @@ -97,7 +97,7 @@ void SFXALProvider::init() { ALDeviceInfo* info = new ALDeviceInfo; - info->internalName = String( mALDL->GetInternalDeviceName( i ) ); + //info->internalName = String( mALDL->GetInternalDeviceName( i ) ); info->name = String( mALDL->GetDeviceName( i ) ); mDeviceInfo.push_back( info ); @@ -114,14 +114,14 @@ SFXALProvider::~SFXALProvider() delete mALDL; } -SFXDevice *SFXALProvider::createDevice( const String& deviceName, bool useHardware, S32 maxBuffers ) +SFXDevice* SFXALProvider::createDevice(const String& deviceName, bool useHardware, S32 maxBuffers) { - ALDeviceInfo *info = dynamic_cast< ALDeviceInfo* > - ( _findDeviceInfo( deviceName) ); + ALDeviceInfo* info = dynamic_cast + (_findDeviceInfo(deviceName)); // Do we find one to create? if (info) - return new SFXALDevice(this, mOpenAL, info->internalName, useHardware, maxBuffers); + return new SFXALDevice(this, mOpenAL, info->name, useHardware, maxBuffers); return NULL; }