cvar_t bgmvolume = {CVAR_SAVE, "bgmvolume", "1"};
cvar_t volume = {CVAR_SAVE, "volume", "0.7"};
+cvar_t snd_staticvolume = {CVAR_SAVE, "snd_staticvolume", "1"};
cvar_t nosound = {0, "nosound", "0"};
cvar_t snd_precache = {0, "snd_precache", "1"};
*/
void S_Init (void)
{
- Con_Printf("\nSound Initialization\n");
+ Con_DPrintf("\nSound Initialization\n");
S_RawSamples_ClearQueue();
Cvar_RegisterVariable(&volume);
Cvar_RegisterVariable(&bgmvolume);
+ Cvar_RegisterVariable(&snd_staticvolume);
if (COM_CheckParm("-nosound") || COM_CheckParm("-safe"))
return;
if (!sound_started)
return;
- Con_Printf ("Sound sampling rate: %i\n", shm->speed);
+ Con_DPrintf ("Sound sampling rate: %i\n", shm->speed);
// provides a tick sound until washed clean
*/
channel_t *SND_PickChannel(int entnum, int entchannel)
{
- int ch_idx;
- int first_to_die;
- int life_left;
+ int ch_idx;
+ int first_to_die;
+ int life_left;
// Check for replacement sound, or find the best one to replace
- first_to_die = -1;
- life_left = 0x7fffffff;
- for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++)
- {
+ first_to_die = -1;
+ life_left = 0x7fffffff;
+ for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++)
+ {
if (entchannel != 0 // channel 0 never overrides
&& channels[ch_idx].entnum == entnum
&& (channels[ch_idx].entchannel == entchannel || entchannel == -1) )
life_left = channels[ch_idx].end - paintedtime;
first_to_die = ch_idx;
}
- }
+ }
if (first_to_die == -1)
return NULL;
if (channels[first_to_die].sfx)
channels[first_to_die].sfx = NULL;
- return &channels[first_to_die];
+ return &channels[first_to_die];
}
/*
SND_Spatialize
=================
*/
-void SND_Spatialize(channel_t *ch)
+void SND_Spatialize(channel_t *ch, int isstatic)
{
- vec_t dot;
- vec_t dist;
- vec_t lscale, rscale, scale;
- vec3_t source_vec;
+ vec_t dot;
+ vec_t dist;
+ vec_t lscale, rscale, scale;
+ vec3_t source_vec;
sfx_t *snd;
// anything coming from the view entity will always be full volume
{
ch->leftvol = ch->master_vol;
ch->rightvol = ch->master_vol;
- return;
}
+ else
+ {
+ // calculate stereo seperation and distance attenuation
+ snd = ch->sfx;
+ VectorSubtract(ch->origin, listener_origin, source_vec);
-// calculate stereo seperation and distance attenuation
+ dist = VectorNormalizeLength(source_vec) * ch->dist_mult;
- snd = ch->sfx;
- VectorSubtract(ch->origin, listener_origin, source_vec);
+ dot = DotProduct(listener_right, source_vec);
- dist = VectorNormalizeLength(source_vec) * ch->dist_mult;
+ if (shm->channels == 1)
+ {
+ rscale = 1.0;
+ lscale = 1.0;
+ }
+ else
+ {
+ rscale = 1.0 + dot;
+ lscale = 1.0 - dot;
+ }
- dot = DotProduct(listener_right, source_vec);
+ // add in distance effect
+ scale = (1.0 - dist) * rscale;
+ ch->rightvol = (int) (ch->master_vol * scale);
+ if (ch->rightvol < 0)
+ ch->rightvol = 0;
- if (shm->channels == 1)
- {
- rscale = 1.0;
- lscale = 1.0;
+ scale = (1.0 - dist) * lscale;
+ ch->leftvol = (int) (ch->master_vol * scale);
+ if (ch->leftvol < 0)
+ ch->leftvol = 0;
}
- else
+ // LordHavoc: allow adjusting volume of static sounds
+ if (isstatic)
{
- rscale = 1.0 + dot;
- lscale = 1.0 - dot;
+ ch->leftvol *= snd_staticvolume.value;
+ ch->rightvol *= snd_staticvolume.value;
}
-
-// add in distance effect
- scale = (1.0 - dist) * rscale;
- ch->rightvol = (int) (ch->master_vol * scale);
- if (ch->rightvol < 0)
- ch->rightvol = 0;
-
- scale = (1.0 - dist) * lscale;
- ch->leftvol = (int) (ch->master_vol * scale);
- if (ch->leftvol < 0)
- ch->leftvol = 0;
}
target_chan->sfx = sfx;
target_chan->pos = 0.0;
- target_chan->end = paintedtime + sc->length;
+ target_chan->end = paintedtime + sc->length;
// if an identical sound has also been started this frame, offset the pos
// a bit to keep it from just making the first one louder
check = &channels[NUM_AMBIENTS];
- for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++)
- {
+ for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++)
+ {
if (check == target_chan)
continue;
if (check->sfx == sfx && !check->pos)
VectorCopy (origin, ss->origin);
ss->master_vol = vol;
ss->dist_mult = (attenuation/64) / sound_nominal_clip_dist;
- ss->end = paintedtime + sc->length;
+ ss->end = paintedtime + sc->length;
SND_Spatialize (ss);
}
{
if (!ch->sfx)
continue;
- SND_Spatialize(ch); // respatialize channel
+ SND_Spatialize(ch, i > MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS); // respatialize channel
if (!ch->leftvol && !ch->rightvol)
continue;