aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-11-18 19:19:35 -0800
committerChris Robinson <[email protected]>2018-11-18 19:19:35 -0800
commit2c06ec709324b7aebdb71961a428362cfcafa68f (patch)
treed1ae5d23fdb13bd2997593f02901e45cb2d002f1
parentbafcba7194c36eaf4fa1cb09b000170f8a138055 (diff)
Use a regular vector for the enumerated HRTF list
-rw-r--r--Alc/alc.cpp25
-rw-r--r--Alc/hrtf.cpp135
-rw-r--r--Alc/hrtf.h13
-rw-r--r--Alc/panning.cpp21
-rw-r--r--OpenAL32/Include/alMain.h3
5 files changed, 86 insertions, 111 deletions
diff --git a/Alc/alc.cpp b/Alc/alc.cpp
index e2f562a1..bb51f6f0 100644
--- a/Alc/alc.cpp
+++ b/Alc/alc.cpp
@@ -2035,17 +2035,14 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if(hrtf_userreq == Hrtf_Enable || (hrtf_userreq != Hrtf_Disable && hrtf_appreq == Hrtf_Enable))
{
struct Hrtf *hrtf = nullptr;
- if(VECTOR_SIZE(device->HrtfList) == 0)
- {
- VECTOR_DEINIT(device->HrtfList);
+ if(device->HrtfList.empty())
device->HrtfList = EnumerateHrtf(device->DeviceName.c_str());
- }
- if(VECTOR_SIZE(device->HrtfList) > 0)
+ if(!device->HrtfList.empty())
{
- if(hrtf_id >= 0 && (size_t)hrtf_id < VECTOR_SIZE(device->HrtfList))
- hrtf = GetLoadedHrtf(VECTOR_ELEM(device->HrtfList, hrtf_id).hrtf);
+ if(hrtf_id >= 0 && (size_t)hrtf_id < device->HrtfList.size())
+ hrtf = GetLoadedHrtf(device->HrtfList[hrtf_id].hrtf);
else
- hrtf = GetLoadedHrtf(VECTOR_ELEM(device->HrtfList, 0).hrtf);
+ hrtf = GetLoadedHrtf(device->HrtfList.front().hrtf);
}
if(hrtf)
@@ -2391,8 +2388,6 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
ALCdevice_struct::ALCdevice_struct(DeviceType type)
: Type{type}
{
- VECTOR_INIT(HrtfList);
-
VECTOR_INIT(BufferList);
almtx_init(&BufferLock, almtx_plain);
@@ -2443,7 +2438,7 @@ ALCdevice_struct::~ALCdevice_struct()
al_free(HrtfName);
HrtfName = nullptr;
- FreeHrtfList(&HrtfList);
+ FreeHrtfList(HrtfList);
if(HrtfHandle)
Hrtf_DecRef(HrtfHandle);
HrtfHandle = nullptr;
@@ -3371,9 +3366,9 @@ static ALCsizei GetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALC
case ALC_NUM_HRTF_SPECIFIERS_SOFT:
almtx_lock(&device->BackendLock);
- FreeHrtfList(&device->HrtfList);
+ FreeHrtfList(device->HrtfList);
device->HrtfList = EnumerateHrtf(device->DeviceName.c_str());
- values[0] = (ALCint)VECTOR_SIZE(device->HrtfList);
+ values[0] = (ALCint)device->HrtfList.size();
almtx_unlock(&device->BackendLock);
return 1;
@@ -4466,8 +4461,8 @@ ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum
else switch(paramName)
{
case ALC_HRTF_SPECIFIER_SOFT:
- if(index >= 0 && (size_t)index < VECTOR_SIZE(device->HrtfList))
- str = VECTOR_ELEM(device->HrtfList, index).name;
+ if(index >= 0 && (size_t)index < device->HrtfList.size())
+ str = device->HrtfList[index].name;
else
alcSetError(device, ALC_INVALID_VALUE);
break;
diff --git a/Alc/hrtf.cpp b/Alc/hrtf.cpp
index 783686d5..1305c347 100644
--- a/Alc/hrtf.cpp
+++ b/Alc/hrtf.cpp
@@ -944,7 +944,15 @@ struct Hrtf *LoadHrtf02(std::istream &data, const char *filename)
}
-void AddFileEntry(vector_EnumeratedHrtf *list, const std::string &filename)
+static bool checkName(al::vector<EnumeratedHrtf> &list, const std::string &name)
+{
+ return std::find_if(list.cbegin(), list.cend(),
+ [&name](const EnumeratedHrtf &entry)
+ { return name == entry.name; }
+ ) != list.cend();
+}
+
+void AddFileEntry(al::vector<EnumeratedHrtf> &list, const std::string &filename)
{
/* Check if this file has already been loaded globally. */
HrtfEntry *loaded_entry{LoadedHrtfs};
@@ -952,12 +960,12 @@ void AddFileEntry(vector_EnumeratedHrtf *list, const std::string &filename)
{
if(filename == loaded_entry->filename)
{
- const EnumeratedHrtf *iter;
/* Check if this entry has already been added to the list. */
-#define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf)
- VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY);
-#undef MATCH_ENTRY
- if(iter != VECTOR_END(*list))
+ auto iter = std::find_if(list.cbegin(), list.cend(),
+ [loaded_entry](const EnumeratedHrtf &entry) -> bool
+ { return loaded_entry == entry.hrtf; }
+ );
+ if(iter != list.cend())
{
TRACE("Skipping duplicate file entry %s\n", filename.c_str());
return;
@@ -989,46 +997,38 @@ void AddFileEntry(vector_EnumeratedHrtf *list, const std::string &filename)
size_t extpos{filename.find_last_of('.')};
if(extpos <= namepos) extpos = std::string::npos;
- const EnumeratedHrtf *iter{};
- std::string newname;
- int i{0};
- do {
- if(extpos == std::string::npos)
- newname = filename.substr(namepos);
- else
- newname = filename.substr(namepos, extpos-namepos);
- if(i != 0)
- {
- newname += " #";
- newname += std::to_string(i+1);
- }
- ++i;
-
-#define MATCH_NAME(i) (newname == (i)->name)
- VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_NAME);
-#undef MATCH_NAME
- } while(iter != VECTOR_END(*list));
- EnumeratedHrtf entry{ alstrdup(newname.c_str()), loaded_entry };
+ const std::string basename{(extpos == std::string::npos) ?
+ filename.substr(namepos) : filename.substr(namepos, extpos-namepos)};
+ std::string newname{basename};
+ int count{1};
+ while(checkName(list, newname))
+ {
+ newname = basename;
+ newname += " #";
+ newname += std::to_string(++count);
+ }
+ list.push_back(EnumeratedHrtf{alstrdup(newname.c_str()), loaded_entry});
+ const EnumeratedHrtf &entry = list.back();
TRACE("Adding file entry \"%s\"\n", entry.name);
- VECTOR_PUSH_BACK(*list, entry);
}
/* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer
* for input instead of opening the given filename.
*/
-void AddBuiltInEntry(vector_EnumeratedHrtf *list, const std::string &filename, ALuint residx)
+void AddBuiltInEntry(al::vector<EnumeratedHrtf> &list, const std::string &filename, ALuint residx)
{
HrtfEntry *loaded_entry{LoadedHrtfs};
while(loaded_entry)
{
if(filename == loaded_entry->filename)
{
- const EnumeratedHrtf *iter{};
-#define MATCH_ENTRY(i) (loaded_entry == (i)->hrtf)
- VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_ENTRY);
-#undef MATCH_ENTRY
- if(iter != VECTOR_END(*list))
+ /* Check if this entry has already been added to the list. */
+ auto iter = std::find_if(list.cbegin(), list.cend(),
+ [loaded_entry](const EnumeratedHrtf &entry) -> bool
+ { return loaded_entry == entry.hrtf; }
+ );
+ if(iter != list.cend())
{
TRACE("Skipping duplicate file entry %s\n", filename.c_str());
return;
@@ -1058,26 +1058,18 @@ void AddBuiltInEntry(vector_EnumeratedHrtf *list, const std::string &filename, A
/* TODO: Get a human-readable name from the HRTF data (possibly coming in a
* format update). */
- const EnumeratedHrtf *iter{};
- std::string newname;
- int i{0};
- do {
+ std::string newname{filename};
+ int count{1};
+ while(checkName(list, newname))
+ {
newname = filename;
- if(i != 0)
- {
- newname += " #";
- newname += std::to_string(i+1);
- }
- ++i;
-
-#define MATCH_NAME(i) (newname == (i)->name)
- VECTOR_FIND_IF(iter, const EnumeratedHrtf, *list, MATCH_NAME);
-#undef MATCH_NAME
- } while(iter != VECTOR_END(*list));
- EnumeratedHrtf entry{ alstrdup(newname.c_str()), loaded_entry };
+ newname += " #";
+ newname += std::to_string(++count);
+ }
+ list.push_back(EnumeratedHrtf{alstrdup(newname.c_str()), loaded_entry});
+ const EnumeratedHrtf &entry = list.back();
TRACE("Adding built-in entry \"%s\"\n", entry.name);
- VECTOR_PUSH_BACK(*list, entry);
}
@@ -1108,9 +1100,9 @@ ResData GetResource(int name)
} // namespace
-vector_EnumeratedHrtf EnumerateHrtf(const char *devname)
+al::vector<EnumeratedHrtf> EnumerateHrtf(const char *devname)
{
- vector_EnumeratedHrtf list{VECTOR_INIT_STATIC()};
+ al::vector<EnumeratedHrtf> list;
bool usedefaults{true};
const char *pathlist{""};
@@ -1140,7 +1132,7 @@ vector_EnumeratedHrtf EnumerateHrtf(const char *devname)
{
const std::string pname{pathlist, end};
for(const auto &fname : SearchDataFiles(".mhr", pname.c_str()))
- AddFileEntry(&list, fname);
+ AddFileEntry(list, fname);
}
pathlist = next;
@@ -1152,45 +1144,44 @@ vector_EnumeratedHrtf EnumerateHrtf(const char *devname)
if(usedefaults)
{
for(const auto &fname : SearchDataFiles(".mhr", "openal/hrtf"))
- AddFileEntry(&list, fname);
+ AddFileEntry(list, fname);
ResData res{GetResource(IDR_DEFAULT_44100_MHR)};
if(res.data != nullptr && res.size > 0)
- AddBuiltInEntry(&list, "Built-In 44100hz", IDR_DEFAULT_44100_MHR);
+ AddBuiltInEntry(list, "Built-In 44100hz", IDR_DEFAULT_44100_MHR);
res = GetResource(IDR_DEFAULT_48000_MHR);
if(res.data != nullptr && res.size > 0)
- AddBuiltInEntry(&list, "Built-In 48000hz", IDR_DEFAULT_48000_MHR);
+ AddBuiltInEntry(list, "Built-In 48000hz", IDR_DEFAULT_48000_MHR);
}
const char *defaulthrtf{""};
- if(VECTOR_SIZE(list) > 1 && ConfigValueStr(devname, nullptr, "default-hrtf", &defaulthrtf))
+ if(!list.empty() && ConfigValueStr(devname, nullptr, "default-hrtf", &defaulthrtf))
{
- const EnumeratedHrtf *iter{};
- /* Find the preferred HRTF and move it to the front of the list. */
-#define FIND_ENTRY(i) (strcmp((i)->name, defaulthrtf) == 0)
- VECTOR_FIND_IF(iter, const EnumeratedHrtf, list, FIND_ENTRY);
-#undef FIND_ENTRY
- if(iter == VECTOR_END(list))
+ auto iter = std::find_if(list.begin(), list.end(),
+ [defaulthrtf](const EnumeratedHrtf &entry) -> bool
+ { return strcmp(entry.name, defaulthrtf) == 0; }
+ );
+ if(iter == list.end())
WARN("Failed to find default HRTF \"%s\"\n", defaulthrtf);
- else if(iter != VECTOR_BEGIN(list))
+ else if(iter != list.begin())
{
EnumeratedHrtf entry{*iter};
- memmove(&VECTOR_ELEM(list,1), &VECTOR_ELEM(list,0),
- (iter-VECTOR_BEGIN(list))*sizeof(EnumeratedHrtf));
- VECTOR_ELEM(list,0) = entry;
+ list.erase(iter);
+ list.insert(list.begin(), entry);
}
}
return list;
}
-void FreeHrtfList(vector_EnumeratedHrtf *list)
+void FreeHrtfList(al::vector<EnumeratedHrtf> &list)
{
-#define CLEAR_ENTRY(i) al_free((i)->name)
- VECTOR_FOR_EACH(EnumeratedHrtf, *list, CLEAR_ENTRY);
- VECTOR_DEINIT(*list);
-#undef CLEAR_ENTRY
+ std::for_each(list.begin(), list.end(),
+ [](EnumeratedHrtf &entry) noexcept -> void
+ { al_free(entry.name); }
+ );
+ list.clear();
}
struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry)
diff --git a/Alc/hrtf.h b/Alc/hrtf.h
index 71956691..a36e9738 100644
--- a/Alc/hrtf.h
+++ b/Alc/hrtf.h
@@ -6,12 +6,9 @@
#include "alMain.h"
#include "atomic.h"
+#include "vector.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
#define HRTF_HISTORY_BITS (6)
#define HRTF_HISTORY_LENGTH (1<<HRTF_HISTORY_BITS)
#define HRTF_HISTORY_MASK (HRTF_HISTORY_LENGTH-1)
@@ -68,8 +65,8 @@ struct AngularPoint {
void FreeHrtfs(void);
-vector_EnumeratedHrtf EnumerateHrtf(const char *devname);
-void FreeHrtfList(vector_EnumeratedHrtf *list);
+al::vector<EnumeratedHrtf> EnumerateHrtf(const char *devname);
+void FreeHrtfList(al::vector<EnumeratedHrtf> &list);
struct Hrtf *GetLoadedHrtf(struct HrtfEntry *entry);
void Hrtf_IncRef(struct Hrtf *hrtf);
void Hrtf_DecRef(struct Hrtf *hrtf);
@@ -84,8 +81,4 @@ void GetHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth,
*/
void BuildBFormatHrtf(const struct Hrtf *Hrtf, DirectHrtfState *state, ALsizei NumChannels, const struct AngularPoint *AmbiPoints, const ALfloat (*RESTRICT AmbiMatrix)[MAX_AMBI_COEFFS], ALsizei AmbiCount, const ALfloat *RESTRICT AmbiOrderHFGain);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
#endif /* ALC_HRTF_H */
diff --git a/Alc/panning.cpp b/Alc/panning.cpp
index 020d8237..d5c8bbdf 100644
--- a/Alc/panning.cpp
+++ b/Alc/panning.cpp
@@ -1104,33 +1104,30 @@ void aluInitRenderer(ALCdevice *device, ALint hrtf_id, enum HrtfRequestMode hrtf
device->HrtfStatus = ALC_HRTF_REQUIRED_SOFT;
}
- if(VECTOR_SIZE(device->HrtfList) == 0)
- {
- VECTOR_DEINIT(device->HrtfList);
+ if(device->HrtfList.empty())
device->HrtfList = EnumerateHrtf(device->DeviceName.c_str());
- }
- if(hrtf_id >= 0 && (size_t)hrtf_id < VECTOR_SIZE(device->HrtfList))
+ if(hrtf_id >= 0 && (size_t)hrtf_id < device->HrtfList.size())
{
- const EnumeratedHrtf *entry = &VECTOR_ELEM(device->HrtfList, hrtf_id);
- struct Hrtf *hrtf = GetLoadedHrtf(entry->hrtf);
+ const EnumeratedHrtf &entry = device->HrtfList[hrtf_id];
+ struct Hrtf *hrtf = GetLoadedHrtf(entry.hrtf);
if(hrtf && hrtf->sampleRate == device->Frequency)
{
device->HrtfHandle = hrtf;
- device->HrtfName = alstrdup(entry->name);
+ device->HrtfName = alstrdup(entry.name);
}
else if(hrtf)
Hrtf_DecRef(hrtf);
}
- for(i = 0;!device->HrtfHandle && i < VECTOR_SIZE(device->HrtfList);i++)
+ for(i = 0;!device->HrtfHandle && i < device->HrtfList.size();i++)
{
- const EnumeratedHrtf *entry = &VECTOR_ELEM(device->HrtfList, i);
- struct Hrtf *hrtf = GetLoadedHrtf(entry->hrtf);
+ const EnumeratedHrtf &entry = device->HrtfList[i];
+ struct Hrtf *hrtf = GetLoadedHrtf(entry.hrtf);
if(hrtf && hrtf->sampleRate == device->Frequency)
{
device->HrtfHandle = hrtf;
- device->HrtfName = alstrdup(entry->name);
+ device->HrtfName = alstrdup(entry.name);
}
else if(hrtf)
Hrtf_DecRef(hrtf);
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 66a7cfa3..11f9d7de 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -532,7 +532,6 @@ typedef struct EnumeratedHrtf {
struct HrtfEntry *hrtf;
} EnumeratedHrtf;
-TYPEDEF_VECTOR(EnumeratedHrtf, vector_EnumeratedHrtf)
/* Maximum delay in samples for speaker distance compensation. */
@@ -624,7 +623,7 @@ struct ALCdevice_struct {
struct DirectHrtfState *Hrtf{nullptr};
char *HrtfName{nullptr};
struct Hrtf *HrtfHandle{nullptr};
- vector_EnumeratedHrtf HrtfList{};
+ al::vector<EnumeratedHrtf> HrtfList;
ALCenum HrtfStatus{ALC_FALSE};
/* UHJ encoder state */