]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_main.c
randomized loadingscreen pic (cvar: scr_loadingscreen_count, when 2 or above, randomi...
[xonotic/darkplaces.git] / snd_main.c
index 6bd0b361c93a4ce6bf4257248af1b8791dc7844e..2d456a4abfd881ed22f0df86595df9e073af7002 100644 (file)
@@ -1456,7 +1456,7 @@ void S_PlaySfxOnChannel (sfx_t *sfx, channel_t *target_chan, unsigned int flags,
 }
 
 
-int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation)
+int S_StartSound_StartPosition (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation, float startposition)
 {
        channel_t *target_chan, *check, *ch;
        int             ch_idx, startpos;
@@ -1493,16 +1493,19 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f
        // 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];
-       startpos = 0;
-       for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++)
+       startpos = (int)(startposition * S_GetSoundRate());
+       if (startpos == 0)
        {
-               if (check == target_chan)
-                       continue;
-               if (check->sfx == sfx && check->pos == 0)
+               for (ch_idx=NUM_AMBIENTS ; ch_idx < NUM_AMBIENTS + MAX_DYNAMIC_CHANNELS ; ch_idx++, check++)
                {
-                       // use negative pos offset to delay this sound effect
-                       startpos = (int)lhrandom(0, -0.1 * snd_renderbuffer->format.speed);
-                       break;
+                       if (check == target_chan)
+                               continue;
+                       if (check->sfx == sfx && check->pos == 0)
+                       {
+                               // use negative pos offset to delay this sound effect
+                               startpos = (int)lhrandom(0, -0.1 * snd_renderbuffer->format.speed);
+                               break;
+                       }
                }
        }
 
@@ -1511,6 +1514,11 @@ int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f
        return (target_chan - channels);
 }
 
+int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation)
+{
+       return S_StartSound_StartPosition(entnum, entchannel, sfx, origin, fvol, attenuation, 0);
+}
+
 void S_StopChannel (unsigned int channel_ind, qboolean lockmutex)
 {
        channel_t *ch;
@@ -1652,6 +1660,8 @@ float S_GetChannelPosition (unsigned int ch_ind)
        int s;
        channel_t *ch = &channels[ch_ind];
        sfx_t *sfx = ch->sfx;
+       if (!sfx)
+               return -1;
 
        s = ch->pos;
        /*
@@ -1884,6 +1894,7 @@ static void S_PaintAndSubmit (void)
        oldsoundtime = soundtime;
 
        cls.soundstats.latency_milliseconds = (snd_renderbuffer->endframe - snd_renderbuffer->startframe) * 1000 / snd_renderbuffer->format.speed;
+       R_TimeReport("audiomix");
 }
 
 /*
@@ -1970,6 +1981,7 @@ void S_Update(const matrix4x4_t *listenermatrix)
        S_UpdateAmbientSounds ();
 
        combine = NULL;
+       R_TimeReport("audioprep");
 
        // update spatialization for static and dynamic sounds
        cls.soundstats.totalsounds = 0;
@@ -2023,6 +2035,7 @@ void S_Update(const matrix4x4_t *listenermatrix)
                if (k < SND_LISTENERS)
                        cls.soundstats.mixedsounds++;
        }
+       R_TimeReport("audiospatialize");
 
        sound_spatialized = true;