From d13f9cb4e4f18a6cf5f51e77ce19abd95dd0c429 Mon Sep 17 00:00:00 2001 From: driAn Date: Sat, 17 May 2008 18:31:35 +0000 Subject: [PATCH] underwater sound, fixed stereo wav loading problem git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@2011 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/sound.cpp | 48 ++++++++++++++++++++++++++++++++------------ source/src/sound.h | 1 + 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/source/src/sound.cpp b/source/src/sound.cpp index 3ac836da..da1a0951 100644 --- a/source/src/sound.cpp +++ b/source/src/sound.cpp @@ -315,22 +315,28 @@ struct sbuffer else { SDL_AudioSpec wavspec; - /*size_t*/Uint32 wavlen; // 64-bit fix (flowtron) [2008-05-14] - uchar *wavbuf; + uint32_t wavlen; + uint8_t *wavbuf; if(!SDL_LoadWAV(file, &wavspec, &wavbuf, &wavlen)) continue; ALenum format; - switch(wavspec.freq) // map format definitions from SDL to OpenAL + switch(wavspec.format) // map wav header to openal format { - case AUDIO_U8: format = AL_FORMAT_STEREO8; break; - case AUDIO_S8: format = AL_FORMAT_MONO8; break; - case AUDIO_U16: format = AL_FORMAT_STEREO16; break; - case AUDIO_S16: format = AL_FORMAT_MONO16; break; - default: format = AL_FORMAT_MONO16; + case AUDIO_U8: + case AUDIO_S8: + format = wavspec.channels==2 ? AL_FORMAT_STEREO8 : AL_FORMAT_MONO8; + break; + case AUDIO_U16: + case AUDIO_S16: + format = wavspec.channels==2 ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16; + break; + default: + SDL_FreeWAV(wavbuf); + return false; } - alBufferData(id, format, wavbuf, (ALsizei) wavlen, wavspec.freq); + alBufferData(id, format, wavbuf, wavlen, wavspec.freq); SDL_FreeWAV(wavbuf); if(alerr()) break; @@ -741,6 +747,8 @@ location *findsoundloc(int sound, physent *p) void updateplayerfootsteps(playerent *p, int sound) { + if(!p) return; + const int footstepradius = 16, footstepalign = 15; location *loc = findsoundloc(sound, p); bool local = (p == camera1); @@ -749,7 +757,7 @@ void updateplayerfootsteps(playerent *p, int sound) { if(!loc) // not yet playing, start it { - if(local) playsound(sound, p); + if(local) playsound(sound, p, NULL, NULL, SP_HIGH); else { // sync to model animation @@ -777,13 +785,24 @@ void updateplayerfootsteps(playerent *p, int sound) else if(loc) loc->reset(); // out of range, stop it } +void updateplayerunderwater(playerent *p) +{ + if(!p) return; + bool water = p->inwater; + location *l = findsoundloc(S_UNDERWATER, p); + if(p==player1) + { + if(!l && water) playsound(S_UNDERWATER, p, NULL, NULL, SP_HIGH); // start + else if(l && !water) l->reset(); // stop + } + // put other water sounds here +} + void checkplayerloopsounds() { - // local player + // footsteps updateplayerfootsteps(player1, S_FOOTSTEPS); updateplayerfootsteps(player1, S_FOOTSTEPSCROUCH); - - // others loopv(players) { playerent *p = players[i]; @@ -791,6 +810,9 @@ void checkplayerloopsounds() updateplayerfootsteps(p, S_FOOTSTEPS); updateplayerfootsteps(p, S_FOOTSTEPSCROUCH); } + + // water + updateplayerunderwater(player1); } void updatevol() diff --git a/source/src/sound.h b/source/src/sound.h index d88f49fa..824798a3 100644 --- a/source/src/sound.h +++ b/source/src/sound.h @@ -23,6 +23,7 @@ enum S_CALLVOTE, S_VOTEPASS, S_VOTEFAIL, S_FOOTSTEPS, S_FOOTSTEPSCROUCH, S_MENUSELECT, S_MENUENTER, + S_UNDERWATER, S_AFFIRMATIVE, S_ALLRIGHTSIR, S_COMEONMOVE,