From f9c778358cec828332ff5f18ea567f224ebd086a Mon Sep 17 00:00:00 2001 From: Allanis Date: Tue, 26 Feb 2013 13:54:41 +0000 Subject: [PATCH] [Fix] Allow for gameplay even if sound isn't working. --- src/music.c | 4 ++++ src/outfit.c | 7 ++++++- src/sound.c | 58 +++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/music.c b/src/music.c index e901c1e..c07727e 100644 --- a/src/music.c +++ b/src/music.c @@ -266,6 +266,8 @@ static void music_free(void) { } void music_volume(const double vol) { + if(sound_lock == NULL) return; + // Sanity check! ALfloat fvol = ABS(vol); if(fvol > 1.) fvol = 1.; @@ -282,6 +284,8 @@ void music_volume(const double vol) { // Music control functions. void music_load(const char* name) { + if(sound_lock == NULL) return; + int i; char tmp[64]; diff --git a/src/outfit.c b/src/outfit.c index cbb8160..7f28edc 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -1,6 +1,8 @@ #include #include +#include "SDL_thread.h" + #include "lephisto.h" #include "log.h" #include "pack.h" @@ -15,6 +17,9 @@ #define OUTFIT_DATA "../dat/outfit.xml" #define OUTFIT_GFX "../gfx/outfit/" +extern SDL_mutex* sound_lock; // Sound.c + +// The Stack. static Outfit* outfit_stack = NULL; static int outfits = 0; @@ -174,7 +179,7 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) { } while((node = node->next)); #define MELEMENT(o,s) if(o) WARN("Outfit '%s' missing '"s"' element", tmp->name) MELEMENT(tmp->gfx_space == NULL, "gfx"); - MELEMENT(tmp->sound==0, "sound"); + MELEMENT((sound_lock != NULL) && (tmp->sound == 0), "sound"); MELEMENT(tmp->thrust==0, "thrust"); MELEMENT(tmp->turn==0, "turn"); MELEMENT(tmp->speed==0, "speed"); diff --git a/src/sound.c b/src/sound.c index 5c43c97..575bb52 100644 --- a/src/sound.c +++ b/src/sound.c @@ -33,7 +33,7 @@ typedef struct { #define voice_is(v,f) ((v)->flags & f) // Global sound lock. -SDL_mutex* sound_lock; +SDL_mutex* sound_lock = NULL; // Gobal device and context. static ALCcontext* al_context = NULL; @@ -77,7 +77,7 @@ int sound_init(void) { // Create the OpenAL context. al_context = alcCreateContext(al_device, NULL); - if(al_context == NULL) { + if(sound_lock == NULL) { WARN("Unable to create OpenAL context"); ret = -2; goto snderr_ctx; @@ -119,6 +119,7 @@ snderr_dev: al_device = NULL; SDL_mutexV(sound_lock); SDL_DestroyMutex(sound_lock); + sound_lock = NULL; return ret; } @@ -135,25 +136,31 @@ void sound_exit(void) { // Must stop the music before killing it, // then thread should commit suicide. - music_stop(); - music_kill(); - SDL_WaitThread(music_player, NULL); - music_exit(); - - SDL_mutexP(sound_lock); - - if(al_context) { - alcMakeContextCurrent(NULL); - alcDestroyContext(al_context); + if(music_player) { + music_stop(); + music_kill(); + SDL_WaitThread(music_player, NULL); + music_exit(); } - if(al_device) alcCloseDevice(al_device); - SDL_mutexV(sound_lock); - SDL_DestroyMutex(sound_lock); + if(sound_lock) { + SDL_mutexP(sound_lock); + + if(al_context) { + alcMakeContextCurrent(NULL); + alcDestroyContext(al_context); + } + if(al_device) alcCloseDevice(al_device); + + SDL_mutexV(sound_lock); + SDL_DestroyMutex(sound_lock); + } } // Get the buffer to sound of [name]. ALuint sound_get(char* name) { + if(sound_lock == NULL) return 0; + int i; for(i = 0; i < nsound_list; i++) if(strcmp(name, sound_list[i].name)==0) @@ -164,6 +171,8 @@ ALuint sound_get(char* name) { // Make list of available sounds. static int sound_makeList(void) { + if(sound_lock == NULL) return 0; + char** files; uint32_t nfiles, i; char tmp[64]; @@ -203,6 +212,8 @@ static int sound_makeList(void) { // Loads a sound into the sound_list. static int sound_load(ALuint* buffer, char* filename) { + if(sound_lock == NULL) return 0; + void* wavdata; unsigned int size; ALenum err; @@ -230,6 +241,8 @@ static int sound_load(ALuint* buffer, char* filename) { } static void sound_free(alSound* snd) { + if(sound_lock) return; + SDL_mutexP(sound_lock); if(snd->name) free(snd->name); @@ -240,6 +253,7 @@ static void sound_free(alSound* snd) { // Update the sounds and prioritize them. void sound_update(void) { + if(sound_lock == NULL) return; int i; // TODO: Prioritize the things. @@ -261,6 +275,8 @@ void sound_update(void) { // Set all the sounds volume to vol. void sound_volume(const double vol) { + if(sound_lock == NULL) return; + int i; svolume = (ALfloat) vol; @@ -274,6 +290,7 @@ void sound_volume(const double vol) { // Attempt to alloc a source for a voice. static int voice_getSource(alVoice* voc) { + if(sound_lock == NULL) return -1; int ret; ALenum err; @@ -314,7 +331,7 @@ static int voice_getSource(alVoice* voc) { } SDL_mutexV(sound_lock); - return 0; + return ret; } alVoice* sound_addVoice(int priority, double px, double py, double vx, double vy, @@ -323,6 +340,8 @@ alVoice* sound_addVoice(int priority, double px, double py, double vx, double vy (void)vx; (void)vy; + if(sound_lock == NULL) return NULL; + alVoice* voc; nvoice_stack++; @@ -348,6 +367,7 @@ alVoice* sound_addVoice(int priority, double px, double py, double vx, double vy } void sound_delVoice(alVoice* voice) { + if(sound_lock == NULL) return; ALint stat; int i; @@ -381,6 +401,9 @@ void sound_delVoice(alVoice* voice) { void voice_update(alVoice* voice, double px, double py, double vx, double vy) { (void) vx; (void) vy; + + if(sound_lock == NULL) return; + voice->px = px; voice->py = py; //voice->vx = vx; @@ -390,6 +413,9 @@ void voice_update(alVoice* voice, double px, double py, double vx, double vy) { void sound_listener(double dir, double px, double py, double vx, double vy) { (void)vx; (void)vy; + + if(sound_lock == NULL) return; + SDL_mutexP(sound_lock); ALfloat ori[] = { 0., 0., 0., 0., 0., 1. };