--- a/misc/openalbridge/openalbridge.c Wed Apr 21 21:38:07 2010 +0000
+++ b/misc/openalbridge/openalbridge.c Thu Apr 22 17:43:12 2010 +0000
@@ -18,8 +18,9 @@
#include "openalbridge.h"
#include "globals.h"
+#include "al.h"
+#include "alc.h"
#include "wrappers.h"
-#include "alc.h"
#include "loaders.h"
@@ -30,75 +31,74 @@
/*index for Sources and Buffers*/
ALuint globalindex, globalsize, increment;
-ALboolean openalReady = AL_FALSE;
+ALboolean isBridgeReady = AL_FALSE;
ALfloat old_gain;
-int openal_init(int memorysize) {
+int openal_init (int memorysize) {
/*Initialize an OpenAL contex and allocate memory space for data and buffers*/
ALCcontext *context;
ALCdevice *device;
-
+
// set the memory dimentsion and the increment width when reallocating
if (memorysize <= 0)
globalsize = 50;
else
globalsize = memorysize;
increment = globalsize;
-
+
// reuse old context but keep the new value for increment
- if (openalReady == AL_TRUE) {
- err_msg("(%s) WARN - already initialized", prog);
+ if (isBridgeReady == AL_TRUE) {
+ fprintf(stderr,"(Bridge Warning) - already initialized");
return 0;
}
-
+
// open hardware device if present
device = alcOpenDevice(NULL);
-
+
if (device == NULL) {
- errno = ENODEV;
- err_ret("(%s) WARN - failed to open sound device, using software renderer", prog);
+ fprintf(stderr,"(Bridge Warning) - failed to open sound device, using software renderer");
device = alcOpenDevice("Generic Software");
if (device == NULL) {
- err_ret("(%s) ERROR - failed to open sound software device, sound will be disabled", prog);
+ fprintf(stderr,"(Bridge Error) - failed to open sound software device, sound will be disabled");
return -1;
}
}
-
- err_msg("(%s) INFO - Output device: %s", prog, alcGetString(device, ALC_DEVICE_SPECIFIER));
-
+
+ fprintf(stderr,"(Bridge Info) - Output device: %s", alcGetString(device, ALC_DEVICE_SPECIFIER));
+
context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);
alcProcessContext(context);
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to create a new contex",prog);
+ fprintf(stderr,"(Bridge Error) - Failed to create a new contex");
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);
return -2;
}
-
+
// allocate memory space for buffers and sources
Buffers = (ALuint*) Malloc(sizeof(ALuint)*globalsize);
Sources = (ALuint*) Malloc(sizeof(ALuint)*globalsize);
-
+
// set the listener gain, position (on xyz axes), velocity (one value for each axe) and orientation
// Position, Velocity and Orientation of the listener
ALfloat ListenerPos[] = {0.0, 0.0, 0.0};
ALfloat ListenerVel[] = {0.0, 0.0, 0.0};
ALfloat ListenerOri[] = {0.0, 0.0, -1.0, 0.0, 1.0, 0.0};
-
+
alListenerf (AL_GAIN, 1.0f );
alListenerfv(AL_POSITION, ListenerPos);
alListenerfv(AL_VELOCITY, ListenerVel);
alListenerfv(AL_ORIENTATION, ListenerOri);
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to set Listener properties",prog);
+ fprintf(stderr,"(Bridge Error) - Failed to set Listener properties");
return -3;
}
- openalReady = AL_TRUE;
-
+ isBridgeReady = AL_TRUE;
+
alGetError(); // clear any AL errors beforehand
return AL_TRUE;
}
@@ -107,36 +107,35 @@
/*Stop all sounds, deallocate all memory and close OpenAL */
ALCcontext *context;
ALCdevice *device;
-
- if (openalReady == AL_FALSE) {
- errno = EPERM;
- err_ret("(%s) WARN - OpenAL not initialized", prog);
+
+ if (isBridgeReady == AL_FALSE) {
+ fprintf(stderr,"(Bridge Warning) - OpenAL not initialized");
return;
}
-
+
alSourceStopv (globalsize, Sources);
alDeleteSources (globalsize, Sources);
alDeleteBuffers (globalsize, Buffers);
-
+
free(Sources);
free(Buffers);
-
+
context = alcGetCurrentContext();
device = alcGetContextsDevice(context);
-
+
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);
-
- openalReady = AL_FALSE;
-
- err_msg("(%s) INFO - closed", prog);
-
+
+ isBridgeReady = AL_FALSE;
+
+ fprintf(stderr,"(Bridge Info) - closed");
+
return;
}
-ALboolean openal_ready(void) {
- return openalReady;
+ALboolean openal_ready (void) {
+ return isBridgeReady;
}
@@ -144,12 +143,12 @@
/*expands allocated memory when loading more sound files than expected*/
int oldsize = globalsize;
globalsize += increment;
-
- err_msg("(%s) INFO - Realloc in process from %d to %d\n", prog, oldsize, globalsize);
-
+
+ fprintf(stderr,"(Bridge Info) - Realloc in process from %d to %d\n", oldsize, globalsize);
+
Buffers = (ALuint*) Realloc(Buffers, sizeof(ALuint)*globalsize);
Sources = (ALuint*) Realloc(Sources, sizeof(ALuint)*globalsize);
-
+
return;
}
@@ -164,46 +163,46 @@
uint32_t fileformat;
ALenum error;
FILE *fp;
-
- if (openalReady == AL_FALSE) {
- err_msg("(%s) WARN - not initialized", prog);
+
+ if (isBridgeReady == AL_FALSE) {
+ fprintf(stderr,"(Bridge Warning) - not initialized");
return -1;
}
-
+
/*when the buffers are all used, we can expand memory to accept new files*/
if (globalindex == globalsize)
helper_realloc();
-
+
/*detect the file format, as written in the first 4 bytes of the header*/
fp = Fopen (filename, "rb");
-
+
if (fp == NULL)
return -2;
-
+
error = fread (&fileformat, sizeof(uint32_t), 1, fp);
fclose (fp);
-
+
if (error < 0) {
- err_msg("(%s) ERROR - File %s is too short", prog, filename);
+ fprintf(stderr,"(Bridge Error) - File %s is too short", filename);
return -3;
}
-
+
/*prepare the buffer to receive data*/
alGenBuffers(1, &Buffers[globalindex]);
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to allocate memory for buffers",prog);
+ fprintf(stderr,"(Bridge Error) - Failed to allocate memory for buffers");
return -4;
}
-
+
/*prepare the source to emit sound*/
alGenSources(1, &Sources[globalindex]);
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to allocate memory for sources",prog);
+ fprintf(stderr,"(Bridge Error) - Failed to allocate memory for sources");
return -5;
}
-
+
switch (ENDIAN_BIG_32(fileformat)) {
case OGG_FILE_FORMAT:
error = load_oggvorbis (filename, &format, &data, &bitsize, &freq);
@@ -212,21 +211,26 @@
error = load_wavpcm (filename, &format, &data, &bitsize, &freq);
break;
default:
- err_msg ("(%s) ERROR - File format (%08X) not supported", prog, ENDIAN_BIG_32(fileformat));
+ fprintf(stderr,"(Bridge Error) - File format (%08X) not supported", ENDIAN_BIG_32(fileformat));
return -6;
break;
}
-
-
+
+ if (error != 0) {
+ fprintf(stderr,"(Bridge Error) - error loading file %s", filename);
+ free(data);
+ return -7;
+ }
+
//copy pcm data in one buffer and free it
alBufferData(Buffers[globalindex], format, data, bitsize, freq);
free(data);
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to write data to buffers",prog);
- return -6;
+ fprintf(stderr,"(Bridge Error) - Failed to write data to buffers");
+ return -8;
}
-
+
/*set source properties that it will use when it's in playback*/
alSourcei (Sources[globalindex], AL_BUFFER, Buffers[globalindex] );
alSourcef (Sources[globalindex], AL_PITCH, 1.0f );
@@ -234,14 +238,14 @@
alSourcefv(Sources[globalindex], AL_POSITION, SourcePos );
alSourcefv(Sources[globalindex], AL_VELOCITY, SourceVel );
alSourcei (Sources[globalindex], AL_LOOPING, 0 );
-
+
if (AL_NO_ERROR != alGetError()) {
- err_msg("(%s) ERROR - Failed to set Source properties",prog);
- return -7;
+ fprintf(stderr,"(Bridge Error) - Failed to set Source properties");
+ return -9;
}
-
+
alGetError(); /* clear any AL errors beforehand */
-
+
/*returns the index of the source you just loaded, increments it and exits*/
return globalindex++;
}
@@ -253,7 +257,7 @@
void openal_pausesound (uint32_t index) {
- if (openalReady == AL_TRUE && index < globalsize)
+ if (isBridgeReady == AL_TRUE && index < globalsize)
alSourcePause(Sources[index]);
}
@@ -264,63 +268,63 @@
void openal_freesound (uint32_t index){
- if (openalReady == AL_TRUE && index < globalsize)
+ if (isBridgeReady == AL_TRUE && index < globalsize)
alSourceStop(Sources[index]);
- // STUB
+ // STUB
}
void openal_playsound_loop (unsigned int index, char loops) {
-if (openalReady == AL_TRUE && index < globalsize) {
+ if (isBridgeReady == AL_TRUE && index < globalsize) {
alSourcePlay(Sources[index]);
- if (loops != 0)
+ if (loops != 0)
openal_toggleloop(index);
}
}
-void openal_stopsound_free (unsigned int index, char freesource) {
- if (openalReady == AL_TRUE && index < globalsize) {
+void openal_stopsound_free (unsigned int index, char freesource) {
+ if (isBridgeReady == AL_TRUE && index < globalsize) {
alSourceStop(Sources[index]);
- if (freesource != 0)
- openal_freesound(index);
+ if (freesource != 0)
+ openal_freesound(index);
}
}
void openal_toggleloop (uint32_t index) {
ALint loop;
-
- if (openalReady == AL_TRUE && index < globalsize) {
+
+ if (isBridgeReady == AL_TRUE && index < globalsize) {
alGetSourcei (Sources[index], AL_LOOPING, &loop);
alSourcei (Sources[index], AL_LOOPING, !((uint8_t) loop) & 0x00000001);
}
-
+
}
void openal_setvolume (uint32_t index, float gain) {
- if (openalReady == AL_TRUE && index < globalsize)
+ if (isBridgeReady == AL_TRUE && index < globalsize)
alSourcef (Sources[index], AL_GAIN, gain);
}
void openal_setglobalvolume (float gain) {
- if (openalReady == AL_TRUE)
+ if (isBridgeReady == AL_TRUE)
alListenerf (AL_GAIN, gain);
}
void openal_togglemute () {
ALfloat gain;
-
- if (openalReady == AL_TRUE) {
+
+ if (isBridgeReady == AL_TRUE) {
alGetListenerf (AL_GAIN, &gain);
if (gain > 0) {
- old_gain = gain;
+ old_gain = gain;
gain = 0;
- } else
+ } else
gain = old_gain;
-
- alListenerf (AL_GAIN, gain);
-}
+
+ alListenerf (AL_GAIN, gain);
+ }
}
// Fade in or out by calling a helper thread
@@ -331,13 +335,13 @@
HANDLE Thread;
#endif
fade_t *fade;
-
- if (openalReady == AL_TRUE && index < globalsize) {
+
+ if (isBridgeReady == AL_TRUE && index < globalsize) {
fade = (fade_t*) Malloc(sizeof(fade_t));
fade->index = index;
fade->quantity = quantity;
fade->type = direction;
-
+
#ifndef _WIN32
pthread_create(&thread, NULL, (void *)helper_fade, (void *)fade);
pthread_detach(thread);
@@ -357,6 +361,6 @@
void openal_setposition (uint32_t index, float x, float y, float z) {
- if (openalReady == AL_TRUE && index < globalsize)
+ if (isBridgeReady == AL_TRUE && index < globalsize)
alSource3f(Sources[index], AL_POSITION, x, y, z);;
}