]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_main.c
fixed a reference to sv.models in client code (should have been
[xonotic/darkplaces.git] / snd_main.c
index 2c32953ab92a991b5006a3672727108605b17aa1..919553b7abbdc6f42d043a389cbfbe2ea317de66 100644 (file)
@@ -167,7 +167,7 @@ cvar_t bgmvolume = {CVAR_SAVE, "bgmvolume", "1", "volume of background music (su
 cvar_t volume = {CVAR_SAVE, "volume", "0.7", "volume of sound effects"};
 cvar_t snd_initialized = { CVAR_READONLY, "snd_initialized", "0", "indicates the sound subsystem is active"};
 cvar_t snd_staticvolume = {CVAR_SAVE, "snd_staticvolume", "1", "volume of ambient sound effects (such as swampy sounds at the start of e1m2)"};
-cvar_t snd_soundradius = {0, "snd_soundradius", "1000", "radius of weapon sounds and other standard sound effects (monster idle noises are half this radius and flickering light noises are one third of this radius)"};
+cvar_t snd_soundradius = {0, "snd_soundradius", "2000", "radius of weapon sounds and other standard sound effects (monster idle noises are half this radius and flickering light noises are one third of this radius)"};
 
 // Cvars declared in snd_main.h (shared with other snd_*.c files)
 cvar_t _snd_mixahead = {CVAR_SAVE, "_snd_mixahead", "0.1", "how much sound to mix ahead of time"};
@@ -708,7 +708,7 @@ void S_Init(void)
        Cvar_RegisterVariable(&snd_channels);
 
 // COMMANDLINEOPTION: Sound: -nosound disables sound (including CD audio)
-       if (COM_CheckParm("-nosound") || COM_CheckParm("-safe"))
+       if (COM_CheckParm("-nosound"))
                return;
 
        snd_mempool = Mem_AllocPool("sound", 0, NULL);
@@ -1403,17 +1403,20 @@ void S_UpdateAmbientSounds (void)
 
                // Don't adjust volume too fast
                // FIXME: this rounds off to an int each frame, meaning there is little to no fade at extremely high framerates!
-               if (chan->master_vol < vol)
+               if (cl.time > cl.oldtime)
                {
-                       chan->master_vol += (int)(cl.realframetime * ambient_fade.value);
-                       if (chan->master_vol > vol)
-                               chan->master_vol = vol;
-               }
-               else if (chan->master_vol > vol)
-               {
-                       chan->master_vol -= (int)(cl.realframetime * ambient_fade.value);
                        if (chan->master_vol < vol)
-                               chan->master_vol = vol;
+                       {
+                               chan->master_vol += (int)((cl.time - cl.oldtime) * ambient_fade.value);
+                               if (chan->master_vol > vol)
+                                       chan->master_vol = vol;
+                       }
+                       else if (chan->master_vol > vol)
+                       {
+                               chan->master_vol -= (int)((cl.time - cl.oldtime) * ambient_fade.value);
+                               if (chan->master_vol < vol)
+                                       chan->master_vol = vol;
+                       }
                }
 
                for (i = 0;i < SND_LISTENERS;i++)
@@ -1424,20 +1427,48 @@ void S_UpdateAmbientSounds (void)
 static void S_PaintAndSubmit (void)
 {
        unsigned int newsoundtime, paintedtime, endtime, maxtime, usedframes;
+       qboolean usesoundtimehack;
+       static qboolean soundtimehack = true;
 
        if (snd_renderbuffer == NULL || nosound.integer)
                return;
 
-       if (snd_blocked > 0 && !(cls.capturevideo.soundrate && !cls.capturevideo.realtime))
-               return;
-
        // Update sound time
-       if (cls.capturevideo.soundrate && !cls.capturevideo.realtime) // SUPER NASTY HACK to record non-realtime sound
+       usesoundtimehack = true;
+       if (cls.timedemo) // SUPER NASTY HACK to mix non-realtime sound for more reliable benchmarking
+               newsoundtime = (unsigned int)((double)cl.mtime[0] * (double)snd_renderbuffer->format.speed);
+       else if (cls.capturevideo.soundrate && !cls.capturevideo.realtime) // SUPER NASTY HACK to record non-realtime sound
                newsoundtime = (unsigned int)((double)cls.capturevideo.frame * (double)snd_renderbuffer->format.speed / (double)cls.capturevideo.framerate);
        else if (simsound)
                newsoundtime = (unsigned int)((realtime - snd_starttime) * (double)snd_renderbuffer->format.speed);
        else
+       {
                newsoundtime = SndSys_GetSoundTime();
+               usesoundtimehack = false;
+       }
+       // if the soundtimehack state changes we need to reset the soundtime
+       if (soundtimehack != usesoundtimehack)
+       {
+               snd_renderbuffer->startframe = snd_renderbuffer->endframe = soundtime = newsoundtime;
+
+               // Mute the contents of the submission buffer
+               if (simsound || SndSys_LockRenderBuffer ())
+               {
+                       int clear;
+                       size_t memsize;
+
+                       clear = (snd_renderbuffer->format.width == 1) ? 0x80 : 0;
+                       memsize = snd_renderbuffer->maxframes * snd_renderbuffer->format.width * snd_renderbuffer->format.channels;
+                       memset(snd_renderbuffer->ring, clear, memsize);
+
+                       if (!simsound)
+                               SndSys_UnlockRenderBuffer ();
+               }
+       }
+       soundtimehack = usesoundtimehack;
+
+       if (!soundtimehack && snd_blocked > 0)
+               return;
 
        newsoundtime += extrasoundtime;
        if (newsoundtime < soundtime)
@@ -1459,7 +1490,7 @@ static void S_PaintAndSubmit (void)
                        Con_DPrintf("S_PaintAndSubmit: new extra sound time = %u\n",
                                                extrasoundtime);
                }
-               else
+               else if (!soundtimehack)
                        Con_Printf("S_PaintAndSubmit: WARNING: newsoundtime < soundtime (%u < %u)\n",
                                           newsoundtime, soundtime);
        }
@@ -1501,9 +1532,6 @@ void S_Update(const matrix4x4_t *listenermatrix)
        if (snd_renderbuffer == NULL || nosound.integer)
                return;
 
-       if (snd_blocked > 0 && !(cls.capturevideo.soundrate && !cls.capturevideo.realtime))
-               return;
-
        // If snd_swapstereo or snd_channellayout has changed, recompute the channel layout
        if (current_swapstereo != snd_swapstereo.integer ||
                current_channellayout != snd_channellayout.integer)