diff --git a/src/client/sound/header/local.h b/src/client/sound/header/local.h index 01ae7eda..96479118 100644 --- a/src/client/sound/header/local.h +++ b/src/client/sound/header/local.h @@ -270,7 +270,7 @@ void SDL_Spatialize(channel_t *ch); /* Only begin attenuating sound volumes when outside the FULLVOLUME range */ - #define SOUND_FULLVOLUME 80 + #define SOUND_FULLVOLUME 1.0 #define SOUND_LOOPATTENUATE 0.003 /* number of buffers in flight (needed for ogg) */ diff --git a/src/client/sound/snd_al.c b/src/client/sound/snd_al.c index 1a15cf6f..00456e38 100644 --- a/src/client/sound/snd_al.c +++ b/src/client/sound/snd_al.c @@ -227,6 +227,7 @@ void AL_PlayChannel(channel_t *ch) { sfxcache_t *sc; + float vol; /* Debug */ if (s_show->value > 1) @@ -234,17 +235,24 @@ AL_PlayChannel(channel_t *ch) Com_Printf("%s: %s\n", __func__, ch->sfx->name); } + /* Clamp volume */ + vol = ch->oal_vol + s_volume->value; + + if (vol > 1.0f) + { + vol = 1.0f; + } + sc = ch->sfx->cache; ch->srcnum = s_srcnums[ch - channels]; qalGetError(); - qalSourcei(ch->srcnum, AL_BUFFER, sc->bufnum); - qalSourcei(ch->srcnum, AL_LOOPING, ch->autosound ? AL_TRUE : AL_FALSE); - qalSourcef(ch->srcnum, AL_GAIN, ch->oal_vol); - qalSourcef(ch->srcnum, AL_MAX_GAIN, s_openal_maxgain->value); qalSourcef(ch->srcnum, AL_REFERENCE_DISTANCE, SOUND_FULLVOLUME); qalSourcef(ch->srcnum, AL_MAX_DISTANCE, 8192); qalSourcef(ch->srcnum, AL_ROLLOFF_FACTOR, ch->dist_mult * (8192 - SOUND_FULLVOLUME)); + qalSourcef(ch->srcnum, AL_GAIN, vol); + qalSourcei(ch->srcnum, AL_BUFFER, sc->bufnum); + qalSourcei(ch->srcnum, AL_LOOPING, ch->autosound ? AL_TRUE : AL_FALSE); /* Spatialize it */ AL_Spatialize(ch); @@ -492,9 +500,13 @@ AL_RawSamples(int samples, int rate, int width, int channels, (samples * width * channels), rate); active_buffers++; - /* set volume */ + /* set volume */ + if (volume > 1.0f) + { + volume = 1.0f; + } + qalSourcef(streamSource, AL_GAIN, volume); - qalSourcef(streamSource, AL_MAX_GAIN, s_openal_maxgain->value); /* Shove the data onto the streamSource */ qalSourceQueueBuffers(streamSource, 1, &buffer); @@ -528,11 +540,13 @@ AL_Update(void) paintedtime = cl.time; /* set listener (player) parameters */ - qalListener3f(AL_POSITION, AL_UnpackVector(listener_origin)); AL_CopyVector(listener_forward, orientation); AL_CopyVector(listener_up, orientation + 3); - qalListenerfv(AL_ORIENTATION, orientation); + qalListenerf(AL_GAIN, s_volume->value); + qalListenerf(AL_MAX_GAIN, s_openal_maxgain->value); qalDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); + qalListener3f(AL_POSITION, AL_UnpackVector(listener_origin)); + qalListenerfv(AL_ORIENTATION, orientation); /* update spatialization for dynamic sounds */ ch = channels; diff --git a/src/client/sound/sound.c b/src/client/sound/sound.c index f01a34dc..869b8a86 100644 --- a/src/client/sound/sound.c +++ b/src/client/sound/sound.c @@ -583,6 +583,7 @@ S_IssuePlaysound(playsound_t *ps) #if USE_OPENAL if (sound_started == SS_OAL) { + /* This is clamped to 1.0 in AL_PlayChannel() */ ch->oal_vol = ps->volume * (s_volume->value); AL_PlayChannel(ch); }