Browse Source

OpenAL enumeration fix

Openal enumeration after default device loading.
marauder2k7 3 years ago
parent
commit
d02f5da414
2 changed files with 129 additions and 42 deletions
  1. 124 37
      Engine/source/sfx/openal/aldlist.cpp
  2. 5 5
      Engine/source/sfx/openal/aldlist.h

+ 124 - 37
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,20 @@
 #include <al/alc.h>
 #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;
+   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();
@@ -54,70 +54,156 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
 
    defaultDeviceIndex = 0;
 
-   // grab function pointers for 1.0-API functions, and if successful proceed to enumerate all devices
-   const bool enumerationExtensionPresent = ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT");
-   const bool enumerateAllExtensionPresent = ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT");
-   if (enumerateAllExtensionPresent || enumerationExtensionPresent) {
-      if (enumerateAllExtensionPresent)
-      {
-          devices = (char *)ALFunction.alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
-          defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER);
-      }
-      else
+   if (ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT"))
+   {
+      devices = (char*)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER);
+      defaultDeviceName = (char*)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
+      index = 0;
+      while (*devices != NULL)
       {
-          devices = (char *)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER);
-          defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
+         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;
       }
+   }
 
+   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;
-      // 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) {
+      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) {
+         ALCdevice* device = ALFunction.alcOpenDevice(devices);
+
+         if (device)
+         {
+            ALCcontext* context = ALFunction.alcCreateContext(device, NULL);
+            if (context)
+            {
                ALFunction.alcMakeContextCurrent(context);
-               // if new actual device name isn't already in the list, then add it...
-               actualDeviceName = devices;
+
+               actualDeviceName = ALFunction.alcGetString(device, ALC_ALL_DEVICES_SPECIFIER);
                bool bNewName = true;
                for (int i = 0; i < GetNumDevices(); i++) {
-                  if (String::compare(GetDeviceName(i), actualDeviceName) == 0) {
+                  if (dStrcmp(GetDeviceName(i), actualDeviceName) == 0) {
                      bNewName = false;
                   }
                }
-               if ((bNewName) && (actualDeviceName != NULL) && (dStrlen(actualDeviceName) > 0)) {
+
+               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;
 
-                  // Check for ALC Extensions
                   if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_CAPTURE") == AL_TRUE)
                      ALDeviceInfo.iCapsFlags |= SFXALCapture;
+
                   if (ALFunction.alcIsExtensionPresent(device, "ALC_EXT_EFX") == AL_TRUE)
                      ALDeviceInfo.iCapsFlags |= SFXALEFX;
 
-                  // Check for AL Extensions
                   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;
 
@@ -128,6 +214,7 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
                   ALDeviceInfo.uiSourceCount = GetMaxNumSources();
 
                   vDeviceInfo.push_back(ALDeviceInfo);
+
                }
                ALFunction.alcMakeContextCurrent(NULL);
                ALFunction.alcDestroyContext(context);

+ 5 - 5
Engine/source/sfx/openal/aldlist.h

@@ -31,11 +31,11 @@
 
 typedef struct
 {
-	char           strDeviceName[256];
-	S32				iMajorVersion;
-	S32				iMinorVersion;
-   U32	uiSourceCount;
-	S32 iCapsFlags;
+	char        strDeviceName[256];
+	S32			iMajorVersion;
+	S32			iMinorVersion;
+   U32	      uiSourceCount;
+	S32         iCapsFlags;
 	bool			bSelected;
 } ALDEVICEINFO, *LPALDEVICEINFO;