cvar_t _snd_mixahead = {CVAR_SAVE, "_snd_mixahead", "0.1", "how much sound to mix ahead of time"};
cvar_t snd_streaming = { CVAR_SAVE, "snd_streaming", "1", "enables keeping compressed ogg sound files compressed, decompressing them only as needed, otherwise they will be decompressed completely at load (may use a lot of memory)"};
cvar_t snd_swapstereo = {CVAR_SAVE, "snd_swapstereo", "0", "swaps left/right speakers for old ISA soundblaster cards"};
+extern cvar_t v_flipped;
cvar_t snd_channellayout = {0, "snd_channellayout", "0", "channel layout. Can be 0 (auto - snd_restart needed), 1 (standard layout), or 2 (ALSA layout)"};
+cvar_t snd_mutewhenidle = {CVAR_SAVE, "snd_mutewhenidle", "1", "whether to disable sound output when game window is inactive"};
// Local cvars
static cvar_t nosound = {0, "nosound", "0", "disables sound"};
listeners = snd_speakerlayout.listeners;
// Swap the left and right channels if snd_swapstereo is set
- if (snd_swapstereo.integer)
+ if (boolxor(snd_swapstereo.integer, v_flipped.integer))
{
switch (snd_speakerlayout.channels)
{
(layout == SND_CHANNELLAYOUT_ALSA) ? "ALSA" : "standard");
}
- current_swapstereo = snd_swapstereo.integer;
+ current_swapstereo = boolxor(snd_swapstereo.integer, v_flipped.integer);
current_channellayout = snd_channellayout.integer;
current_channellayout_used = layout;
}
Cvar_RegisterVariable(&snd_speed);
Cvar_RegisterVariable(&snd_width);
Cvar_RegisterVariable(&snd_channels);
+ Cvar_RegisterVariable(&snd_mutewhenidle);
// COMMANDLINEOPTION: Sound: -nosound disables sound (including CD audio)
if (COM_CheckParm("-nosound"))
Cmd_AddCommand("soundlist", S_SoundList_f, "list loaded sounds");
Cmd_AddCommand("soundinfo", S_SoundInfo_f, "print sound system information (such as channels and speed)");
Cmd_AddCommand("snd_restart", S_Restart_f, "restart sound system");
- Cmd_AddCommand("snd_reload", S_Reload_f, "reload all sound files");
+ Cmd_AddCommand("snd_unloadallsounds", S_UnloadAllSounds_f, "unload all sound files");
Cvar_RegisterVariable(&nosound);
Cvar_RegisterVariable(&snd_precache);
/*
==================
-S_Reload_f
+S_UnloadAllSounds_f
==================
*/
-void S_Reload_f (void)
+void S_UnloadAllSounds_f (void)
{
int i;
Spatializes a channel
=================
*/
+extern cvar_t cl_gameplayfix_soundsmovewithentities;
void SND_Spatialize(channel_t *ch, qboolean isstatic)
{
int i;
vec3_t source_vec;
// update sound origin if we know about the entity
- if (ch->entnum > 0 && cls.state == ca_connected && cl.entities[ch->entnum].state_current.active)
+ if (ch->entnum > 0 && cls.state == ca_connected && cl_gameplayfix_soundsmovewithentities.integer)
{
- //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl.entities[ch->entnum].state_current.origin[0], cl.entities[ch->entnum].state_current.origin[1], cl.entities[ch->entnum].state_current.origin[2]);
- VectorCopy(cl.entities[ch->entnum].state_current.origin, ch->origin);
- if (cl.entities[ch->entnum].state_current.modelindex && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex] && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->soundfromcenter)
- VectorMAMAM(1.0f, ch->origin, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmins, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmaxs, ch->origin);
+ if (ch->entnum >= 32768)
+ {
+ // TODO: sounds that follow CSQC entities?
+ }
+ else if (cl.entities[ch->entnum].state_current.active)
+ {
+ //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl.entities[ch->entnum].state_current.origin[0], cl.entities[ch->entnum].state_current.origin[1], cl.entities[ch->entnum].state_current.origin[2]);
+ VectorCopy(cl.entities[ch->entnum].state_current.origin, ch->origin);
+ if (cl.entities[ch->entnum].state_current.modelindex && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex] && cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->soundfromcenter)
+ VectorMAMAM(1.0f, ch->origin, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmins, 0.5f, cl.model_precache[cl.entities[ch->entnum].state_current.modelindex]->normalmaxs, ch->origin);
+ }
}
mastervol = ch->master_vol;
if (sfx->fetcher == NULL)
return -1;
- if (entnum && entnum >= cl.max_entities)
- CL_ExpandEntities(entnum);
-
// Pick a channel to play on
target_chan = SND_PickChannel(entnum, entchannel);
if (!target_chan)
{
snd_fetcher_endsb_t fetcher_endsb = sfx->fetcher->endsb;
if (fetcher_endsb != NULL)
- fetcher_endsb (ch);
+ fetcher_endsb (&ch->fetcher_data);
}
// Remove the lock it holds
return;
// If snd_swapstereo or snd_channellayout has changed, recompute the channel layout
- if (current_swapstereo != snd_swapstereo.integer ||
+ if (current_swapstereo != boolxor(snd_swapstereo.integer, v_flipped.integer) ||
current_channellayout != snd_channellayout.integer)
S_SetChannelLayout();