summaryrefslogtreecommitdiffstats
path: root/src/audio
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2020-05-24 00:44:10 +0200
committerSergeanur <s.anureev@yandex.ua>2020-05-24 00:44:10 +0200
commitf92770f74affa700abcec27f872b2627054f27b6 (patch)
treeb4521738ec105fd8e2cdc0f6e3a21035c70eff43 /src/audio
parentFix OAL crash (diff)
downloadre3-f92770f74affa700abcec27f872b2627054f27b6.tar
re3-f92770f74affa700abcec27f872b2627054f27b6.tar.gz
re3-f92770f74affa700abcec27f872b2627054f27b6.tar.bz2
re3-f92770f74affa700abcec27f872b2627054f27b6.tar.lz
re3-f92770f74affa700abcec27f872b2627054f27b6.tar.xz
re3-f92770f74affa700abcec27f872b2627054f27b6.tar.zst
re3-f92770f74affa700abcec27f872b2627054f27b6.zip
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/oal/aldlist.cpp108
-rw-r--r--src/audio/oal/aldlist.h39
-rw-r--r--src/audio/sampman_oal.cpp8
3 files changed, 70 insertions, 85 deletions
diff --git a/src/audio/oal/aldlist.cpp b/src/audio/oal/aldlist.cpp
index 9834ffb4..3e86b1d7 100644
--- a/src/audio/oal/aldlist.cpp
+++ b/src/audio/oal/aldlist.cpp
@@ -41,8 +41,7 @@ ALDeviceList::ALDeviceList()
const char *actualDeviceName;
// DeviceInfo vector stores, for each enumerated device, it's device name, selection status, spec version #, and extension support
- vDeviceInfo.empty();
- vDeviceInfo.reserve(10);
+ nNumOfDevices = 0;
defaultDeviceIndex = 0;
@@ -64,7 +63,7 @@ ALDeviceList::ALDeviceList()
// if new actual device name isn't already in the list, then add it...
actualDeviceName = alcGetString(device, ALC_DEVICE_SPECIFIER);
bool bNewName = true;
- for (int i = 0; i < GetNumDevices(); i++) {
+ for (unsigned int i = 0; i < GetNumDevices(); i++) {
if (strcmp(GetDeviceName(i), actualDeviceName) == 0) {
bNewName = false;
}
@@ -76,39 +75,37 @@ ALDeviceList::ALDeviceList()
alcGetIntegerv(device, ALC_MAJOR_VERSION, sizeof(int), &ALDeviceInfo.iMajorVersion);
alcGetIntegerv(device, ALC_MINOR_VERSION, sizeof(int), &ALDeviceInfo.iMinorVersion);
- ALDeviceInfo.pvstrExtensions = new std::vector<std::string>;
-
// Check for ALC Extensions
if (alcIsExtensionPresent(device, "ALC_EXT_CAPTURE") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("ALC_EXT_CAPTURE");
+ ALDeviceInfo.Extensions |= ADEXT_EXT_CAPTURE;
if (alcIsExtensionPresent(device, "ALC_EXT_EFX") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("ALC_EXT_EFX");
+ ALDeviceInfo.Extensions |= ADEXT_EXT_EFX;
// Check for AL Extensions
if (alIsExtensionPresent("AL_EXT_OFFSET") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("AL_EXT_OFFSET");
+ ALDeviceInfo.Extensions |= ADEXT_EXT_OFFSET;
if (alIsExtensionPresent("AL_EXT_LINEAR_DISTANCE") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("AL_EXT_LINEAR_DISTANCE");
+ ALDeviceInfo.Extensions |= ADEXT_EXT_LINEAR_DISTANCE;
if (alIsExtensionPresent("AL_EXT_EXPONENT_DISTANCE") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("AL_EXT_EXPONENT_DISTANCE");
+ ALDeviceInfo.Extensions |= ADEXT_EXT_EXPONENT_DISTANCE;
if (alIsExtensionPresent("EAX2.0") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("EAX2.0");
+ ALDeviceInfo.Extensions |= ADEXT_EAX2;
if (alIsExtensionPresent("EAX3.0") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("EAX3.0");
+ ALDeviceInfo.Extensions |= ADEXT_EAX3;
if (alIsExtensionPresent("EAX4.0") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("EAX4.0");
+ ALDeviceInfo.Extensions |= ADEXT_EAX4;
if (alIsExtensionPresent("EAX5.0") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("EAX5.0");
+ ALDeviceInfo.Extensions |= ADEXT_EAX5;
if (alIsExtensionPresent("EAX-RAM") == AL_TRUE)
- ALDeviceInfo.pvstrExtensions->push_back("EAX-RAM");
+ ALDeviceInfo.Extensions |= ADEXT_EAX_RAM;
// Get Source Count
ALDeviceInfo.uiSourceCount = GetMaxNumSources();
- vDeviceInfo.push_back(ALDeviceInfo);
+ aDeviceInfo[nNumOfDevices++] = ALDeviceInfo;
}
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
@@ -128,31 +125,23 @@ ALDeviceList::ALDeviceList()
*/
ALDeviceList::~ALDeviceList()
{
- for (unsigned int i = 0; i < vDeviceInfo.size(); i++) {
- if (vDeviceInfo[i].pvstrExtensions) {
- vDeviceInfo[i].pvstrExtensions->empty();
- delete vDeviceInfo[i].pvstrExtensions;
- }
- }
-
- vDeviceInfo.empty();
}
/*
* Returns the number of devices in the complete device list
*/
-int ALDeviceList::GetNumDevices()
+unsigned int ALDeviceList::GetNumDevices()
{
- return (int)vDeviceInfo.size();
+ return nNumOfDevices;
}
/*
* Returns the device name at an index in the complete device list
*/
-char * ALDeviceList::GetDeviceName(int index)
+const char * ALDeviceList::GetDeviceName(unsigned int index)
{
if (index < GetNumDevices())
- return (char *)vDeviceInfo[index].strDeviceName.c_str();
+ return aDeviceInfo[index].strDeviceName;
else
return NULL;
}
@@ -160,13 +149,13 @@ char * ALDeviceList::GetDeviceName(int index)
/*
* Returns the major and minor version numbers for a device at a specified index in the complete list
*/
-void ALDeviceList::GetDeviceVersion(int index, int *major, int *minor)
+void ALDeviceList::GetDeviceVersion(unsigned int index, int *major, int *minor)
{
if (index < GetNumDevices()) {
if (major)
- *major = vDeviceInfo[index].iMajorVersion;
+ *major = aDeviceInfo[index].iMajorVersion;
if (minor)
- *minor = vDeviceInfo[index].iMinorVersion;
+ *minor = aDeviceInfo[index].iMinorVersion;
}
return;
}
@@ -174,10 +163,10 @@ void ALDeviceList::GetDeviceVersion(int index, int *major, int *minor)
/*
* Returns the maximum number of Sources that can be generate on the given device
*/
-unsigned int ALDeviceList::GetMaxNumSources(int index)
+unsigned int ALDeviceList::GetMaxNumSources(unsigned int index)
{
if (index < GetNumDevices())
- return vDeviceInfo[index].uiSourceCount;
+ return aDeviceInfo[index].uiSourceCount;
else
return 0;
}
@@ -185,20 +174,9 @@ unsigned int ALDeviceList::GetMaxNumSources(int index)
/*
* Checks if the extension is supported on the given device
*/
-bool ALDeviceList::IsExtensionSupported(int index, const char *szExtName)
+bool ALDeviceList::IsExtensionSupported(int index, unsigned short ext)
{
- bool bReturn = false;
-
- if (index < GetNumDevices()) {
- for (unsigned int i = 0; i < vDeviceInfo[index].pvstrExtensions->size(); i++) {
- if (!_stricmp(vDeviceInfo[index].pvstrExtensions->at(i).c_str(), szExtName)) {
- bReturn = true;
- break;
- }
- }
- }
-
- return bReturn;
+ return !!(aDeviceInfo[index].Extensions & ext);
}
/*
@@ -215,10 +193,10 @@ int ALDeviceList::GetDefaultDevice()
void ALDeviceList::FilterDevicesMinVer(int major, int minor)
{
int dMajor, dMinor;
- for (unsigned int i = 0; i < vDeviceInfo.size(); i++) {
+ for (unsigned int i = 0; i < nNumOfDevices; i++) {
GetDeviceVersion(i, &dMajor, &dMinor);
if ((dMajor < major) || ((dMajor == major) && (dMinor < minor))) {
- vDeviceInfo[i].bSelected = false;
+ aDeviceInfo[i].bSelected = false;
}
}
}
@@ -229,10 +207,10 @@ void ALDeviceList::FilterDevicesMinVer(int major, int minor)
void ALDeviceList::FilterDevicesMaxVer(int major, int minor)
{
int dMajor, dMinor;
- for (unsigned int i = 0; i < vDeviceInfo.size(); i++) {
+ for (unsigned int i = 0; i < nNumOfDevices; i++) {
GetDeviceVersion(i, &dMajor, &dMinor);
if ((dMajor > major) || ((dMajor == major) && (dMinor > minor))) {
- vDeviceInfo[i].bSelected = false;
+ aDeviceInfo[i].bSelected = false;
}
}
}
@@ -240,20 +218,12 @@ void ALDeviceList::FilterDevicesMaxVer(int major, int minor)
/*
* Deselects device which don't support the given extension name
*/
-void ALDeviceList::FilterDevicesExtension(char *szExtName)
+void
+ALDeviceList::FilterDevicesExtension(unsigned short ext)
{
- bool bFound;
-
- for (unsigned int i = 0; i < vDeviceInfo.size(); i++) {
- bFound = false;
- for (unsigned int j = 0; j < vDeviceInfo[i].pvstrExtensions->size(); j++) {
- if (!_stricmp(vDeviceInfo[i].pvstrExtensions->at(j).c_str(), szExtName)) {
- bFound = true;
- break;
- }
- }
- if (!bFound)
- vDeviceInfo[i].bSelected = false;
+ for (unsigned int i = 0; i < nNumOfDevices; i++) {
+ if (!IsExtensionSupported(i, ext))
+ aDeviceInfo[i].bSelected = false;
}
}
@@ -262,8 +232,8 @@ void ALDeviceList::FilterDevicesExtension(char *szExtName)
*/
void ALDeviceList::ResetFilters()
{
- for (int i = 0; i < GetNumDevices(); i++) {
- vDeviceInfo[i].bSelected = true;
+ for (unsigned int i = 0; i < GetNumDevices(); i++) {
+ aDeviceInfo[i].bSelected = true;
}
filterIndex = 0;
}
@@ -273,10 +243,10 @@ void ALDeviceList::ResetFilters()
*/
int ALDeviceList::GetFirstFilteredDevice()
{
- int i;
+ unsigned int i;
for (i = 0; i < GetNumDevices(); i++) {
- if (vDeviceInfo[i].bSelected == true) {
+ if (aDeviceInfo[i].bSelected == true) {
break;
}
}
@@ -289,10 +259,10 @@ int ALDeviceList::GetFirstFilteredDevice()
*/
int ALDeviceList::GetNextFilteredDevice()
{
- int i;
+ unsigned int i;
for (i = filterIndex; i < GetNumDevices(); i++) {
- if (vDeviceInfo[i].bSelected == true) {
+ if (aDeviceInfo[i].bSelected == true) {
break;
}
}
diff --git a/src/audio/oal/aldlist.h b/src/audio/oal/aldlist.h
index 3afa6bfe..417bd314 100644
--- a/src/audio/oal/aldlist.h
+++ b/src/audio/oal/aldlist.h
@@ -5,19 +5,33 @@
#ifdef AUDIO_OAL
#pragma warning(disable: 4786) //disable warning "identifier was truncated to '255' characters in the browser information"
-#include <vector>
-#include <string>
+
+enum
+{
+ ADEXT_EXT_CAPTURE = (1 << 0),
+ ADEXT_EXT_EFX = (1 << 1),
+ ADEXT_EXT_OFFSET = (1 << 2),
+ ADEXT_EXT_LINEAR_DISTANCE = (1 << 3),
+ ADEXT_EXT_EXPONENT_DISTANCE = (1 << 4),
+ ADEXT_EAX2 = (1 << 5),
+ ADEXT_EAX3 = (1 << 6),
+ ADEXT_EAX4 = (1 << 7),
+ ADEXT_EAX5 = (1 << 8),
+ ADEXT_EAX_RAM = (1 << 9),
+};
struct ALDEVICEINFO {
- std::string strDeviceName;
+ const char *strDeviceName;
int iMajorVersion;
int iMinorVersion;
unsigned int uiSourceCount;
- std::vector<std::string> *pvstrExtensions;
+ unsigned short Extensions;
bool bSelected;
- ALDEVICEINFO() : iMajorVersion(0), iMinorVersion(0), uiSourceCount(0), pvstrExtensions(NULL), bSelected(false)
+ ALDEVICEINFO() : iMajorVersion(0), iMinorVersion(0), uiSourceCount(0), bSelected(false)
{
+ strDeviceName = NULL;
+ Extensions = 0;
}
};
@@ -26,22 +40,23 @@ typedef ALDEVICEINFO *LPALDEVICEINFO;
class ALDeviceList
{
private:
- std::vector<ALDEVICEINFO> vDeviceInfo;
+ ALDEVICEINFO aDeviceInfo[64];
+ unsigned int nNumOfDevices;
int defaultDeviceIndex;
int filterIndex;
public:
ALDeviceList ();
~ALDeviceList ();
- int GetNumDevices();
- char *GetDeviceName(int index);
- void GetDeviceVersion(int index, int *major, int *minor);
- unsigned int GetMaxNumSources(int index);
- bool IsExtensionSupported(int index, const char *szExtName);
+ unsigned int GetNumDevices();
+ const char *GetDeviceName(unsigned int index);
+ void GetDeviceVersion(unsigned int index, int *major, int *minor);
+ unsigned int GetMaxNumSources(unsigned int index);
+ bool IsExtensionSupported(int index, unsigned short ext);
int GetDefaultDevice();
void FilterDevicesMinVer(int major, int minor);
void FilterDevicesMaxVer(int major, int minor);
- void FilterDevicesExtension(char *szExtName);
+ void FilterDevicesExtension(unsigned short ext);
void ResetFilters();
int GetFirstFilteredDevice();
int GetNextFilteredDevice();
diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp
index f6f3a393..1952f370 100644
--- a/src/audio/sampman_oal.cpp
+++ b/src/audio/sampman_oal.cpp
@@ -174,10 +174,10 @@ add_providers()
}
if ( alGetEnumValue("AL_EFFECT_EAXREVERB") != 0
- || pDeviceList->IsExtensionSupported(i, "EAX2.0")
- || pDeviceList->IsExtensionSupported(i, "EAX3.0")
- || pDeviceList->IsExtensionSupported(i, "EAX4.0")
- || pDeviceList->IsExtensionSupported(i, "EAX5.0") )
+ || pDeviceList->IsExtensionSupported(i, ADEXT_EAX2)
+ || pDeviceList->IsExtensionSupported(i, ADEXT_EAX3)
+ || pDeviceList->IsExtensionSupported(i, ADEXT_EAX4)
+ || pDeviceList->IsExtensionSupported(i, ADEXT_EAX5) )
{
if ( n < MAXPROVIDERS )
{