]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_main.c
made CL_SetInfo check for more forbidden characters (key now refuses any form of...
[xonotic/darkplaces.git] / snd_main.c
index 3273355c56b26c7dd0d56c3edf0dc4319f21a585..2c32953ab92a991b5006a3672727108605b17aa1 100644 (file)
@@ -724,6 +724,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");
 
        Cvar_RegisterVariable(&nosound);
        Cvar_RegisterVariable(&snd_precache);
@@ -770,6 +771,28 @@ void S_Terminate (void)
 }
 
 
+/*
+==================
+S_Reload_f
+==================
+*/
+void S_Reload_f (void)
+{
+       int i;
+
+       // stop any active sounds
+       S_StopAllSounds();
+
+       // because the ambient sounds will be freed, clear the pointers
+       for (i = 0;i < (int)sizeof (ambient_sfxs) / (int)sizeof (ambient_sfxs[0]);i++)
+               ambient_sfxs[i] = NULL;
+
+       // now free all sounds
+       while (known_sfx != NULL)
+               S_FreeSfx (known_sfx, true);
+}
+
+
 /*
 ==================
 S_FindName
@@ -789,6 +812,7 @@ sfx_t *S_FindName (const char *name)
        }
 
        // Look for this sound in the list of known sfx
+       // TODO: hash table search?
        for (sfx = known_sfx; sfx != NULL; sfx = sfx->next)
                if(!strcmp (sfx->name, name))
                        return sfx;
@@ -895,6 +919,9 @@ void S_ServerSounds (char serversound [][MAX_QPATH], unsigned int numsounds)
                sfx = S_FindName (serversound[i]);
                if (sfx != NULL)
                {
+                       // clear the FILEMISSING flag so that S_LoadSound will try again on a
+                       // previously missing file
+                       sfx->flags &= ~ SFXFLAG_FILEMISSING;
                        S_LockSfx (sfx);
                        sfx->flags |= SFXFLAG_SERVERSOUND;
                }
@@ -925,9 +952,14 @@ sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean lock)
                return NULL;
 
        sfx = S_FindName (name);
+
        if (sfx == NULL)
                return NULL;
 
+       // clear the FILEMISSING flag so that S_LoadSound will try again on a
+       // previously missing file
+       sfx->flags &= ~ SFXFLAG_FILEMISSING;
+
        if (lock)
                S_LockSfx (sfx);
 
@@ -1258,6 +1290,7 @@ void S_StopSound(int entnum, int entchannel)
                }
 }
 
+extern void CDAudio_Stop(void);
 void S_StopAllSounds (void)
 {
        unsigned int i;
@@ -1266,6 +1299,9 @@ void S_StopAllSounds (void)
        if (snd_renderbuffer == NULL)
                return;
 
+       // stop CD audio because it may be using a faketrack
+       CDAudio_Stop();
+
        for (i = 0; i < total_channels; i++)
                S_StopChannel (i);