Store the HRTF's filename separate from the entry storage
This commit is contained in:
parent
26144ca9df
commit
e7ca61e8b5
117
Alc/hrtf.c
117
Alc/hrtf.c
@ -53,7 +53,11 @@ static const ALchar magicMarker01[8] = "MinPHR01";
|
|||||||
* directional sounds. */
|
* directional sounds. */
|
||||||
static const ALfloat PassthruCoeff = 0.707106781187f/*sqrt(0.5)*/;
|
static const ALfloat PassthruCoeff = 0.707106781187f/*sqrt(0.5)*/;
|
||||||
|
|
||||||
static struct Hrtf *LoadedHrtfs = NULL;
|
static struct LoadedHrtfEntry {
|
||||||
|
struct LoadedHrtfEntry *next;
|
||||||
|
struct Hrtf *hrtf;
|
||||||
|
char filename[];
|
||||||
|
} *LoadedHrtfs = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* Calculate the elevation index given the polar elevation in radians. This
|
/* Calculate the elevation index given the polar elevation in radians. This
|
||||||
@ -252,11 +256,10 @@ static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount
|
|||||||
total = RoundUp(total, sizeof(ALfloat)); /* Align for float fields */
|
total = RoundUp(total, sizeof(ALfloat)); /* Align for float fields */
|
||||||
total += sizeof(Hrtf->coeffs[0])*irSize*irCount;
|
total += sizeof(Hrtf->coeffs[0])*irSize*irCount;
|
||||||
total += sizeof(Hrtf->delays[0])*irCount;
|
total += sizeof(Hrtf->delays[0])*irCount;
|
||||||
total += alstr_length(filename)+1;
|
|
||||||
|
|
||||||
Hrtf = al_calloc(16, total);
|
Hrtf = al_calloc(16, total);
|
||||||
if(Hrtf == NULL)
|
if(Hrtf == NULL)
|
||||||
ERR("Out of memory.\n");
|
ERR("Out of memory allocating storage for %s.\n", alstr_get_cstr(filename));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uintptr_t offset = sizeof(struct Hrtf);
|
uintptr_t offset = sizeof(struct Hrtf);
|
||||||
@ -265,7 +268,6 @@ static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount
|
|||||||
ALubyte *_azCount;
|
ALubyte *_azCount;
|
||||||
ALubyte *_delays;
|
ALubyte *_delays;
|
||||||
ALfloat *_coeffs;
|
ALfloat *_coeffs;
|
||||||
char *_name;
|
|
||||||
ALsizei i;
|
ALsizei i;
|
||||||
|
|
||||||
Hrtf->sampleRate = rate;
|
Hrtf->sampleRate = rate;
|
||||||
@ -287,20 +289,12 @@ static struct Hrtf *CreateHrtfStore(ALuint rate, ALsizei irSize, ALsizei evCount
|
|||||||
_delays = (ALubyte*)(base + offset); Hrtf->delays = _delays;
|
_delays = (ALubyte*)(base + offset); Hrtf->delays = _delays;
|
||||||
offset += sizeof(_delays[0])*irCount;
|
offset += sizeof(_delays[0])*irCount;
|
||||||
|
|
||||||
_name = (char*)(base + offset); Hrtf->filename = _name;
|
|
||||||
offset += sizeof(_name[0])*(alstr_length(filename)+1);
|
|
||||||
|
|
||||||
Hrtf->next = NULL;
|
|
||||||
|
|
||||||
/* Copy input data to storage. */
|
/* Copy input data to storage. */
|
||||||
for(i = 0;i < evCount;i++) _azCount[i] = azCount[i];
|
for(i = 0;i < evCount;i++) _azCount[i] = azCount[i];
|
||||||
for(i = 0;i < evCount;i++) _evOffset[i] = evOffset[i];
|
for(i = 0;i < evCount;i++) _evOffset[i] = evOffset[i];
|
||||||
for(i = 0;i < irSize*irCount;i++)
|
for(i = 0;i < irSize*irCount;i++)
|
||||||
_coeffs[i] = coeffs[i] / 32768.0f;
|
_coeffs[i] = coeffs[i] / 32768.0f;
|
||||||
for(i = 0;i < irCount;i++) _delays[i] = delays[i];
|
for(i = 0;i < irCount;i++) _delays[i] = delays[i];
|
||||||
for(i = 0;i < (ALsizei)alstr_length(filename);i++)
|
|
||||||
_name[i] = VECTOR_ELEM(filename, i);
|
|
||||||
_name[i] = '\0';
|
|
||||||
|
|
||||||
assert(offset == total);
|
assert(offset == total);
|
||||||
}
|
}
|
||||||
@ -619,6 +613,7 @@ static struct Hrtf *LoadHrtf01(const ALubyte *data, size_t datalen, const_al_str
|
|||||||
static void AddFileEntry(vector_HrtfEntry *list, const_al_string filename)
|
static void AddFileEntry(vector_HrtfEntry *list, const_al_string filename)
|
||||||
{
|
{
|
||||||
HrtfEntry entry = { AL_STRING_INIT_STATIC(), NULL };
|
HrtfEntry entry = { AL_STRING_INIT_STATIC(), NULL };
|
||||||
|
struct LoadedHrtfEntry *loaded_entry;
|
||||||
struct Hrtf *hrtf = NULL;
|
struct Hrtf *hrtf = NULL;
|
||||||
const HrtfEntry *iter;
|
const HrtfEntry *iter;
|
||||||
struct FileMapping fmap;
|
struct FileMapping fmap;
|
||||||
@ -626,24 +621,27 @@ static void AddFileEntry(vector_HrtfEntry *list, const_al_string filename)
|
|||||||
const char *ext;
|
const char *ext;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define MATCH_FNAME(i) (alstr_cmp_cstr(filename, (i)->hrtf->filename) == 0)
|
/* Check if this file has already been loaded globally. */
|
||||||
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_FNAME);
|
loaded_entry = LoadedHrtfs;
|
||||||
if(iter != VECTOR_END(*list))
|
while(loaded_entry)
|
||||||
{
|
{
|
||||||
TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename));
|
if(alstr_cmp_cstr(filename, loaded_entry->filename) == 0)
|
||||||
return;
|
{
|
||||||
}
|
/* Check if this entry has already been added to the list. */
|
||||||
|
#define MATCH_ENTRY(i) (loaded_entry->hrtf == (i)->hrtf)
|
||||||
|
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_ENTRY);
|
||||||
|
if(iter != VECTOR_END(*list))
|
||||||
|
{
|
||||||
|
TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename));
|
||||||
|
return;
|
||||||
|
}
|
||||||
#undef MATCH_FNAME
|
#undef MATCH_FNAME
|
||||||
|
|
||||||
entry.hrtf = LoadedHrtfs;
|
|
||||||
while(entry.hrtf)
|
|
||||||
{
|
|
||||||
if(alstr_cmp_cstr(filename, entry.hrtf->filename) == 0)
|
|
||||||
{
|
|
||||||
TRACE("Skipping load of already-loaded file %s\n", alstr_get_cstr(filename));
|
TRACE("Skipping load of already-loaded file %s\n", alstr_get_cstr(filename));
|
||||||
|
hrtf = loaded_entry->hrtf;
|
||||||
goto skip_load;
|
goto skip_load;
|
||||||
}
|
}
|
||||||
entry.hrtf = entry.hrtf->next;
|
loaded_entry = loaded_entry->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Loading %s...\n", alstr_get_cstr(filename));
|
TRACE("Loading %s...\n", alstr_get_cstr(filename));
|
||||||
@ -680,11 +678,16 @@ static void AddFileEntry(vector_HrtfEntry *list, const_al_string filename)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hrtf->next = LoadedHrtfs;
|
loaded_entry = al_calloc(DEF_ALIGN,
|
||||||
LoadedHrtfs = hrtf;
|
offsetof(struct LoadedHrtfEntry, filename[alstr_length(filename)+1])
|
||||||
|
);
|
||||||
|
loaded_entry->next = LoadedHrtfs;
|
||||||
|
loaded_entry->hrtf = hrtf;
|
||||||
|
strcpy(loaded_entry->filename, alstr_get_cstr(filename));
|
||||||
|
LoadedHrtfs = loaded_entry;
|
||||||
|
|
||||||
TRACE("Loaded HRTF support for format: %s %uhz\n",
|
TRACE("Loaded HRTF support for format: %s %uhz\n",
|
||||||
DevFmtChannelsString(DevFmtStereo), hrtf->sampleRate);
|
DevFmtChannelsString(DevFmtStereo), hrtf->sampleRate);
|
||||||
entry.hrtf = hrtf;
|
|
||||||
|
|
||||||
skip_load:
|
skip_load:
|
||||||
/* TODO: Get a human-readable name from the HRTF data (possibly coming in a
|
/* TODO: Get a human-readable name from the HRTF data (possibly coming in a
|
||||||
@ -714,6 +717,7 @@ skip_load:
|
|||||||
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_NAME);
|
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_NAME);
|
||||||
#undef MATCH_NAME
|
#undef MATCH_NAME
|
||||||
} while(iter != VECTOR_END(*list));
|
} while(iter != VECTOR_END(*list));
|
||||||
|
entry.hrtf = hrtf;
|
||||||
|
|
||||||
TRACE("Adding entry \"%s\" from file \"%s\"\n", alstr_get_cstr(entry.name),
|
TRACE("Adding entry \"%s\" from file \"%s\"\n", alstr_get_cstr(entry.name),
|
||||||
alstr_get_cstr(filename));
|
alstr_get_cstr(filename));
|
||||||
@ -726,28 +730,32 @@ skip_load:
|
|||||||
static void AddBuiltInEntry(vector_HrtfEntry *list, const ALubyte *data, size_t datalen, const_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 };
|
HrtfEntry entry = { AL_STRING_INIT_STATIC(), NULL };
|
||||||
|
struct LoadedHrtfEntry *loaded_entry;
|
||||||
struct Hrtf *hrtf = NULL;
|
struct Hrtf *hrtf = NULL;
|
||||||
const HrtfEntry *iter;
|
const HrtfEntry *iter;
|
||||||
|
const char *name;
|
||||||
|
const char *ext;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#define MATCH_FNAME(i) (alstr_cmp_cstr(filename, (i)->hrtf->filename) == 0)
|
loaded_entry = LoadedHrtfs;
|
||||||
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_FNAME);
|
while(loaded_entry)
|
||||||
if(iter != VECTOR_END(*list))
|
|
||||||
{
|
{
|
||||||
TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename));
|
if(alstr_cmp_cstr(filename, loaded_entry->filename) == 0)
|
||||||
return;
|
{
|
||||||
}
|
#define MATCH_ENTRY(i) (loaded_entry->hrtf == (i)->hrtf)
|
||||||
|
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_ENTRY);
|
||||||
|
if(iter != VECTOR_END(*list))
|
||||||
|
{
|
||||||
|
TRACE("Skipping duplicate file entry %s\n", alstr_get_cstr(filename));
|
||||||
|
return;
|
||||||
|
}
|
||||||
#undef MATCH_FNAME
|
#undef MATCH_FNAME
|
||||||
|
|
||||||
entry.hrtf = LoadedHrtfs;
|
|
||||||
while(entry.hrtf)
|
|
||||||
{
|
|
||||||
if(alstr_cmp_cstr(filename, entry.hrtf->filename) == 0)
|
|
||||||
{
|
|
||||||
TRACE("Skipping load of already-loaded file %s\n", alstr_get_cstr(filename));
|
TRACE("Skipping load of already-loaded file %s\n", alstr_get_cstr(filename));
|
||||||
|
hrtf = loaded_entry->hrtf;
|
||||||
goto skip_load;
|
goto skip_load;
|
||||||
}
|
}
|
||||||
entry.hrtf = entry.hrtf->next;
|
loaded_entry = loaded_entry->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Loading %s...\n", alstr_get_cstr(filename));
|
TRACE("Loading %s...\n", alstr_get_cstr(filename));
|
||||||
@ -780,16 +788,33 @@ static void AddBuiltInEntry(vector_HrtfEntry *list, const ALubyte *data, size_t
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hrtf->next = LoadedHrtfs;
|
loaded_entry = al_calloc(DEF_ALIGN,
|
||||||
LoadedHrtfs = hrtf;
|
offsetof(struct LoadedHrtfEntry, filename[alstr_length(filename)+1])
|
||||||
|
);
|
||||||
|
loaded_entry->next = LoadedHrtfs;
|
||||||
|
loaded_entry->hrtf = hrtf;
|
||||||
|
strcpy(loaded_entry->filename, alstr_get_cstr(filename));
|
||||||
|
LoadedHrtfs = loaded_entry;
|
||||||
|
|
||||||
TRACE("Loaded HRTF support for format: %s %uhz\n",
|
TRACE("Loaded HRTF support for format: %s %uhz\n",
|
||||||
DevFmtChannelsString(DevFmtStereo), hrtf->sampleRate);
|
DevFmtChannelsString(DevFmtStereo), hrtf->sampleRate);
|
||||||
entry.hrtf = hrtf;
|
|
||||||
|
|
||||||
skip_load:
|
skip_load:
|
||||||
|
/* TODO: Get a human-readable name from the HRTF data (possibly coming in a
|
||||||
|
* format update). */
|
||||||
|
name = strrchr(alstr_get_cstr(filename), '/');
|
||||||
|
if(!name) name = strrchr(alstr_get_cstr(filename), '\\');
|
||||||
|
if(!name) name = alstr_get_cstr(filename);
|
||||||
|
else ++name;
|
||||||
|
|
||||||
|
ext = strrchr(name, '.');
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
do {
|
do {
|
||||||
alstr_copy(&entry.name, filename);
|
if(!ext)
|
||||||
|
alstr_copy_cstr(&entry.name, name);
|
||||||
|
else
|
||||||
|
alstr_copy_range(&entry.name, name, ext);
|
||||||
if(i != 0)
|
if(i != 0)
|
||||||
{
|
{
|
||||||
char str[64];
|
char str[64];
|
||||||
@ -802,6 +827,7 @@ skip_load:
|
|||||||
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_NAME);
|
VECTOR_FIND_IF(iter, const HrtfEntry, *list, MATCH_NAME);
|
||||||
#undef MATCH_NAME
|
#undef MATCH_NAME
|
||||||
} while(iter != VECTOR_END(*list));
|
} while(iter != VECTOR_END(*list));
|
||||||
|
entry.hrtf = hrtf;
|
||||||
|
|
||||||
TRACE("Adding built-in entry \"%s\"\n", alstr_get_cstr(entry.name));
|
TRACE("Adding built-in entry \"%s\"\n", alstr_get_cstr(entry.name));
|
||||||
VECTOR_PUSH_BACK(*list, entry);
|
VECTOR_PUSH_BACK(*list, entry);
|
||||||
@ -1015,12 +1041,13 @@ void FreeHrtfList(vector_HrtfEntry *list)
|
|||||||
|
|
||||||
void FreeHrtfs(void)
|
void FreeHrtfs(void)
|
||||||
{
|
{
|
||||||
struct Hrtf *Hrtf = LoadedHrtfs;
|
struct LoadedHrtfEntry *Hrtf = LoadedHrtfs;
|
||||||
LoadedHrtfs = NULL;
|
LoadedHrtfs = NULL;
|
||||||
|
|
||||||
while(Hrtf != NULL)
|
while(Hrtf != NULL)
|
||||||
{
|
{
|
||||||
struct Hrtf *next = Hrtf->next;
|
struct LoadedHrtfEntry *next = Hrtf->next;
|
||||||
|
al_free(Hrtf->hrtf);
|
||||||
al_free(Hrtf);
|
al_free(Hrtf);
|
||||||
Hrtf = next;
|
Hrtf = next;
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,6 @@ struct Hrtf {
|
|||||||
const ALushort *evOffset;
|
const ALushort *evOffset;
|
||||||
const ALfloat *coeffs;
|
const ALfloat *coeffs;
|
||||||
const ALubyte *delays;
|
const ALubyte *delays;
|
||||||
|
|
||||||
const char *filename;
|
|
||||||
struct Hrtf *next;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HRTFDELAY_BITS (20)
|
#define HRTFDELAY_BITS (20)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user