Refactor : style and API cleanups

This commit is contained in:
Aaron Culliney 2015-06-20 11:39:23 -07:00
parent b5ebec1939
commit 7b0c5be7c8
2 changed files with 63 additions and 98 deletions

View File

@ -73,11 +73,9 @@ static long OpenALDestroySoundBuffer(INOUT AudioBuffer_s **soundbuf_struct);
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// uthash of OpenAL buffers // uthash of OpenAL buffers
static ALPlayBuf *PlaylistEnqueue(ALVoice *voice, ALuint bytes) static ALPlayBuf *PlaylistEnqueue(ALVoice *voice, ALuint bytes) {
{
ALPlayBuf *node = voice->avail_buffers; ALPlayBuf *node = voice->avail_buffers;
if (node == NULL) if (node == NULL) {
{
ERRLOG("OOPS, sound playback overflow!"); ERRLOG("OOPS, sound playback overflow!");
return NULL; return NULL;
} }
@ -85,8 +83,7 @@ static ALPlayBuf *PlaylistEnqueue(ALVoice *voice, ALuint bytes)
ALPlayBuf *node2 = NULL; ALPlayBuf *node2 = NULL;
HASH_FIND_INT(voice->queued_buffers, &node->bufid, node2); HASH_FIND_INT(voice->queued_buffers, &node->bufid, node2);
if (node2 != NULL) if (node2 != NULL) {
{
ERRLOG("OOPS, confused ... ALPlayBuf already added!"); ERRLOG("OOPS, confused ... ALPlayBuf already added!");
return NULL; return NULL;
} }
@ -106,8 +103,7 @@ static ALPlayBuf *PlaylistEnqueue(ALVoice *voice, ALuint bytes)
ALPlayBuf *tmp = voice->queued_buffers; ALPlayBuf *tmp = voice->queued_buffers;
unsigned int count = HASH_COUNT(voice->queued_buffers); unsigned int count = HASH_COUNT(voice->queued_buffers);
LOG("\t(numqueued: %d)", count); LOG("\t(numqueued: %d)", count);
for (unsigned int i = 0; i < count; i++, tmp = tmp->hh.next) for (unsigned int i = 0; i < count; i++, tmp = tmp->hh.next) {
{
LOG("\t(bufid : %u)", tmp->bufid); LOG("\t(bufid : %u)", tmp->bufid);
} }
#endif #endif
@ -115,15 +111,13 @@ static ALPlayBuf *PlaylistEnqueue(ALVoice *voice, ALuint bytes)
return node; return node;
} }
static ALPlayBuf *PlaylistGet(ALVoice *voice, ALuint bufid) static ALPlayBuf *PlaylistGet(ALVoice *voice, ALuint bufid) {
{
ALPlayBuf *node = NULL; ALPlayBuf *node = NULL;
HASH_FIND_INT(voice->queued_buffers, &bufid, node); HASH_FIND_INT(voice->queued_buffers, &bufid, node);
return node; return node;
} }
static void PlaylistDequeue(ALVoice *voice, ALPlayBuf *node) static void PlaylistDequeue(ALVoice *voice, ALPlayBuf *node) {
{
//LOG("Dequeing OpenAL buffer %u", node->bufid); //LOG("Dequeing OpenAL buffer %u", node->bufid);
// remove from hash / place on list // remove from hash / place on list
@ -139,8 +133,7 @@ static void PlaylistDequeue(ALVoice *voice, ALPlayBuf *node)
ALPlayBuf *tmp = voice->queued_buffers; ALPlayBuf *tmp = voice->queued_buffers;
unsigned int count = HASH_COUNT(voice->queued_buffers); unsigned int count = HASH_COUNT(voice->queued_buffers);
LOG("\t(numqueued: %d)", count); LOG("\t(numqueued: %d)", count);
for (unsigned int i = 0; i < count; i++, tmp = tmp->hh.next) for (unsigned int i = 0; i < count; i++, tmp = tmp->hh.next) {
{
LOG("\t(bufid : %u)", tmp->bufid); LOG("\t(bufid : %u)", tmp->bufid);
} }
#endif #endif
@ -148,8 +141,7 @@ static void PlaylistDequeue(ALVoice *voice, ALPlayBuf *node)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static long openal_systemSetup(INOUT AudioContext_s **audio_context) static long openal_systemSetup(INOUT AudioContext_s **audio_context) {
{
assert(*audio_context == NULL); assert(*audio_context == NULL);
assert(voices == NULL); assert(voices == NULL);
@ -157,23 +149,18 @@ static long openal_systemSetup(INOUT AudioContext_s **audio_context)
do { do {
if ((ctx = InitAL()) == NULL) if ((ctx = InitAL()) == NULL) {
{
ERRLOG("OOPS, OpenAL initialize failed"); ERRLOG("OOPS, OpenAL initialize failed");
break; break;
} }
if (alIsExtensionPresent("AL_SOFT_buffer_samples")) if (alIsExtensionPresent("AL_SOFT_buffer_samples")) {
{
LOG("AL_SOFT_buffer_samples supported, good!"); LOG("AL_SOFT_buffer_samples supported, good!");
} } else {
else
{
LOG("WARNING - AL_SOFT_buffer_samples extension not supported... Proceeding anyway..."); LOG("WARNING - AL_SOFT_buffer_samples extension not supported... Proceeding anyway...");
} }
if ((*audio_context = malloc(sizeof(AudioContext_s))) == NULL) if ((*audio_context = malloc(sizeof(AudioContext_s))) == NULL) {
{
ERRLOG("OOPS, Not enough memory"); ERRLOG("OOPS, Not enough memory");
break; break;
} }
@ -186,16 +173,14 @@ static long openal_systemSetup(INOUT AudioContext_s **audio_context)
} while(0); } while(0);
// ERRQUIT // ERRQUIT
if (*audio_context) if (*audio_context) {
{
FREE(*audio_context); FREE(*audio_context);
} }
return -1; return -1;
} }
static long openal_systemShutdown(INOUT AudioContext_s **audio_context) static long openal_systemShutdown(INOUT AudioContext_s **audio_context) {
{
assert(*audio_context != NULL); assert(*audio_context != NULL);
ALCcontext *ctx = (ALCcontext*) (*audio_context)->_internal; ALCcontext *ctx = (ALCcontext*) (*audio_context)->_internal;
@ -243,18 +228,17 @@ static long openal_systemResume(void) {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/* Destroys a voice object, deleting the source and buffers. No error handling /*
* since these calls shouldn't fail with a properly-made voice object. */ * Destroys a voice object, deleting the source and buffers. Minimal error
static void DeleteVoice(ALVoice *voice) * handling since these calls shouldn't fail with a properly-made voice object.
{ */
static void DeleteVoice(ALVoice *voice) {
alDeleteSources(1, &voice->source); alDeleteSources(1, &voice->source);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Failed to delete source"); ERRLOG("OOPS, Failed to delete source");
} }
if (voice->data) if (voice->data) {
{
FREE(voice->data); FREE(voice->data);
} }
@ -264,12 +248,10 @@ static void DeleteVoice(ALVoice *voice)
PlaylistDequeue(voice, node); PlaylistDequeue(voice, node);
} }
while (voice->avail_buffers) while (voice->avail_buffers) {
{
node = voice->avail_buffers; node = voice->avail_buffers;
alDeleteBuffers(1, &node->bufid); alDeleteBuffers(1, &node->bufid);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Failed to delete object IDs"); ERRLOG("OOPS, Failed to delete object IDs");
} }
voice->avail_buffers = node->_avail_next; voice->avail_buffers = node->_avail_next;
@ -280,72 +262,64 @@ static void DeleteVoice(ALVoice *voice)
FREE(voice); FREE(voice);
} }
/* Creates a new voice object, and allocates the needed OpenAL source and /*
* Creates a new voice object, and allocates the needed OpenAL source and
* buffer objects. Error checking is simplified for the purposes of this * buffer objects. Error checking is simplified for the purposes of this
* example, and will cause an abort if needed. */ * example, and will cause an abort if needed.
static ALVoice *NewVoice(const AudioParams_s *params) */
{ static ALVoice *NewVoice(const AudioParams_s *params) {
ALVoice *voice = NULL; ALVoice *voice = NULL;
do { do {
voice = calloc(1, sizeof(*voice)); voice = calloc(1, sizeof(*voice));
if (voice == NULL) if (voice == NULL) {
{
ERRLOG("OOPS, Out of memory!"); ERRLOG("OOPS, Out of memory!");
break; break;
} }
ALuint buffers[OPENAL_NUM_BUFFERS]; ALuint buffers[OPENAL_NUM_BUFFERS];
alGenBuffers(OPENAL_NUM_BUFFERS, buffers); alGenBuffers(OPENAL_NUM_BUFFERS, buffers);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not create buffers"); ERRLOG("OOPS, Could not create buffers");
break; break;
} }
alGenSources(1, &voice->source); alGenSources(1, &voice->source);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not create source"); ERRLOG("OOPS, Could not create source");
break; break;
} }
// Set parameters so mono sources play out the front-center speaker and won't distance attenuate. // Set parameters so mono sources play out the front-center speaker and won't distance attenuate.
alSource3i(voice->source, AL_POSITION, 0, 0, -1); alSource3i(voice->source, AL_POSITION, 0, 0, -1);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not set AL_POSITION source parameter"); ERRLOG("OOPS, Could not set AL_POSITION source parameter");
break; break;
} }
alSourcei(voice->source, AL_SOURCE_RELATIVE, AL_TRUE); alSourcei(voice->source, AL_SOURCE_RELATIVE, AL_TRUE);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not set AL_SOURCE_RELATIVE source parameter"); ERRLOG("OOPS, Could not set AL_SOURCE_RELATIVE source parameter");
break; break;
} }
alSourcei(voice->source, AL_ROLLOFF_FACTOR, 0); alSourcei(voice->source, AL_ROLLOFF_FACTOR, 0);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not set AL_ROLLOFF_FACTOR source parameter"); ERRLOG("OOPS, Could not set AL_ROLLOFF_FACTOR source parameter");
break; break;
} }
#if 0 #if 0
alSourcei(voice->source, AL_STREAMING, AL_TRUE); alSourcei(voice->source, AL_STREAMING, AL_TRUE);
if (alGetError() != AL_NO_ERROR) if (alGetError() != AL_NO_ERROR) {
{
ERRLOG("OOPS, Could not set AL_STREAMING source parameter"); ERRLOG("OOPS, Could not set AL_STREAMING source parameter");
break; break;
} }
#endif #endif
voice->avail_buffers = NULL; voice->avail_buffers = NULL;
for (unsigned int i=0; i<OPENAL_NUM_BUFFERS; i++) for (unsigned int i=0; i<OPENAL_NUM_BUFFERS; i++) {
{ ALPlayBuf immutableNode = { /*const*/.bufid = buffers[i] };
ALPlayBuf immutableNode = { .bufid = buffers[i] };
ALPlayBuf *node = calloc(1, sizeof(ALPlayBuf)); ALPlayBuf *node = calloc(1, sizeof(ALPlayBuf));
if (!node) if (!node) {
{
ERRLOG("OOPS, Not enough memory"); ERRLOG("OOPS, Not enough memory");
break; break;
} }
@ -357,20 +331,16 @@ static ALVoice *NewVoice(const AudioParams_s *params)
voice->rate = (ALuint)params->nSamplesPerSec; voice->rate = (ALuint)params->nSamplesPerSec;
// Emulator supports only mono and stereo // Emulator supports only mono and stereo
if (params->nChannels == 2) if (params->nChannels == 2) {
{
voice->format = AL_FORMAT_STEREO16; voice->format = AL_FORMAT_STEREO16;
} } else {
else
{
voice->format = AL_FORMAT_MONO16; voice->format = AL_FORMAT_MONO16;
} }
/* Allocate enough space for the temp buffer, given the format */ /* Allocate enough space for the temp buffer, given the format */
voice->buffersize = (ALsizei)params->dwBufferBytes; voice->buffersize = (ALsizei)params->dwBufferBytes;
voice->data = malloc(voice->buffersize); voice->data = malloc(voice->buffersize);
if (voice->data == NULL) if (voice->data == NULL) {
{
ERRLOG("OOPS, Error allocating %d bytes", voice->buffersize); ERRLOG("OOPS, Error allocating %d bytes", voice->buffersize);
break; break;
} }
@ -384,8 +354,7 @@ static ALVoice *NewVoice(const AudioParams_s *params)
} while(0); } while(0);
// ERR // ERR
if (voice) if (voice) {
{
DeleteVoice(voice); DeleteVoice(voice);
} }
@ -395,11 +364,11 @@ static ALVoice *NewVoice(const AudioParams_s *params)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static long _ALProcessPlayBuffers(ALVoice *voice, ALuint *bytes_queued) { static long _ALProcessPlayBuffers(ALVoice *voice, ALuint *bytes_queued) {
ALint processed = 0;
long err = 0; long err = 0;
*bytes_queued = 0; *bytes_queued = 0;
do { do {
ALint processed = 0;
alGetSourcei(voice->source, AL_BUFFERS_PROCESSED, &processed); alGetSourcei(voice->source, AL_BUFFERS_PROCESSED, &processed);
if ((err = alGetError()) != AL_NO_ERROR) { if ((err = alGetError()) != AL_NO_ERROR) {
ERRLOG("OOPS, error in checking processed buffers : 0x%08lx", err); ERRLOG("OOPS, error in checking processed buffers : 0x%08lx", err);
@ -457,12 +426,12 @@ static long _ALProcessPlayBuffers(ALVoice *voice, ALuint *bytes_queued) {
} }
// returns queued+working sound buffer size in bytes // returns queued+working sound buffer size in bytes
static long ALGetPosition(AudioBuffer_s *_this, unsigned long *bytes_queued) { static long ALGetPosition(AudioBuffer_s *_this, OUTPARM unsigned long *bytes_queued) {
*bytes_queued = 0;
long err = 0; long err = 0;
do { do {
ALVoice *voice = (ALVoice*)_this->_internal; ALVoice *voice = (ALVoice*)_this->_internal;
*bytes_queued = 0;
ALuint queued = 0; ALuint queued = 0;
long err = _ALProcessPlayBuffers(voice, &queued); long err = _ALProcessPlayBuffers(voice, &queued);
@ -481,7 +450,9 @@ static long ALGetPosition(AudioBuffer_s *_this, unsigned long *bytes_queued) {
return err; return err;
} }
static long ALLockBuffer(AudioBuffer_s *_this, unsigned long write_bytes, INOUT int16_t **audio_ptr, INOUT unsigned long *audio_bytes) { static long ALLockBuffer(AudioBuffer_s *_this, unsigned long write_bytes, INOUT int16_t **audio_ptr, OUTPARM unsigned long *audio_bytes) {
*audio_bytes = 0;
*audio_ptr = NULL;
long err = 0; long err = 0;
do { do {
@ -618,7 +589,8 @@ static long ALReplay(AudioBuffer_s *_this) {
return err; return err;
} }
static long ALGetStatus(AudioBuffer_s *_this, unsigned long *status) { static long ALGetStatus(AudioBuffer_s *_this, OUTPARM unsigned long *status) {
*status = -1;
long err = 0; long err = 0;
do { do {
@ -642,8 +614,7 @@ static long ALGetStatus(AudioBuffer_s *_this, unsigned long *status) {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static long OpenALCreateSoundBuffer(const AudioParams_s *params, INOUT AudioBuffer_s **soundbuf_struct, const AudioContext_s *audio_context) static long OpenALCreateSoundBuffer(const AudioParams_s *params, INOUT AudioBuffer_s **soundbuf_struct, const AudioContext_s *audio_context) {
{
LOG("OpenALCreateSoundBuffer ..."); LOG("OpenALCreateSoundBuffer ...");
assert(*soundbuf_struct == NULL); assert(*soundbuf_struct == NULL);
@ -654,16 +625,14 @@ static long OpenALCreateSoundBuffer(const AudioParams_s *params, INOUT AudioBuff
do { do {
if ((voice = NewVoice(params)) == NULL) if ((voice = NewVoice(params)) == NULL) {
{
ERRLOG("OOPS, Cannot create new voice"); ERRLOG("OOPS, Cannot create new voice");
break; break;
} }
ALVoices immutableNode = { .source = voice->source }; ALVoices immutableNode = { /*const*/.source = voice->source };
ALVoices *vnode = calloc(1, sizeof(ALVoices)); ALVoices *vnode = calloc(1, sizeof(ALVoices));
if (!vnode) if (!vnode) {
{
ERRLOG("OOPS, Not enough memory"); ERRLOG("OOPS, Not enough memory");
break; break;
} }
@ -671,8 +640,7 @@ static long OpenALCreateSoundBuffer(const AudioParams_s *params, INOUT AudioBuff
vnode->voice = voice; vnode->voice = voice;
HASH_ADD_INT(voices, source, vnode); HASH_ADD_INT(voices, source, vnode);
if ((*soundbuf_struct = malloc(sizeof(AudioBuffer_s))) == NULL) if ((*soundbuf_struct = malloc(sizeof(AudioBuffer_s))) == NULL) {
{
ERRLOG("OOPS, Not enough memory"); ERRLOG("OOPS, Not enough memory");
break; break;
} }
@ -689,24 +657,21 @@ static long OpenALCreateSoundBuffer(const AudioParams_s *params, INOUT AudioBuff
return 0; return 0;
} while(0); } while(0);
if (*soundbuf_struct) if (*soundbuf_struct) {
{
OpenALDestroySoundBuffer(soundbuf_struct); OpenALDestroySoundBuffer(soundbuf_struct);
} } else if (voice) {
else if (voice)
{
DeleteVoice(voice); DeleteVoice(voice);
} }
return -1; return -1;
} }
static long OpenALDestroySoundBuffer(INOUT AudioBuffer_s **soundbuf_struct) static long OpenALDestroySoundBuffer(INOUT AudioBuffer_s **soundbuf_struct) {
{
if (!*soundbuf_struct) { if (!*soundbuf_struct) {
// already dealloced // already dealloced
return 0; return 0;
} }
LOG("OpenALDestroySoundBuffer ..."); LOG("OpenALDestroySoundBuffer ...");
ALVoice *voice = (ALVoice *)((*soundbuf_struct)->_internal); ALVoice *voice = (ALVoice *)((*soundbuf_struct)->_internal);
ALint source = voice->source; ALint source = voice->source;
@ -728,7 +693,7 @@ __attribute__((constructor(CTOR_PRIORITY_EARLY)))
static void _init_openal(void) { static void _init_openal(void) {
LOG("Initializing OpenAL sound system"); LOG("Initializing OpenAL sound system");
assert(audio_backend == NULL && "there can only be one!"); assert((audio_backend == NULL) && "there can only be one!");
openal_audio_backend.setup = &openal_systemSetup; openal_audio_backend.setup = &openal_systemSetup;
openal_audio_backend.shutdown = &openal_systemShutdown; openal_audio_backend.shutdown = &openal_systemShutdown;

View File

@ -32,16 +32,16 @@ typedef struct AudioBuffer_s {
PRIVATE void *_internal; PRIVATE void *_internal;
// Get current number of queued bytes // Get current number of queued bytes
long (*GetCurrentPosition)(struct AudioBuffer_s *_this, unsigned long *bytes_queued); long (*GetCurrentPosition)(struct AudioBuffer_s *_this, OUTPARM unsigned long *bytes_queued);
// This method obtains a valid write pointer to the sound buffer's audio data // This method obtains a valid write pointer to the sound buffer's audio data
long (*Lock)(struct AudioBuffer_s *_this, unsigned long write_bytes, INOUT int16_t **audio_ptr, INOUT unsigned long *audio_bytes); long (*Lock)(struct AudioBuffer_s *_this, unsigned long write_bytes, INOUT int16_t **audio_ptr, OUTPARM unsigned long *audio_bytes);
// This method releases a locked sound buffer. // This method releases a locked sound buffer.
long (*Unlock)(struct AudioBuffer_s *_this, unsigned long audio_bytes); long (*Unlock)(struct AudioBuffer_s *_this, unsigned long audio_bytes);
// Get status (playing or not) // Get status (playing or not)
long (*GetStatus)(struct AudioBuffer_s *_this, unsigned long *status); long (*GetStatus)(struct AudioBuffer_s *_this, OUTPARM unsigned long *status);
// Mockingboard-specific buffer replay // Mockingboard-specific buffer replay
long (*UnlockStaticBuffer)(struct AudioBuffer_s *_this, unsigned long audio_bytes); long (*UnlockStaticBuffer)(struct AudioBuffer_s *_this, unsigned long audio_bytes);