Add error checking to Audio API

This commit is contained in:
Doyle Thai 2016-07-28 13:11:30 +10:00
parent 09972ced6e
commit ac775b39c2
4 changed files with 152 additions and 34 deletions

View File

@ -224,7 +224,8 @@ const i32 asset_loadTTFont(AssetManager *assetManager, MemoryArena *arena,
const char *filePath) const char *filePath)
{ {
PlatformFileRead fontFileRead = {0}; PlatformFileRead fontFileRead = {0};
platform_readFileToBuffer(arena, filePath, &fontFileRead); i32 result = platform_readFileToBuffer(arena, filePath, &fontFileRead);
if (result) return result;
stbtt_fontinfo fontInfo = {0}; stbtt_fontinfo fontInfo = {0};
stbtt_InitFont(&fontInfo, fontFileRead.buffer, stbtt_InitFont(&fontInfo, fontFileRead.buffer,

View File

@ -134,9 +134,19 @@ INTERNAL i32 rendererAcquire(AudioManager *audioManager,
AUDIO_NO_FREE_SOURCE) AUDIO_NO_FREE_SOURCE)
{ {
// TODO(doyle): Error messaging return paths // TODO(doyle): Error messaging return paths
DEBUG_LOG("rendererAcquire(): Failed to acquire free source, all busy");
return -1; return -1;
} }
u32 checkSource = getSourceId(audioManager, audioRenderer);
if (alIsSource(checkSource) == AL_TRUE)
{
DEBUG_LOG(
"rendererAcquire(): Renderer has not been released before "
"acquiring, force release by stopping stream");
audio_streamStopVorbis(audioManager, audioRenderer);
}
/* Assign a vacant source slot to renderer */ /* Assign a vacant source slot to renderer */
audioRenderer->sourceIndex = vacantSource; audioRenderer->sourceIndex = vacantSource;
@ -156,18 +166,35 @@ INTERNAL i32 rendererAcquire(AudioManager *audioManager,
return 0; return 0;
} }
INTERNAL void rendererRelease(AudioManager *audioManager, INTERNAL const i32 rendererRelease(AudioManager *audioManager,
AudioRenderer *audioRenderer) AudioRenderer *audioRenderer)
{ {
i32 result = 0;
u32 alSourceId = getSourceId(audioManager, audioRenderer); u32 alSourceId = getSourceId(audioManager, audioRenderer);
if (alIsSource(alSourceId) == AL_FALSE)
{
DEBUG_LOG(
"rendererRelease(): Trying to release invalid source, early exit");
alSourceUnqueueBuffers(alSourceId, ARRAY_COUNT(audioRenderer->bufferId), result = -1;
audioRenderer->bufferId); return result;
AL_CHECK_ERROR(); }
alDeleteBuffers(ARRAY_COUNT(audioRenderer->bufferId),
audioRenderer->bufferId); for (i32 i = 0; i < ARRAY_COUNT(audioRenderer->bufferId); i++)
AL_CHECK_ERROR(); {
if (alIsBuffer(audioRenderer->bufferId[i]) == AL_TRUE)
{
alSourceUnqueueBuffers(alSourceId, 1, &audioRenderer->bufferId[i]);
alDeleteBuffers(1, &audioRenderer->bufferId[i]);
AL_CHECK_ERROR();
}
else
{
DEBUG_LOG("rendererRelease(): Invalid buffer identified in renderer");
result = -1;
}
}
for (i32 i = 0; i < ARRAY_COUNT(audioRenderer->bufferId); i++) for (i32 i = 0; i < ARRAY_COUNT(audioRenderer->bufferId); i++)
{ {
@ -184,12 +211,14 @@ INTERNAL void rendererRelease(AudioManager *audioManager,
audioManager->freeSourceIndex; audioManager->freeSourceIndex;
audioManager->freeSourceIndex = sourceIndexToFree; audioManager->freeSourceIndex = sourceIndexToFree;
return result;
} }
#define AUDIO_CHUNK_SIZE_ 65536 #define AUDIO_CHUNK_SIZE_ 65536
void audio_streamPlayVorbis(AudioManager *audioManager, const i32 audio_streamPlayVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer, AudioVorbis *vorbis, AudioRenderer *audioRenderer,
i32 numPlays) AudioVorbis *vorbis, i32 numPlays)
{ {
#ifdef DENGINE_DEBUG #ifdef DENGINE_DEBUG
ASSERT(audioManager && audioRenderer && vorbis); ASSERT(audioManager && audioRenderer && vorbis);
@ -203,7 +232,7 @@ void audio_streamPlayVorbis(AudioManager *audioManager,
if (result) if (result)
{ {
DEBUG_LOG("audio_streamPlayVorbis() failed: Could not acquire renderer"); DEBUG_LOG("audio_streamPlayVorbis() failed: Could not acquire renderer");
return; return result;
} }
/* Determine format */ /* Determine format */
@ -214,38 +243,93 @@ void audio_streamPlayVorbis(AudioManager *audioManager,
{ {
#ifdef DENGINE_DEBUG #ifdef DENGINE_DEBUG
DEBUG_LOG( DEBUG_LOG(
"audio_streamPlayVorbis() warning: Unaccounted channel format"); "audio_streamPlayVorbis() warning: Unexpected channel format");
ASSERT(INVALID_CODE_PATH);
#endif #endif
} }
audioRenderer->audio = vorbis; audioRenderer->audio = vorbis;
audioRenderer->numPlays = numPlays; audioRenderer->numPlays = numPlays;
return 0;
} }
void audio_streamStopVorbis(AudioManager *audioManager, const i32 audio_streamStopVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer) AudioRenderer *audioRenderer)
{ {
i32 result = 0;
u32 alSourceId = getSourceId(audioManager, audioRenderer); u32 alSourceId = getSourceId(audioManager, audioRenderer);
alSourceStop(alSourceId); if (alIsSource(alSourceId) == AL_TRUE)
AL_CHECK_ERROR(); {
rendererRelease(audioManager, audioRenderer); alSourceStop(alSourceId);
AL_CHECK_ERROR();
result = rendererRelease(audioManager, audioRenderer);
}
else
{
DEBUG_LOG("audio_streamStopVorbis(): Tried to stop invalid source");
result = -1;
}
return result;
} }
void audio_updateAndPlay(AudioManager *audioManager, const i32 audio_streamPauseVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer) AudioRenderer *audioRenderer)
{
i32 result = 0;
u32 alSourceId = getSourceId(audioManager, audioRenderer);
if (alIsSource(alSourceId) == AL_TRUE)
{
alSourcePause(alSourceId);
AL_CHECK_ERROR();
}
else
{
DEBUG_LOG("audio_streamPauseVorbis(): Tried to pause invalid source");
result = -1;
}
return result;
}
const i32 audio_streamResumeVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer)
{
i32 result = 0;
u32 alSourceId = getSourceId(audioManager, audioRenderer);
if (alIsSource(alSourceId) == AL_TRUE)
{
alSourcePlay(alSourceId);
AL_CHECK_ERROR();
}
else
{
DEBUG_LOG("audio_streamResumeVorbis(): Tried to resume invalid source");
result = -1;
}
return result;
}
const i32 audio_updateAndPlay(AudioManager *audioManager,
AudioRenderer *audioRenderer)
{ {
AudioVorbis *audio = audioRenderer->audio; AudioVorbis *audio = audioRenderer->audio;
if (!audio) return; if (!audio) return 0;
if (audioRenderer->numPlays != AUDIO_REPEAT_INFINITE && if (audioRenderer->numPlays != AUDIO_REPEAT_INFINITE &&
audioRenderer->numPlays <= 0) audioRenderer->numPlays <= 0)
{ {
rendererRelease(audioManager, audioRenderer); i32 result = rendererRelease(audioManager, audioRenderer);
return; return result;
} }
u32 alSourceId = getSourceId(audioManager, audioRenderer); u32 alSourceId = getSourceId(audioManager, audioRenderer);
if (alIsSource(alSourceId) == AL_FALSE)
{
DEBUG_LOG("audio_updateAndPlay(): Update failed on invalid source id");
return -1;
}
ALint audioState; ALint audioState;
alGetSourcei(alSourceId, AL_SOURCE_STATE, &audioState); alGetSourcei(alSourceId, AL_SOURCE_STATE, &audioState);
AL_CHECK_ERROR(); AL_CHECK_ERROR();
@ -271,8 +355,8 @@ void audio_updateAndPlay(AudioManager *audioManager,
} }
else else
{ {
rendererRelease(audioManager, audioRenderer); i32 result = rendererRelease(audioManager, audioRenderer);
return; return result;
} }
} }
@ -329,4 +413,6 @@ void audio_updateAndPlay(AudioManager *audioManager,
} }
} }
} }
return 0;
} }

