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
This commit is contained in:
driAn
2008-05-17 18:31:35 +00:00
parent 7da09a259f
commit d13f9cb4e4
2 changed files with 36 additions and 13 deletions
+35 -13
View File
@@ -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()