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,10 +33,11 @@
#include <al/alc.h>
#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())

View file

@ -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);

View file

@ -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<ALDeviceInfo*>
(_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;
}