浏览代码

Merge pull request #1374 from Areloch/OpenALDeviceListFixup

Adjusts the OpenAL device listing query to ensure more reliable results.
Brian Roberts 7 月之前
父节点
当前提交
91f4325286
共有 3 个文件被更改,包括 42 次插入45 次删除
  1. 37 39
      Engine/source/sfx/openal/aldlist.cpp
  2. 0 1
      Engine/source/sfx/openal/aldlist.h
  3. 5 5
      Engine/source/sfx/openal/sfxALProvider.cpp

+ 37 - 39
Engine/source/sfx/openal/aldlist.cpp

@@ -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)
-         {
-            char* deviceName = openFind + 1;
-            char* closeFind = dStrchr(deviceName, ')');
-            if (closeFind)
-               (*closeFind) = '\0';
-
-            dStrncpy(ALDeviceInfo.strDeviceName, deviceName, sizeof(ALDeviceInfo.strDeviceName));
+         ALCcontext* ctx = ALFunction.alcCreateContext(device, nullptr);
 
-         }
-         else
+         if (ctx)
          {
-            dStrncpy(ALDeviceInfo.strDeviceName, devices, sizeof(ALDeviceInfo.strDeviceName));
+            ALFunction.alcMakeContextCurrent(ctx);
+            actualDeviceName = ALFunction.alcGetString(device, ALC_DEVICE_SPECIFIER);
+            bool bNewName = true;
+
+            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);
          }
-
-         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())

+ 0 - 1
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);

+ 5 - 5
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<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;
 }