diff -r bcd6d76db4f7 -r e5403e2bf02c misc/openalbridge/openalbridge.c --- 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);; }