Adjusts the OpenAL device listing query to ensure more reliable results.

This commit is contained in:
JeffR 2025-01-30 15:18:51 -06:00
parent cb63b382ff
commit e47fe2b1f3
3 changed files with 41 additions and 44 deletions

View file

@ -33,6 +33,7 @@
#include <al/alc.h> #include <al/alc.h>
#endif #endif
/* /*
* Init call * Init call
*/ */
@ -44,6 +45,7 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
char *devices; char *devices;
int index; int index;
const char *defaultDeviceName; const char *defaultDeviceName;
const char *actualDeviceName;
dMemcpy( &ALFunction, &oalft, sizeof(OPENALFNTABLE) ); dMemcpy( &ALFunction, &oalft, sizeof(OPENALFNTABLE) );
@ -66,44 +68,48 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
index = 0; index = 0;
// go through device list (each device terminated with a single NULL, list terminated with double NULL) // 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) { if (String::compare(defaultDeviceName, devices) == 0) {
defaultDeviceIndex = index; defaultDeviceIndex = index;
} }
ALCdevice* device = ALFunction.alcOpenDevice(devices);
if (device)
{
ALCcontext* ctx = ALFunction.alcCreateContext(device, nullptr);
if (ctx)
{
ALFunction.alcMakeContextCurrent(ctx);
actualDeviceName = ALFunction.alcGetString(device, ALC_DEVICE_SPECIFIER);
bool bNewName = true; bool bNewName = true;
if (actualDeviceName)
{
for (int i = 0; i < GetNumDevices(); i++) { for (int i = 0; i < GetNumDevices(); i++) {
if (String::compare(GetDeviceName(i), devices) == 0) { if (String::compare(GetDeviceName(i), devices) == 0) {
bNewName = false; bNewName = false;
} }
} }
}
if ((bNewName) && (devices != NULL) && (dStrlen(devices) > 0)) if ((bNewName) && (actualDeviceName != NULL) && (dStrlen(actualDeviceName) > 0))
{ {
dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO)); dMemset(&ALDeviceInfo, 0, sizeof(ALDEVICEINFO));
ALDeviceInfo.bSelected = true; ALDeviceInfo.bSelected = true;
dStrncpy(ALDeviceInfo.strInternalDeviceName, devices, sizeof(ALDeviceInfo.strInternalDeviceName)); dStrncpy(ALDeviceInfo.strDeviceName, actualDeviceName, sizeof(ALDeviceInfo.strDeviceName));
char deviceExternal[256]; char deviceExternal[256];
dStrcpy(deviceExternal, devices, 256); dStrcpy(deviceExternal, devices, 256);
char* openFind = dStrchr(deviceExternal, '(');
if (openFind)
{
char* deviceName = openFind + 1;
char* closeFind = dStrchr(deviceName, ')');
if (closeFind)
(*closeFind) = '\0';
dStrncpy(ALDeviceInfo.strDeviceName, deviceName, sizeof(ALDeviceInfo.strDeviceName));
}
else
{
dStrncpy(ALDeviceInfo.strDeviceName, devices, sizeof(ALDeviceInfo.strDeviceName));
}
vDeviceInfo.push_back(ALDeviceInfo); vDeviceInfo.push_back(ALDeviceInfo);
} }
ALFunction.alcMakeContextCurrent(nullptr);
ALFunction.alcDestroyContext(ctx);
}
ALFunction.alcCloseDevice(device);
}
devices += dStrlen(devices) + 1; devices += dStrlen(devices) + 1;
index += 1; index += 1;
} }
@ -129,14 +135,6 @@ int ALDeviceList::GetNumDevices()
/* /*
* Returns the device name at an index in the complete device list * 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) const char* ALDeviceList::GetDeviceName(int index)
{ {
if (index < GetNumDevices()) if (index < GetNumDevices())

View file

@ -53,7 +53,6 @@ public:
~ALDeviceList (); ~ALDeviceList ();
S32 GetNumDevices(); S32 GetNumDevices();
const char *GetDeviceName(S32 index); const char *GetDeviceName(S32 index);
const char *GetInternalDeviceName(S32 index);
void GetDeviceVersion(S32 index, S32 *major, S32 *minor); void GetDeviceVersion(S32 index, S32 *major, S32 *minor);
U32 GetMaxNumSources(S32 index); U32 GetMaxNumSources(S32 index);
bool IsExtensionSupported(S32 index, SFXALCaps caps); bool IsExtensionSupported(S32 index, SFXALCaps caps);

View file

@ -97,7 +97,7 @@ void SFXALProvider::init()
{ {
ALDeviceInfo* info = new ALDeviceInfo; ALDeviceInfo* info = new ALDeviceInfo;
info->internalName = String( mALDL->GetInternalDeviceName( i ) ); //info->internalName = String( mALDL->GetInternalDeviceName( i ) );
info->name = String( mALDL->GetDeviceName( i ) ); info->name = String( mALDL->GetDeviceName( i ) );
mDeviceInfo.push_back( info ); mDeviceInfo.push_back( info );
@ -121,7 +121,7 @@ SFXDevice *SFXALProvider::createDevice( const String& deviceName, bool useHardwa
// Do we find one to create? // Do we find one to create?
if (info) if (info)
return new SFXALDevice(this, mOpenAL, info->internalName, useHardware, maxBuffers); return new SFXALDevice(this, mOpenAL, info->name, useHardware, maxBuffers);
return NULL; return NULL;
} }