Switch audio to hash table implementation
This commit is contained in:
parent
f6943e5efb
commit
5cccd3ebe8
@ -231,8 +231,9 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
|
||||
* Animation Asset Managing
|
||||
*********************************
|
||||
*/
|
||||
INTERNAL Animation *getFreeAnimationSlot(AssetManager *assetManager,
|
||||
MemoryArena *arena, char *key)
|
||||
INTERNAL Animation *getFreeAnimationSlot(AssetManager *const assetManager,
|
||||
MemoryArena *const arena,
|
||||
const char *const key)
|
||||
{
|
||||
HashTableEntry *entry = getFreeHashSlot(&assetManager->anims, arena, key);
|
||||
|
||||
@ -248,9 +249,11 @@ INTERNAL Animation *getFreeAnimationSlot(AssetManager *assetManager,
|
||||
}
|
||||
}
|
||||
|
||||
void asset_addAnimation(AssetManager *assetManager, MemoryArena *arena,
|
||||
char *animName, TexAtlas *atlas, char **subTextureNames,
|
||||
i32 numSubTextures, f32 frameDuration)
|
||||
void asset_addAnimation(AssetManager *const assetManager,
|
||||
MemoryArena *const arena, const char *const animName,
|
||||
TexAtlas *const atlas,
|
||||
char **const subTextureNames,
|
||||
const i32 numSubTextures, const f32 frameDuration)
|
||||
{
|
||||
Animation *anim = getFreeAnimationSlot(assetManager, arena, animName);
|
||||
|
||||
@ -307,8 +310,10 @@ typedef struct XmlToken
|
||||
i32 len;
|
||||
} XmlToken;
|
||||
|
||||
INTERNAL XmlToken *tokeniseXmlBuffer(MemoryArena *arena, char *buffer,
|
||||
i32 bufferSize, int *numTokens)
|
||||
INTERNAL XmlToken *const tokeniseXmlBuffer(MemoryArena *const arena,
|
||||
const char *const buffer,
|
||||
const i32 bufferSize,
|
||||
int *const numTokens)
|
||||
{
|
||||
XmlToken *xmlTokens = PLATFORM_MEM_ALLOC(arena, 8192, XmlToken);
|
||||
i32 tokenIndex = 0;
|
||||
@ -412,8 +417,9 @@ INTERNAL XmlToken *tokeniseXmlBuffer(MemoryArena *arena, char *buffer,
|
||||
return xmlTokens;
|
||||
}
|
||||
|
||||
INTERNAL XmlNode *buildXmlTree(MemoryArena *arena, XmlToken *xmlTokens,
|
||||
i32 numTokens)
|
||||
INTERNAL XmlNode *const buildXmlTree(MemoryArena *const arena,
|
||||
XmlToken *const xmlTokens,
|
||||
const i32 numTokens)
|
||||
{
|
||||
XmlNode *root = PLATFORM_MEM_ALLOC(arena, 1, XmlNode);
|
||||
if (!root) return NULL;
|
||||
@ -732,7 +738,8 @@ INTERNAL void parseXmlTreeToGame(AssetManager *assetManager, MemoryArena *arena,
|
||||
}
|
||||
}
|
||||
|
||||
INTERNAL void recursiveFreeXmlTree(MemoryArena *arena, XmlNode *node)
|
||||
INTERNAL void recursiveFreeXmlTree(MemoryArena *const arena,
|
||||
XmlNode *node)
|
||||
{
|
||||
if (!node)
|
||||
{
|
||||
@ -759,11 +766,12 @@ INTERNAL void recursiveFreeXmlTree(MemoryArena *arena, XmlNode *node)
|
||||
node->name = NULL;
|
||||
node->isClosed = FALSE;
|
||||
PLATFORM_MEM_FREE(arena, node, sizeof(XmlNode));
|
||||
node = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
INTERNAL void freeXmlData(MemoryArena *arena, XmlToken *tokens, i32 numTokens,
|
||||
XmlNode *tree)
|
||||
INTERNAL void freeXmlData(MemoryArena *const arena, XmlToken *tokens,
|
||||
const i32 numTokens, XmlNode *tree)
|
||||
{
|
||||
if (tree) recursiveFreeXmlTree(arena, tree);
|
||||
if (tokens) PLATFORM_MEM_FREE(arena, tokens, numTokens * sizeof(XmlToken));
|
||||
@ -774,8 +782,9 @@ INTERNAL void freeXmlData(MemoryArena *arena, XmlToken *tokens, i32 numTokens,
|
||||
* Everything else
|
||||
*********************************
|
||||
*/
|
||||
i32 asset_loadXmlFile(AssetManager *assetManager, MemoryArena *arena,
|
||||
PlatformFileRead *fileRead)
|
||||
const i32 asset_loadXmlFile(AssetManager *const assetManager,
|
||||
MemoryArena *const arena,
|
||||
const PlatformFileRead *const fileRead)
|
||||
{
|
||||
i32 result = 0;
|
||||
/* Tokenise buffer */
|
||||
@ -802,49 +811,49 @@ i32 asset_loadXmlFile(AssetManager *assetManager, MemoryArena *arena,
|
||||
return result;
|
||||
}
|
||||
|
||||
// TODO(doyle): Switch to hash based lookup
|
||||
// TODO(doyle): Use pointers, so we can forward declare all assets?
|
||||
AudioVorbis *asset_getVorbis(AssetManager *assetManager,
|
||||
const enum AudioList type)
|
||||
AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
|
||||
const char *const key)
|
||||
{
|
||||
if (type < audiolist_count)
|
||||
return &assetManager->audio[type];
|
||||
|
||||
#ifdef DENGINE_DEBUG
|
||||
ASSERT(INVALID_CODE_PATH);
|
||||
#endif
|
||||
HashTableEntry *entry = getEntryFromHash(&assetManager->audio, key);
|
||||
|
||||
return NULL;
|
||||
AudioVorbis *result = NULL;
|
||||
if (entry) result = CAST(AudioVorbis *)entry->data;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
|
||||
const char *const path, const enum AudioList type)
|
||||
const char *const path, const char *const key)
|
||||
{
|
||||
HashTableEntry *entry = getFreeHashSlot(&assetManager->audio, arena, key);
|
||||
if (!entry) return -1;
|
||||
|
||||
// TODO(doyle): Remember to free vorbis file if we remove from memory
|
||||
PlatformFileRead fileRead = {0};
|
||||
platform_readFileToBuffer(arena, path, &fileRead);
|
||||
|
||||
entry->data = PLATFORM_MEM_ALLOC(arena, 1, AudioVorbis);
|
||||
|
||||
i32 error;
|
||||
AudioVorbis audio = {0};
|
||||
audio.type = type;
|
||||
audio.file =
|
||||
AudioVorbis *audio = CAST(AudioVorbis *) entry->data;
|
||||
audio->file =
|
||||
stb_vorbis_open_memory(fileRead.buffer, fileRead.size, &error, NULL);
|
||||
|
||||
if (!audio.file)
|
||||
if (!audio->file)
|
||||
{
|
||||
printf("stb_vorbis_open_memory() failed: Error code %d\n", error);
|
||||
platform_closeFileRead(arena, &fileRead);
|
||||
stb_vorbis_close(audio.file);
|
||||
stb_vorbis_close(audio->file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
audio.info = stb_vorbis_get_info(audio.file);
|
||||
audio.lengthInSamples = stb_vorbis_stream_length_in_samples(audio.file);
|
||||
audio.lengthInSeconds = stb_vorbis_stream_length_in_seconds(audio.file);
|
||||
audio.data = CAST(u8 *) fileRead.buffer;
|
||||
audio.size = fileRead.size;
|
||||
|
||||
assetManager->audio[type] = audio;
|
||||
audio->name = entry->key;
|
||||
audio->info = stb_vorbis_get_info(audio->file);
|
||||
audio->lengthInSamples = stb_vorbis_stream_length_in_samples(audio->file);
|
||||
audio->lengthInSeconds = stb_vorbis_stream_length_in_seconds(audio->file);
|
||||
audio->data = CAST(u8 *) fileRead.buffer;
|
||||
audio->size = fileRead.size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -902,7 +911,8 @@ INTERNAL i32 shaderLoadProgram(Shader *const shader, const GLuint vertexShader,
|
||||
return 0;
|
||||
}
|
||||
|
||||
Shader *asset_getShader(AssetManager *assetManager, const enum ShaderList type)
|
||||
Shader *const asset_getShader(AssetManager *assetManager,
|
||||
const enum ShaderList type)
|
||||
{
|
||||
if (type < shaderlist_count)
|
||||
return &assetManager->shaders[type];
|
||||
@ -1202,7 +1212,8 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
|
||||
return 0;
|
||||
}
|
||||
|
||||
v2 asset_stringDimInPixels(const Font *const font, const char *const string)
|
||||
const v2 asset_stringDimInPixels(const Font *const font,
|
||||
const char *const string)
|
||||
{
|
||||
v2 stringDim = V2(0, 0);
|
||||
for (i32 i = 0; i < common_strlen(string); i++)
|
||||
|
@ -296,13 +296,7 @@ const i32 audio_streamPlayVorbis(MemoryArena *arena, AudioManager *audioManager,
|
||||
// simultaneously, we need unique file pointers into the data to track song
|
||||
// position uniquely
|
||||
AudioVorbis *copyAudio = PLATFORM_MEM_ALLOC(arena, 1, AudioVorbis);
|
||||
copyAudio->type = vorbis->type;
|
||||
copyAudio->info = vorbis->info;
|
||||
copyAudio->lengthInSamples = vorbis->lengthInSamples;
|
||||
copyAudio->lengthInSeconds = vorbis->lengthInSeconds;
|
||||
|
||||
copyAudio->data = vorbis->data;
|
||||
copyAudio->size = vorbis->size;
|
||||
*copyAudio = *vorbis;
|
||||
|
||||
i32 error;
|
||||
copyAudio->file =
|
||||
|
@ -114,7 +114,12 @@ INTERNAL void rendererInit(GameState *state, v2 windowSize)
|
||||
INTERNAL void assetInit(GameState *state)
|
||||
{
|
||||
AssetManager *assetManager = &state->assetManager;
|
||||
MemoryArena *arena = &state->arena;
|
||||
MemoryArena *arena = &state->arena;
|
||||
|
||||
i32 audioEntries = 32;
|
||||
assetManager->audio.size = audioEntries;
|
||||
assetManager->audio.entries =
|
||||
PLATFORM_MEM_ALLOC(arena, audioEntries, HashTableEntry);
|
||||
|
||||
i32 texAtlasEntries = 8;
|
||||
assetManager->texAtlas.size = texAtlasEntries;
|
||||
@ -280,11 +285,11 @@ INTERNAL void assetInit(GameState *state)
|
||||
|
||||
char *audioPath =
|
||||
"data/audio/Motoi Sakuraba - Stab the sword of justice.ogg";
|
||||
asset_loadVorbis(assetManager, arena, audioPath, audiolist_battle);
|
||||
asset_loadVorbis(assetManager, arena, audioPath, "audio_battle");
|
||||
audioPath = "data/audio/Motoi Sakuraba - Field of Exper.ogg";
|
||||
asset_loadVorbis(assetManager, arena, audioPath, audiolist_overworld);
|
||||
asset_loadVorbis(assetManager, arena, audioPath, "audio_overworld");
|
||||
audioPath = "data/audio/nuindependent_hit22.ogg";
|
||||
asset_loadVorbis(assetManager, arena, audioPath, audiolist_tackle);
|
||||
asset_loadVorbis(assetManager, arena, audioPath, "audio_tackle");
|
||||
|
||||
#ifdef DENGINE_DEBUG
|
||||
DEBUG_LOG("Sound assets initialised");
|
||||
@ -1160,10 +1165,11 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||
if (world->numEntitiesInBattle > 0)
|
||||
{
|
||||
AudioVorbis *battleTheme =
|
||||
asset_getVorbis(assetManager, audiolist_battle);
|
||||
asset_getVorbis(assetManager, "audio_battle");
|
||||
if (audioRenderer->audio)
|
||||
{
|
||||
if (audioRenderer->audio->type != audiolist_battle)
|
||||
if (common_strcmp(audioRenderer->audio->key,
|
||||
"audio_battle") != 0)
|
||||
{
|
||||
audio_streamPlayVorbis(arena, &state->audioManager,
|
||||
audioRenderer, battleTheme,
|
||||
@ -1180,10 +1186,11 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||
else
|
||||
{
|
||||
AudioVorbis *overworldTheme =
|
||||
asset_getVorbis(assetManager, audiolist_overworld);
|
||||
asset_getVorbis(assetManager, "audio_overworld");
|
||||
if (audioRenderer->audio)
|
||||
{
|
||||
if (audioRenderer->audio->type != audiolist_overworld)
|
||||
if (common_strcmp(audioRenderer->audio->key,
|
||||
"audio_overworld") != 0)
|
||||
{
|
||||
audio_streamPlayVorbis(
|
||||
arena, &state->audioManager, audioRenderer,
|
||||
@ -1484,7 +1491,7 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt)
|
||||
Entity *defender = attackSpec->defender;
|
||||
|
||||
audio_playVorbis(arena, audioManager, attacker->audioRenderer,
|
||||
asset_getVorbis(assetManager, audiolist_tackle),
|
||||
asset_getVorbis(assetManager, "audio_tackle"),
|
||||
1);
|
||||
|
||||
/* Get first free string position and store the damage str data */
|
||||
|
@ -15,10 +15,10 @@ typedef struct AssetManager
|
||||
HashTable texAtlas;
|
||||
HashTable textures;
|
||||
HashTable anims;
|
||||
HashTable audio;
|
||||
|
||||
/* Primitive Array */
|
||||
Shader shaders[32];
|
||||
AudioVorbis audio[32];
|
||||
Shader shaders[2];
|
||||
Font font;
|
||||
} AssetManager;
|
||||
|
||||
@ -45,26 +45,33 @@ Texture *asset_loadTextureImage(AssetManager *assetManager, MemoryArena *arena,
|
||||
* Animation Asset Managing
|
||||
*********************************
|
||||
*/
|
||||
void asset_addAnimation(AssetManager *assetManager, MemoryArena *arena,
|
||||
char *animName, TexAtlas *atlas, char **subTextureNames,
|
||||
i32 numSubTextures, f32 frameDuration);
|
||||
void asset_addAnimation(AssetManager *const assetManager,
|
||||
MemoryArena *const arena, const char *const animName,
|
||||
TexAtlas *const atlas, char **const subTextureNames,
|
||||
const i32 numSubTextures, const f32 frameDuration);
|
||||
Animation *asset_getAnim(AssetManager *const assetManager,
|
||||
const char *const key);
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Audio
|
||||
*********************************
|
||||
*/
|
||||
AudioVorbis *const asset_getVorbis(AssetManager *const assetManager,
|
||||
const char *const key);
|
||||
const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
|
||||
const char *const path, const char *const key);
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Everything else
|
||||
*********************************
|
||||
*/
|
||||
i32 asset_loadXmlFile(AssetManager *assetManager, MemoryArena *arena,
|
||||
PlatformFileRead *fileRead);
|
||||
const i32 asset_loadXmlFile(AssetManager *const assetManager,
|
||||
MemoryArena *const arena,
|
||||
const PlatformFileRead *const fileRead);
|
||||
|
||||
AudioVorbis *asset_getVorbis(AssetManager *assetManager,
|
||||
const enum AudioList type);
|
||||
const i32 asset_loadVorbis(AssetManager *assetManager, MemoryArena *arena,
|
||||
const char *const path, const enum AudioList type);
|
||||
|
||||
Shader *asset_getShader(AssetManager *assetManager, const enum ShaderList type);
|
||||
Shader *const asset_getShader(AssetManager *assetManager, const enum ShaderList type);
|
||||
const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena *arena,
|
||||
const char *const vertexPath,
|
||||
const char *const fragmentPath,
|
||||
@ -72,7 +79,8 @@ const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena *arena,
|
||||
|
||||
const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
|
||||
const char *filePath);
|
||||
v2 asset_stringDimInPixels(const Font *const font, const char *const string);
|
||||
const v2 asset_stringDimInPixels(const Font *const font,
|
||||
const char *const string);
|
||||
|
||||
void asset_unitTest(MemoryArena *arena);
|
||||
|
||||
|
@ -48,33 +48,6 @@ enum ShaderList
|
||||
shaderlist_count,
|
||||
};
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Audio
|
||||
*********************************
|
||||
*/
|
||||
enum AudioList
|
||||
{
|
||||
audiolist_battle,
|
||||
audiolist_overworld,
|
||||
audiolist_tackle,
|
||||
audiolist_count,
|
||||
audiolist_invalid,
|
||||
};
|
||||
|
||||
typedef struct AudioVorbis
|
||||
{
|
||||
enum AudioList type;
|
||||
stb_vorbis *file;
|
||||
stb_vorbis_info info;
|
||||
|
||||
u32 lengthInSamples;
|
||||
f32 lengthInSeconds;
|
||||
|
||||
u8 *data;
|
||||
i32 size;
|
||||
} AudioVorbis;
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Hash Table
|
||||
@ -94,6 +67,28 @@ typedef struct HashTable
|
||||
i32 size;
|
||||
} HashTable;
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Audio
|
||||
*********************************
|
||||
*/
|
||||
typedef struct AudioVorbis
|
||||
{
|
||||
union {
|
||||
char *key;
|
||||
char *name;
|
||||
};
|
||||
|
||||
stb_vorbis *file;
|
||||
stb_vorbis_info info;
|
||||
|
||||
u32 lengthInSamples;
|
||||
f32 lengthInSeconds;
|
||||
|
||||
u8 *data;
|
||||
i32 size;
|
||||
} AudioVorbis;
|
||||
|
||||
/*
|
||||
*********************************
|
||||
* Texture Assets
|
||||
|
Loading…
Reference in New Issue
Block a user