View File

@ -224,7 +224,10 @@ void worldTraveller_gameInit(GameState *state, v2 windowSize)
"data/shaders/sprite.frag.glsl", "data/shaders/sprite.frag.glsl",
shaderlist_sprite); shaderlist_sprite);
asset_loadTTFont(assetManager, arena, "C:/Windows/Fonts/Arialbd.ttf"); result =
asset_loadTTFont(assetManager, arena, "C:/Windows/Fonts/Arialbd.ttf");
if (result) DEBUG_LOG("Font loading failed");
GL_CHECK_ERROR(); GL_CHECK_ERROR();
#ifdef DENGINE_DEBUG #ifdef DENGINE_DEBUG
@ -495,6 +498,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
ddPos = v2_scale(ddPos, 0.70710678118f); ddPos = v2_scale(ddPos, 0.70710678118f);
} }
LOCAL_PERSIST b32 toggleFlag = TRUE;
// TODO(doyle): Revisit key input with state checking for last ended down // TODO(doyle): Revisit key input with state checking for last ended down
if (state->keys[GLFW_KEY_SPACE] && spaceBarWasDown == FALSE) if (state->keys[GLFW_KEY_SPACE] && spaceBarWasDown == FALSE)
{ {
@ -506,6 +510,7 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
v2 pos = V2(renderer->size.w - (renderer->size.w / xModifier), yPos); v2 pos = V2(renderer->size.w - (renderer->size.w / xModifier), yPos);
addGenericMob(&state->arena, &state->assetManager, world, pos); addGenericMob(&state->arena, &state->assetManager, world, pos);
#endif #endif
#if 0
if (world->soundscape->audio->sourceIndex == AUDIO_SOURCE_UNASSIGNED) if (world->soundscape->audio->sourceIndex == AUDIO_SOURCE_UNASSIGNED)
{ {
audio_streamPlayVorbis( audio_streamPlayVorbis(
@ -517,6 +522,28 @@ INTERNAL void parseInput(GameState *state, const f32 dt)
{ {
audio_streamStopVorbis(&state->audioManager, audio_streamStopVorbis(&state->audioManager,
world->soundscape->audio); world->soundscape->audio);
audio_streamPauseVorbis(&state->audioManager,
world->soundscape->audio);
}
#endif
if (toggleFlag)
{
audio_streamPauseVorbis(&state->audioManager,
world->soundscape->audio);
toggleFlag = FALSE;
}
else
{
audio_streamResumeVorbis(&state->audioManager,
world->soundscape->audio);
#if 0
audio_streamPlayVorbis(
&state->audioManager, world->soundscape->audio,
asset_getVorbis(&state->assetManager, audiolist_battle),
AUDIO_REPEAT_INFINITE);
#endif
toggleFlag = TRUE;
} }
spaceBarWasDown = TRUE; spaceBarWasDown = TRUE;
} }

View File

@ -36,11 +36,15 @@ struct AudioRenderer
typedef struct AudioRenderer AudioRenderer; typedef struct AudioRenderer AudioRenderer;
const i32 audio_init(AudioManager *audioManager); const i32 audio_init(AudioManager *audioManager);
void audio_streamPlayVorbis(AudioManager *audioManager, const i32 audio_streamPlayVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer, AudioVorbis *vorbis, AudioRenderer *audioRenderer,
i32 numPlays); AudioVorbis *vorbis, i32 numPlays);
void audio_streamStopVorbis(AudioManager *audioManager, const i32 audio_streamStopVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer); AudioRenderer *audioRenderer);
void audio_updateAndPlay(AudioManager *audioManager, const i32 audio_streamPauseVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer); AudioRenderer *audioRenderer);
const i32 audio_streamResumeVorbis(AudioManager *audioManager,
AudioRenderer *audioRenderer);
const i32 audio_updateAndPlay(AudioManager *audioManager,
AudioRenderer *audioRenderer);
#endif #endif