X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=snd_main.c;h=2c32953ab92a991b5006a3672727108605b17aa1;hb=d31818f744b04cb55e33158ea41760571eb20e2c;hp=bed848683f79fee32c6985bf26f02f5753b9e071;hpb=84661191e0819cf88c208b4ad314fcd23e8e1fbd;p=xonotic%2Fdarkplaces.git diff --git a/snd_main.c b/snd_main.c index bed84868..2c32953a 100644 --- a/snd_main.c +++ b/snd_main.c @@ -146,7 +146,6 @@ static double snd_starttime = 0.0; vec3_t listener_origin; matrix4x4_t listener_matrix[SND_LISTENERS]; -vec_t sound_nominal_clip_dist=1000.0; mempool_t *snd_mempool; // Linked list of known sfx @@ -168,6 +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)"}; // 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"}; @@ -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); @@ -736,6 +737,7 @@ void S_Init(void) Cvar_RegisterVariable(&_snd_mixahead); Cvar_RegisterVariable(&snd_swapstereo); // for people with backwards sound wiring Cvar_RegisterVariable(&snd_channellayout); + Cvar_RegisterVariable(&snd_soundradius); Cvar_SetValueQuick(&snd_initialized, true); @@ -769,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 @@ -788,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; @@ -894,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; } @@ -924,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); @@ -1140,10 +1173,10 @@ void S_PlaySfxOnChannel (sfx_t *sfx, channel_t *target_chan, unsigned int flags, { if (sfx->loopstart == -1) Con_DPrintf("Quake compatibility warning: Static sound \"%s\" is not looped\n", sfx->name); - target_chan->dist_mult = attenuation / (64.0f * sound_nominal_clip_dist); + target_chan->dist_mult = attenuation / (64.0f * snd_soundradius.value); } else - target_chan->dist_mult = attenuation / sound_nominal_clip_dist; + target_chan->dist_mult = attenuation / snd_soundradius.value; // Lock the SFX during play S_LockSfx (sfx); @@ -1257,6 +1290,7 @@ void S_StopSound(int entnum, int entchannel) } } +extern void CDAudio_Stop(void); void S_StopAllSounds (void) { unsigned int i; @@ -1265,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); @@ -1391,11 +1428,11 @@ static void S_PaintAndSubmit (void) if (snd_renderbuffer == NULL || nosound.integer) return; - if (snd_blocked > 0 && !cls.capturevideo.soundfile) + if (snd_blocked > 0 && !(cls.capturevideo.soundrate && !cls.capturevideo.realtime)) return; // Update sound time - if (cls.capturevideo.soundfile) // SUPER NASTY HACK to record non-realtime sound + 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); @@ -1405,7 +1442,7 @@ static void S_PaintAndSubmit (void) newsoundtime += extrasoundtime; if (newsoundtime < soundtime) { - if ((cls.capturevideo.soundfile != NULL) != recording_sound) + if ((cls.capturevideo.soundrate != 0) != recording_sound) { unsigned int additionaltime; @@ -1427,7 +1464,7 @@ static void S_PaintAndSubmit (void) newsoundtime, soundtime); } soundtime = newsoundtime; - recording_sound = (cls.capturevideo.soundfile != NULL); + recording_sound = (cls.capturevideo.soundrate != 0); // Check to make sure that we haven't overshot paintedtime = snd_renderbuffer->endframe; @@ -1464,7 +1501,7 @@ void S_Update(const matrix4x4_t *listenermatrix) if (snd_renderbuffer == NULL || nosound.integer) return; - if (snd_blocked > 0 && !cls.capturevideo.soundfile) + if (snd_blocked > 0 && !(cls.capturevideo.soundrate && !cls.capturevideo.realtime)) return; // If snd_swapstereo or snd_channellayout has changed, recompute the channel layout