]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_main.c
eliminated channel_t reference in OGG_FetchEnd
[xonotic/darkplaces.git] / snd_main.c
index 1734baeac2246df6ed7e55c73ebcc865dd6efcb2..f5991953792951d75922b3c45ad7d2b1d98d9400 100644 (file)
@@ -173,7 +173,9 @@ cvar_t snd_soundradius = {0, "snd_soundradius", "2000", "radius of weapon sounds
 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"};
@@ -400,7 +402,7 @@ static void S_SetChannelLayout (void)
        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)
                {
@@ -454,7 +456,7 @@ static void S_SetChannelLayout (void)
                                   (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;
 }
@@ -706,6 +708,7 @@ void S_Init(void)
        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"))
@@ -724,7 +727,7 @@ void S_Init(void)
        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);
@@ -773,10 +776,10 @@ void S_Terminate (void)
 
 /*
 ==================
-S_Reload_f
+S_UnloadAllSounds_f
 ==================
 */
-void S_Reload_f (void)
+void S_UnloadAllSounds_f (void)
 {
        int i;
 
@@ -1099,6 +1102,7 @@ SND_Spatialize
 Spatializes a channel
 =================
 */
+extern cvar_t cl_gameplayfix_soundsmovewithentities;
 void SND_Spatialize(channel_t *ch, qboolean isstatic)
 {
        int i;
@@ -1106,12 +1110,19 @@ void SND_Spatialize(channel_t *ch, qboolean isstatic)
        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;
@@ -1192,9 +1203,6 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f
        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)
@@ -1240,7 +1248,7 @@ void S_StopChannel (unsigned int channel_ind)
                {
                        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
@@ -1524,7 +1532,7 @@ void S_Update(const matrix4x4_t *listenermatrix)
                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();