aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2017-03-31 23:22:06 -0700
committerChris Robinson <[email protected]>2017-03-31 23:22:06 -0700
commit5f245d5950ea7fd5938f72720f93ff5c5879eff6 (patch)
tree1c320e7eb77444d469b48d46360bcdf9edee30d5
parentaf833c855444d61521be9c115a8be0ac61fadedf (diff)
Avoid some unnecessary string reallocation
-rw-r--r--Alc/hrtf.c101
1 files changed, 50 insertions, 51 deletions
diff --git a/Alc/hrtf.c b/Alc/hrtf.c
index 0f4c53f6..2f6e9983 100644
--- a/Alc/hrtf.c
+++ b/Alc/hrtf.c
@@ -616,7 +616,7 @@ static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const_al_str
return Hrtf;
}
-static void AddFileEntry(vector_HrtfEntry *list, al_string *filename)
+static void AddFileEntry(vector_HrtfEntry *list, const_al_string filename)
{
HrtfEntry entry = { AL_STRING_INIT_STATIC(), NULL };
struct Hrtf *hrtf = NULL;
@@ -626,58 +626,58 @@ static void AddFileEntry(vector_HrtfEntry *list, al_string *filename)
const char *ext;
int i;
-#define MATCH_FNAME(i) (al_string_cmp_cstr(*filename, (i)->hrtf->filename) == 0)
+#define MATCH_FNAME(i) (al_string_cmp_cstr(filename, (i)->hrtf->filename) == 0)
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_FNAME);
if(iter != VECTOR_END(*list))
{
- TRACE("Skipping duplicate file entry %s\n", al_string_get_cstr(*filename));
- goto done;
+ TRACE("Skipping duplicate file entry %s\n", al_string_get_cstr(filename));
+ return;
}
#undef MATCH_FNAME
entry.hrtf = LoadedHrtfs;
while(entry.hrtf)
{
- if(al_string_cmp_cstr(*filename, entry.hrtf->filename) == 0)
+ if(al_string_cmp_cstr(filename, entry.hrtf->filename) == 0)
{
- TRACE("Skipping load of already-loaded file %s\n", al_string_get_cstr(*filename));
+ TRACE("Skipping load of already-loaded file %s\n", al_string_get_cstr(filename));
goto skip_load;
}
entry.hrtf = entry.hrtf->next;
}
- TRACE("Loading %s...\n", al_string_get_cstr(*filename));
- fmap = MapFileToMem(al_string_get_cstr(*filename));
+ TRACE("Loading %s...\n", al_string_get_cstr(filename));
+ fmap = MapFileToMem(al_string_get_cstr(filename));
if(fmap.ptr == NULL)
{
- ERR("Could not open %s\n", al_string_get_cstr(*filename));
- goto done;
+ ERR("Could not open %s\n", al_string_get_cstr(filename));
+ return;
}
if(fmap.len < sizeof(magicMarker01))
- ERR("%s data is too short ("SZFMT" bytes)\n", al_string_get_cstr(*filename), fmap.len);
+ ERR("%s data is too short ("SZFMT" bytes)\n", al_string_get_cstr(filename), fmap.len);
else if(memcmp(fmap.ptr, magicMarker01, sizeof(magicMarker01)) == 0)
{
TRACE("Detected data set format v1\n");
hrtf = LoadHrtf01((const ALubyte*)fmap.ptr+sizeof(magicMarker01),
- fmap.len-sizeof(magicMarker01), *filename
+ fmap.len-sizeof(magicMarker01), filename
);
}
else if(memcmp(fmap.ptr, magicMarker00, sizeof(magicMarker00)) == 0)
{
TRACE("Detected data set format v0\n");
hrtf = LoadHrtf00((const ALubyte*)fmap.ptr+sizeof(magicMarker00),
- fmap.len-sizeof(magicMarker00), *filename
+ fmap.len-sizeof(magicMarker00), filename
);
}
else
- ERR("Invalid header in %s: \"%.8s\"\n", al_string_get_cstr(*filename), (const char*)fmap.ptr);
+ ERR("Invalid header in %s: \"%.8s\"\n", al_string_get_cstr(filename), (const char*)fmap.ptr);
UnmapFileMem(&fmap);
if(!hrtf)
{
- ERR("Failed to load %s\n", al_string_get_cstr(*filename));
- goto done;
+ ERR("Failed to load %s\n", al_string_get_cstr(filename));
+ return;
}
hrtf->next = LoadedHrtfs;
@@ -689,9 +689,9 @@ static void AddFileEntry(vector_HrtfEntry *list, al_string *filename)
skip_load:
/* TODO: Get a human-readable name from the HRTF data (possibly coming in a
* format update). */
- name = strrchr(al_string_get_cstr(*filename), '/');
- if(!name) name = strrchr(al_string_get_cstr(*filename), '\\');
- if(!name) name = al_string_get_cstr(*filename);
+ name = strrchr(al_string_get_cstr(filename), '/');
+ if(!name) name = strrchr(al_string_get_cstr(filename), '\\');
+ if(!name) name = al_string_get_cstr(filename);
else ++name;
ext = strrchr(name, '.');
@@ -716,71 +716,68 @@ skip_load:
} while(iter != VECTOR_END(*list));
TRACE("Adding entry \"%s\" from file \"%s\"\n", al_string_get_cstr(entry.name),
- al_string_get_cstr(*filename));
+ al_string_get_cstr(filename));
VECTOR_PUSH_BACK(*list, entry);
-
-done:
- al_string_deinit(filename);
}
/* Unfortunate that we have to duplicate AddFileEntry to take a memory buffer
* for input instead of opening the given filename.
*/
-static void AddBuiltInEntry(vector_HrtfEntry *list, const ALubyte *data, size_t datalen, al_string *filename)
+static void AddBuiltInEntry(vector_HrtfEntry *list, const ALubyte *data, size_t datalen, const_al_string filename)
{
HrtfEntry entry = { AL_STRING_INIT_STATIC(), NULL };
struct Hrtf *hrtf = NULL;
const HrtfEntry *iter;
int i;
-#define MATCH_FNAME(i) (al_string_cmp_cstr(*filename, (i)->hrtf->filename) == 0)
+#define MATCH_FNAME(i) (al_string_cmp_cstr(filename, (i)->hrtf->filename) == 0)
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_FNAME);
if(iter != VECTOR_END(*list))
{
- TRACE("Skipping duplicate file entry %s\n", al_string_get_cstr(*filename));
- goto done;
+ TRACE("Skipping duplicate file entry %s\n", al_string_get_cstr(filename));
+ return;
}
#undef MATCH_FNAME
entry.hrtf = LoadedHrtfs;
while(entry.hrtf)
{
- if(al_string_cmp_cstr(*filename, entry.hrtf->filename) == 0)
+ if(al_string_cmp_cstr(filename, entry.hrtf->filename) == 0)
{
- TRACE("Skipping load of already-loaded file %s\n", al_string_get_cstr(*filename));
+ TRACE("Skipping load of already-loaded file %s\n", al_string_get_cstr(filename));
goto skip_load;
}
entry.hrtf = entry.hrtf->next;
}
- TRACE("Loading %s...\n", al_string_get_cstr(*filename));
+ TRACE("Loading %s...\n", al_string_get_cstr(filename));
if(datalen < sizeof(magicMarker01))
{
- ERR("%s data is too short ("SZFMT" bytes)\n", al_string_get_cstr(*filename), datalen);
- goto done;
+ ERR("%s data is too short ("SZFMT" bytes)\n", al_string_get_cstr(filename), datalen);
+ return;
}
if(memcmp(data, magicMarker01, sizeof(magicMarker01)) == 0)
{
TRACE("Detected data set format v1\n");
hrtf = LoadHrtf01(data+sizeof(magicMarker01),
- datalen-sizeof(magicMarker01), *filename
+ datalen-sizeof(magicMarker01), filename
);
}
else if(memcmp(data, magicMarker00, sizeof(magicMarker00)) == 0)
{
TRACE("Detected data set format v0\n");
hrtf = LoadHrtf00(data+sizeof(magicMarker00),
- datalen-sizeof(magicMarker00), *filename
+ datalen-sizeof(magicMarker00), filename
);
}
else
- ERR("Invalid header in %s: \"%.8s\"\n", al_string_get_cstr(*filename), data);
+ ERR("Invalid header in %s: \"%.8s\"\n", al_string_get_cstr(filename), data);
if(!hrtf)
{
- ERR("Failed to load %s\n", al_string_get_cstr(*filename));
- goto done;
+ ERR("Failed to load %s\n", al_string_get_cstr(filename));
+ return;
}
hrtf->next = LoadedHrtfs;
@@ -792,7 +789,7 @@ static void AddBuiltInEntry(vector_HrtfEntry *list, const ALubyte *data, size_t
skip_load:
i = 0;
do {
- al_string_copy(&entry.name, *filename);
+ al_string_copy(&entry.name, filename);
if(i != 0)
{
char str[64];
@@ -808,9 +805,6 @@ skip_load:
TRACE("Adding built-in entry \"%s\"\n", al_string_get_cstr(entry.name));
VECTOR_PUSH_BACK(*list, entry);
-
-done:
- al_string_deinit(filename);
}
@@ -917,6 +911,7 @@ vector_HrtfEntry EnumerateHrtf(const_al_string devname)
if(ConfigValueStr(al_string_get_cstr(devname), NULL, "hrtf-paths", &pathlist))
{
+ al_string pname = AL_STRING_INIT_STATIC();
while(pathlist && *pathlist)
{
const char *next, *end;
@@ -939,49 +934,53 @@ vector_HrtfEntry EnumerateHrtf(const_al_string devname)
--end;
if(end != pathlist)
{
- al_string pname = AL_STRING_INIT_STATIC();
vector_al_string flist;
+ size_t i;
al_string_append_range(&pname, pathlist, end);
flist = SearchDataFiles(".mhr", al_string_get_cstr(pname));
- VECTOR_FOR_EACH_PARAMS(al_string, flist, AddFileEntry, &list);
+ for(i = 0;i < VECTOR_SIZE(flist);i++)
+ AddFileEntry(&list, VECTOR_ELEM(flist, i));
+ VECTOR_FOR_EACH(al_string, flist, al_string_deinit);
VECTOR_DEINIT(flist);
-
- al_string_deinit(&pname);
}
pathlist = next;
}
+
+ al_string_deinit(&pname);
}
else if(ConfigValueExists(al_string_get_cstr(devname), NULL, "hrtf_tables"))
ERR("The hrtf_tables option is deprecated, please use hrtf-paths instead.\n");
if(usedefaults)
{
+ al_string ename = AL_STRING_INIT_STATIC();
vector_al_string flist;
const ALubyte *rdata;
- size_t rsize;
+ size_t rsize, i;
flist = SearchDataFiles(".mhr", "openal/hrtf");
- VECTOR_FOR_EACH_PARAMS(al_string, flist, AddFileEntry, &list);
+ for(i = 0;i < VECTOR_SIZE(flist);i++)
+ AddFileEntry(&list, VECTOR_ELEM(flist, i));
+ VECTOR_FOR_EACH(al_string, flist, al_string_deinit);
VECTOR_DEINIT(flist);
rdata = GetResource(IDR_DEFAULT_44100_MHR, &rsize);
if(rdata != NULL && rsize > 0)
{
- al_string ename = AL_STRING_INIT_STATIC();
al_string_copy_cstr(&ename, "Built-In 44100hz");
- AddBuiltInEntry(&list, rdata, rsize, &ename);
+ AddBuiltInEntry(&list, rdata, rsize, ename);
}
rdata = GetResource(IDR_DEFAULT_48000_MHR, &rsize);
if(rdata != NULL && rsize > 0)
{
- al_string ename = AL_STRING_INIT_STATIC();
al_string_copy_cstr(&ename, "Built-In 48000hz");
- AddBuiltInEntry(&list, rdata, rsize, &ename);
+ AddBuiltInEntry(&list, rdata, rsize, ename);
}
+ al_string_deinit(&ename);
}
if(VECTOR_SIZE(list) > 1 && ConfigValueStr(al_string_get_cstr(devname), NULL, "default-hrtf", &defaulthrtf))