/* * S_Init */ static bool S_Init( void *hwnd, int maxEntities, bool verbose ) { if( !SNDDMA_Init( hwnd, verbose ) ) return false; s_active = true; s_last_update_time = 0; if( verbose ) Com_Printf( "Sound sampling rate: %i\n", dma.speed ); SNDOGG_Init( verbose ); num_loopsfx = 0; memset( raw_sounds, 0, sizeof( raw_sounds ) ); S_InitScaletable(); // highfrequency attenuation filter s_lpf_cw = S_LowpassCW( HQ_HF_FREQUENCY, dma.speed ); S_ClearSoundTime(); S_StopAllSounds( true, true ); S_LockBackgroundTrack( false ); return true; }
/* ===================== CL_ClearState ===================== */ void CL_ClearState (void) { int i; S_StopAllSounds (true); Con_DPrintf ("Clearing memory\n"); D_FlushCaches (); Mod_ClearAll (); if (host_hunklevel) // FIXME: check this... Hunk_FreeToLowMark (host_hunklevel); CL_ClearTEnts (); // wipe the entire cl structure memset (&cl, 0, sizeof(cl)); SZ_Clear (&cls.netchan.message); // clear other arrays memset (cl_efrags, 0, sizeof(cl_efrags)); memset (cl_dlights, 0, sizeof(cl_dlights)); memset (cl_lightstyle, 0, sizeof(cl_lightstyle)); // // allocate the efrags and chain together into a free list // cl.free_efrags = cl_efrags; for (i=0 ; i<MAX_EFRAGS-1 ; i++) cl.free_efrags[i].entnext = &cl.free_efrags[i+1]; cl.free_efrags[i].entnext = NULL; }
/* ============ VID_CheckChanges This function gets called once just before drawing each frame, and it's sole purpose in life is to check to see if any of the video mode parameters have changed, and if they have to update the rendering DLL and/or video mode to match. ============ */ void VID_CheckChanges (void) { if ( vid_restart ) { cl.force_refdef = true; // can't use a paused refdef S_StopAllSounds(); /* ** refresh has changed */ vid_fullscreen->modified = true; cl.refresh_prepped = false; cls.disable_screen = true; VID_Shutdown(); Com_Printf( "--------- [Loading Renderer] ---------\n" ); vid_active = true; if ( R_Init( 0, 0 ) == -1 ) { R_Shutdown(); Com_Error (ERR_FATAL, "Couldn't initialize renderer!"); } Com_Printf( "------------------------------------\n"); vid_restart = false; cls.disable_screen = false; IN_Activate(false); IN_Activate(true); } }
void GetSoundtime (void) { int samplepos; static int buffers; static int oldsamplepos; int fullsamples; fullsamples = dma.samples / dma.channels; if(CL_VideoRecording()) { soundtime += (int)(0.5 + cls.frametime * dma.speed); return; } // it is possible to miscount buffers if it has wrapped twice between // calls to S_Update. Oh well. samplepos = SNDDMA_GetDMAPos(); if (samplepos < oldsamplepos) { buffers++; // buffer wrapped if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds (true); } } oldsamplepos = samplepos; soundtime = buffers*fullsamples + samplepos/dma.channels; }
/* ===================== CL_Disconnect Sends a disconnect message to the server This is also called on Host_Error, so it shouldn't cause any errors ===================== */ void CL_Disconnect(void) { // stop sounds (especially looping!) S_StopAllSounds(true); /* Clear up view, remove palette shift */ scr_centertime_off = 0; cl.cshifts[0].percent = 0; VID_SetPalette(host_basepal); // if running a local server, shut it down if (cls.demoplayback) CL_StopPlayback(); else if (cls.state >= ca_connected) { if (cls.demorecording) CL_Stop_f(); Con_DPrintf("Sending clc_disconnect\n"); SZ_Clear(&cls.message); MSG_WriteByte(&cls.message, clc_disconnect); NET_SendUnreliableMessage(cls.netcon, &cls.message); SZ_Clear(&cls.message); NET_Close(cls.netcon); cls.state = ca_disconnected; if (sv.active) Host_ShutdownServer(false); } cls.demoplayback = false; cls.timedemo = false; cls.signon = 0; cl.intermission = 0; /* FIXME - for SCR_UpdateScreen */ }
qboolean SV_NewGame( const char *mapName, qboolean loadGame ) { if( !loadGame ) { if( !SV_MapIsValid( mapName, GI->sp_entity, NULL )) { return false; } SV_ClearSaveDir (); SV_Shutdown( true ); } else { S_StopAllSounds (); SV_DeactivateServer (); } sv.loadgame = loadGame; sv.background = false; sv.changelevel = false; if( !SV_SpawnServer( mapName, NULL )) return false; SV_LevelInit( mapName, NULL, NULL, loadGame ); sv.loadgame = loadGame; SV_ActivateServer(); if( sv.state != ss_active ) return false; return true; }
/* ============== SNDDMA_GetSoundtime update global soundtime =============== */ int SNDDMA_GetSoundtime( void ) { static int buffers, oldsamplepos; int samplepos, fullsamples; fullsamples = dma.samples / 2; // it is possible to miscount buffers // if it has wrapped twice between // calls to S_Update. Oh well. samplepos = SNDDMA_GetDMAPos(); if( samplepos < oldsamplepos ) { buffers++; // buffer wrapped if( paintedtime > 0x40000000 ) { // time to chop things off to avoid 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds(); } } oldsamplepos = samplepos; return (buffers * fullsamples + samplepos / 2); }
/* =============== Host_Shutdown FIXME: this is a callback from Sys_Quit and Sys_Error. It would be better to run quit through here before the final handoff to the sys code. =============== */ void Host_Shutdown(void) { static qboolean isdown = false; if (isdown) { Con_Print("recursive shutdown\n"); return; } if (setjmp(host_abortframe)) { Con_Print("aborted the quitting frame?!?\n"); return; } isdown = true; // be quiet while shutting down S_StopAllSounds(); // disconnect client from server if active CL_Disconnect(); // shut down local server if active Host_ShutdownServer (); // Shutdown menu if(MR_Shutdown) MR_Shutdown(); // AK shutdown PRVM // AK hmm, no PRVM_Shutdown(); yet CL_Gecko_Shutdown(); CL_Video_Shutdown(); Host_SaveConfig(); CDAudio_Shutdown (); S_Terminate (); Curl_Shutdown (); NetConn_Shutdown (); //PR_Shutdown (); if (cls.state != ca_dedicated) { R_Modules_Shutdown(); VID_Shutdown(); Thread_Shutdown(); } Cmd_Shutdown(); Key_Shutdown(); CL_Shutdown(); Sys_Shutdown(); Log_Close(); Crypto_Shutdown(); FS_Shutdown(); Con_Shutdown(); Memory_Shutdown(); }
/* =============== SCR_BeginLoadingPlaque ================ */ void SCR_BeginLoadingPlaque (void) { S_StopAllSounds (true); CDAudio_Stop (); // Stop the CD music if (cls.state != ca_connected) return; if (cls.signon != SIGNONS) return; // redraw with no console and the loading plaque Con_ClearNotify (); // remove all center prints con_lastcenterstring[0] = 0; scr_centerstring[0] = 0; scr_centertime_off = 0; scr_con_current = 0; scr_drawloading = true; Sbar_Changed (); SCR_UpdateScreen (); scr_drawloading = false; scr_disabled_for_loading = true; scr_disabled_time = realtime; SCR_SetTimeout (SCR_DEFTIMEOUT); }
static void GetSoundtime (void) { int samplepos, fullsamples; static int buffers, oldsamplepos; //joe: capturing audio #ifdef _WIN32 if (Movie_GetSoundtime()) return; #endif fullsamples = shm->sampleframes; // it is possible to miscount buffers if it has wrapped twice between calls to S_Update. Oh well. samplepos = SNDDMA_GetDMAPos(); if (samplepos < oldsamplepos) { buffers++; // buffer wrapped if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds (true); } } oldsamplepos = samplepos; soundtime = buffers * fullsamples + samplepos / shm->format.channels; }
/* ===================== CL_ClearState Called before parsing a gamestate ===================== */ void CL_ClearState (void) { CL_ShutdownCGame(); S_StopAllSounds(); memset( &cl, 0, sizeof( cl ) ); }
/* ================= CL_Vid_Restart_f Restart the video subsystem ================= */ void CL_Vid_Restart_f( void ) { S_StopAllSounds(); // don't let them loop during the restart S_BeginRegistration(); // all sound handles are now invalid CL_ShutdownRef(); CL_ShutdownUI(); CL_ShutdownCGame(); //rww - sof2mp does this here, but it seems to cause problems in this codebase. // CM_ClearMap(); CL_InitRef(); cls.rendererStarted = qfalse; cls.uiStarted = qfalse; cls.cgameStarted = qfalse; cls.soundRegistered = qfalse; #ifdef _IMMERSION CL_ShutdownFF(); cls.forceStarted = qfalse; #endif // _IMMERSION #ifdef _XBOX vidRestartReloadMap = qtrue; #endif // unpause so the cgame definately gets a snapshot and renders a frame Cvar_Set( "cl_paused", "0" ); }
void GetSoundtime(void) { int samplepos; static int buffers; static int oldsamplepos; int fullsamples; fullsamples = shm->samples / shm->channels; // it is possible to miscount buffers if it has wrapped twice between // calls to S_Update. Oh well. samplepos = SNDDMA_GetDMAPos(); if (samplepos < oldsamplepos) { buffers++; // buffer wrapped if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds (true); } } oldsamplepos = samplepos; soundtime = buffers*fullsamples + samplepos/shm->channels; }
/* =============== SCR_BeginLoadingPlaque ================ */ void SCR_BeginLoadingPlaque (void) { CDAudio_Pause(); S_StopAllSounds (qtrue); if (cls.state != ca_connected) return; if (cls.signon != SIGNONS) return; // redraw with no console and the loading plaque Con_ClearNotify (); scr_centertime_off = 0; scr_con_current = 0; scr_drawloading = qtrue; scr_fullupdate = 0; Sbar_Changed (); SCR_UpdateScreen (); scr_drawloading = qfalse; scr_disabled_for_loading = qtrue; scr_disabled_time = realtime; scr_fullupdate = 0; }
/** * Sends a disconnect message to the server * This is also called on Host_Error, so it shouldn't cause any errors */ void CL_Disconnect(void) { // stop sounds (especially looping!) S_StopAllSounds(true); // bring the console down and fade the colors back to normal // SCR_BringDownConsole (); // if running a local server, shut it down if (cls.demoplayback) CL_StopPlayback(); else if (cls.state == ca_connected) { if (cls.demorecording) CL_Stop_f(); Con_DPrintf("Sending clc_disconnect\n"); SZ_Clear(&cls.message); MSG_WriteByte(&cls.message, clc_disconnect); NET_SendUnreliableMessage(cls.netcon, &cls.message); SZ_Clear(&cls.message); NET_Close(cls.netcon); cls.state = ca_disconnected; if (sv.active) Host_ShutdownServer(false); } cls.demoplayback = cls.timedemo = false; cls.signon = 0; }
/* * This function gets called once just before drawing each frame, and * it's sole purpose in life is to check to see if any of the video mode * parameters have changed, and if they have to update the rendering DLL * and/or video mode to match. */ void VID_CheckChanges ( void ) { char name [ 100 ]; if ( vid_ref->modified ) { S_StopAllSounds(); } while ( vid_ref->modified ) { /* refresh has changed */ vid_ref->modified = false; vid_fullscreen->modified = true; cl.refresh_prepped = false; cls.disable_screen = true; sprintf( name, "ref_%s.so", vid_ref->string ); if ( !VID_LoadRefresh( name ) ) { Cvar_Set( "vid_ref", "gl" ); } cls.disable_screen = false; } }
void GetSoundtime(void) { #ifndef FLASH //For Flash, the SampleDataEvent tells how much to add onto the soundtime value, so dont do anything here. int samplepos; static int buffers; static int oldsamplepos; int fullsamples; #ifdef SUPPORTS_AVI_CAPTURE if (Movie_GetSoundtime()) { return; } #endif fullsamples = shm->samples / shm->channels; // it is possible to miscount buffers if it has wrapped twice between // calls to S_Update. Oh well. samplepos = SNDDMA_GetDMAPos(); if (samplepos < oldsamplepos) { buffers++; // buffer wrapped if (paintedtime > 0x40000000) { // time to chop things off to avoid 32 bit limits buffers = 0; paintedtime = fullsamples; S_StopAllSounds(true); } } oldsamplepos = samplepos; soundtime = buffers*fullsamples + samplepos/shm->channels; #endif //ifndef FLASH }
//FIXME: this is a callback from Sys_Quit and Sys_Error. It would be better //to run quit through here before the final handoff to the sys code. void Host_Shutdown (void) { static qbool isdown = false; if (isdown) { printf ("recursive shutdown\n"); return; } isdown = true; // on low-end systems quit process may last long time (was about 1 minute for me on old compo), // at the same time may repeats repeats repeats some sounds, trying preventing this S_StopAllSounds (true); S_Update (vec3_origin, vec3_origin, vec3_origin, vec3_origin); SV_Shutdown ("Server quit\n"); #if (!defined WITH_PNG_STATIC && !defined WITH_JPEG_STATIC) QLib_Shutdown(); #endif CL_Shutdown (); NET_Shutdown (); Con_Shutdown(); #ifdef WITH_TCL TCL_Shutdown (); #endif }
/* ================== CL_NextDemo Called when a demo or cinematic finishes If the "nextdemo" cvar is set, that command will be issued ================== */ qboolean CL_NextDemo( void ) { string str; if( cls.demonum == -1 ) return false; // don't play demos S_StopAllSounds(); if( !cls.demos[cls.demonum][0] || cls.demonum == MAX_DEMOS ) { cls.demonum = 0; if( !cls.demos[cls.demonum][0] ) { MsgDev( D_INFO, "no demos listed with startdemos\n" ); cls.demonum = -1; return false; } } Q_snprintf( str, MAX_STRING, "playdemo %s\n", cls.demos[cls.demonum] ); Cbuf_InsertText( str ); cls.demonum++; return true; }
/* ============== CL_StopPlayback Called when a demo file runs out, or the user starts a game ============== */ void CL_StopPlayback( void ) { if( !cls.demoplayback ) return; // release demofile FS_Close( cls.demofile ); cls.demoplayback = false; demo.framecount = 0; cls.demofile = NULL; cls.olddemonum = max( -1, cls.demonum - 1 ); Mem_Free( demo.directory.entries ); demo.directory.numentries = 0; demo.directory.entries = NULL; demo.entry = NULL; cls.demoname[0] = '\0'; // clear demoname too menu.globals->demoname[0] = '\0'; S_StopAllSounds(); S_StopBackgroundTrack(); if( !cls.changedemo ) { // let game known about demo state Cvar_FullSet( "cl_background", "0", CVAR_READ_ONLY ); cls.state = ca_disconnected; cl.background = 0; cls.demonum = -1; } }
static void PingServers(void) { netadr_t broadcast; S_StopAllSounds(); ClearServers(); UpdateStatus(); // update status string now, because fetching and // resolving will take some time m_servers.status_c = "Resolving servers, please wait..."; SCR_UpdateScreen(); // fetch and resolve servers memset(&broadcast, 0, sizeof(broadcast)); ParseMasterArgs(&broadcast); m_servers.timestamp = Sys_Milliseconds(); // optionally ping broadcast if (broadcast.type) CL_SendStatusRequest(&broadcast); if (!m_servers.list.numItems) { FinishPingStage(); return; } // begin pinging servers m_servers.pingstage = PING_STAGES; m_servers.pingindex = 0; m_servers.pingextra = 0; CalcPingRate(); }
/* ============ VID_CheckChanges This function gets called once just before drawing each frame, and it's sole purpose in life is to check to see if any of the video mode parameters have changed, and if they have to update the rendering DLL and/or video mode to match. ============ */ void VID_CheckChanges (void) { if ( win_noalttab->modified ) { if ( win_noalttab->value ) { WIN_DisableAltTab(); } else { WIN_EnableAltTab(); } win_noalttab->modified = false; } if ( vid_ref_modified /*vid_ref->modified*/ ) { cl.force_refdef = true; // can't use a paused refdef S_StopAllSounds(); } while ( vid_ref_modified /*vid_ref->modified*/ ) { /* ** refresh has changed */ vid_ref_modified = false; /*vid_ref->modified = false;*/ vid_fullscreen->modified = true; cl.refresh_prepped = false; cls.disable_screen = true; if ( !VID_LoadRefresh() ) { /* ** drop the console if we fail to load a refresh */ if ( cls.key_dest != key_console ) { Con_ToggleConsole_f(); } } cls.disable_screen = false; } /* ** update our window position */ if ( vid_xpos->modified || vid_ypos->modified ) { if (!vid_fullscreen->value) VID_UpdateWindowPosAndSize( vid_xpos->value, vid_ypos->value ); vid_xpos->modified = false; vid_ypos->modified = false; } }
/* ===================== CL_ClearState Called before parsing a gamestate ===================== */ void CL_ClearState (void) { CL_ShutdownCGame(); S_StopAllSounds(); memset( &cl, 0, sizeof( cl ) ); if( vr_enabled->value) VR_ResetOrientation(); }
void CClientState::Disconnect(bool bShowMainMenu) { CBaseClientState::Disconnect(bShowMainMenu); // stop any demo activities #ifndef _XBOX demoplayer->StopPlayback(); demorecorder->StopRecording(); #endif S_StopAllSounds( true ); R_DecalTermAll(); if ( m_nMaxClients > 1 ) { if ( EngineVGui()->IsConsoleVisible() == false ) { // start progress bar immediately for multiplayer level transitions EngineVGui()->EnabledProgressBarForNextLoad(); } } CL_ClearState(); #ifndef _XBOX // End any in-progress downloads CL_HTTPStop_f(); #endif // stop loading progress bar if (bShowMainMenu) { SCR_EndLoadingPlaque(); } // notify game ui dll of out-of-in-game status EngineVGui()->NotifyOfServerDisconnect(); if (bShowMainMenu && !engineClient->IsDrawingLoadingImage() && (cl.demonum == -1)) { // we're not in the middle of loading something, so show the UI if ( EngineVGui() ) { EngineVGui()->ActivateGameUI(); } } HostState_OnClientDisconnected(); // if we played a demo from the startdemos list, play next one if (cl.demonum != -1) { CL_NextDemo(); } }
/* ================= S_Update ================= */ void S_Update( void ) { if( s_muteWhenMinimized->integer && com_minimized->integer ) { S_StopAllSounds( ); return; } if( si.Update ) { si.Update( ); } }
/* ============ VID_CheckChanges This function gets called once just before drawing each frame, and it's sole purpose in life is to check to see if any of the video mode parameters have changed, and if they have to update the rendering DLL and/or video mode to match. ============ */ void VID_CheckChanges (void) { char name[100]; cvar_t *sw_mode; if ( vid_ref->modified ) { S_StopAllSounds(); } while (vid_ref->modified) { /* ** refresh has changed */ vid_ref->modified = false; vid_fullscreen->modified = true; cl.refresh_prepped = false; cls.disable_screen = true; sprintf( name, "ref_%s.so", vid_ref->string ); if ( !VID_LoadRefresh( name ) ) { if ( strcmp (vid_ref->string, "soft") == 0 || strcmp (vid_ref->string, "softx") == 0 ) { Com_Printf("Refresh failed\n"); sw_mode = Cvar_Get( "sw_mode", "0", 0 ); if (sw_mode->value != 0) { Com_Printf("Trying mode 0\n"); Cvar_SetValue("sw_mode", 0); if ( !VID_LoadRefresh( name ) ) Com_Error (ERR_FATAL, "Couldn't fall back to software refresh!"); } else Com_Error (ERR_FATAL, "Couldn't fall back to software refresh!"); } /* prefer to fall back on X if active */ if (getenv("DISPLAY")) Cvar_Set( "vid_ref", "softx" ); else Cvar_Set( "vid_ref", "soft" ); /* ** drop the console if we fail to load a refresh */ if ( cls.key_dest != key_console ) { Con_ToggleConsole_f(); } } cls.disable_screen = false; } }
/* ================ S_Init ================ */ void S_Init( void ) { cvar_t *cv; qboolean r; Com_Printf("\n------- sound initialization -------\n"); s_volume = Cvar_Get ("s_volume", "0.8", CVAR_ARCHIVE); s_musicVolume = Cvar_Get ("s_musicvolume", "0.25", CVAR_ARCHIVE); s_separation = Cvar_Get ("s_separation", "0.5", CVAR_ARCHIVE); s_doppler = Cvar_Get ("s_doppler", "1", CVAR_ARCHIVE); s_khz = Cvar_Get ("s_khz", "22", CVAR_ARCHIVE); s_mixahead = Cvar_Get ("s_mixahead", "0.2", CVAR_ARCHIVE); s_mixPreStep = Cvar_Get ("s_mixPreStep", "0.05", CVAR_ARCHIVE); s_show = Cvar_Get ("s_show", "0", CVAR_CHEAT); s_testsound = Cvar_Get ("s_testsound", "0", CVAR_CHEAT); cv = Cvar_Get ("s_initsound", "1", 0); if ( !cv->integer ) { Com_Printf ("not initializing.\n"); Com_Printf("------------------------------------\n"); return; } Cmd_AddCommand("play", S_Play_f); Cmd_AddCommand("music", S_Music_f); Cmd_AddCommand("s_list", S_SoundList_f); Cmd_AddCommand("s_info", S_SoundInfo_f); Cmd_AddCommand("s_stop", S_StopAllSounds); r = SNDDMA_Init(); Com_Printf("------------------------------------\n"); #ifndef NO_DMAHD if (dmaHD_Enabled()) dmaHD_Init(); #endif if ( r ) { s_soundStarted = 1; s_soundMuted = 1; // s_numSfx = 0; Com_Memset(sfxHash, 0, sizeof(sfx_t *)*LOOP_HASH); s_soundtime = 0; s_paintedtime = 0; S_StopAllSounds (); S_SoundInfo_f(); } }
/* ================ S_Init ================ */ void S_Init (void) { cvar_t *cv; Com_Printf("\n------- sound initialization -------\n"); cv = Cvar_Get ("s_initsound", "1", 0); if (!cv->value) Com_Printf ("not initializing.\n"); else { s_volume = Cvar_Get ("s_volume", "0.7", CVAR_ARCHIVE); s_khz = Cvar_Get ("s_khz", "22", CVAR_ARCHIVE); // Knightmare- increased from 11 s_loadas8bit = Cvar_Get ("s_loadas8bit", "0", CVAR_ARCHIVE); // Knightmare- changed from 1 s_mixahead = Cvar_Get ("s_mixahead", "0.2", CVAR_ARCHIVE); s_show = Cvar_Get ("s_show", "0", 0); s_testsound = Cvar_Get ("s_testsound", "0", 0); s_primary = Cvar_Get ("s_primary", "0", CVAR_ARCHIVE); // win32 specific #ifdef OGG_SUPPORT s_musicvolume = Cvar_Get ("s_musicvolume", "1.0", CVAR_ARCHIVE); // Knightmare added #endif Cmd_AddCommand("play", S_Play); Cmd_AddCommand("stopsound", S_StopAllSounds); Cmd_AddCommand("soundlist", S_SoundList); Cmd_AddCommand("soundinfo", S_SoundInfo_f); #ifdef OGG_SUPPORT Cmd_AddCommand("ogg_restart", S_OGG_Restart); // Knightmare added #endif if (!SNDDMA_Init()) return; S_InitScaletable (); sound_started = 1; num_sfx = 0; soundtime = 0; paintedtime = 0; Com_Printf ("sound sampling rate: %i\n", dma.speed); S_StopAllSounds (); } #ifdef OGG_SUPPORT // Com_DPrintf ("S_Init: calling S_OGG_Init\n"); // debug S_OGG_Init(); // Knightmare added #endif Com_Printf("------------------------------------\n"); }
/* ===================== CL_ClearState ===================== */ void CL_ClearState (void) { S_StopAllSounds (); CL_ClearEffects (); CL_ClearTEnts (); // wipe the entire cl structure memset (&cl, 0, sizeof(cl)); memset (&cl_entities, 0, sizeof(cl_entities)); SZ_Clear (&cls.netchan.message); }
static void S_Restart_f (void) { Com_DPrintf("Restarting sound system....\n"); Cache_Flush(); S_StopAllSounds (true); S_Shutdown(); Com_DPrintf("sound: Shutdown OK\n"); if (!S_Startup()) { snd_initialized = false; return; } ambient_sfx[AMBIENT_WATER] = S_PrecacheSound ("ambience/water1.wav"); ambient_sfx[AMBIENT_SKY] = S_PrecacheSound ("ambience/wind2.wav"); S_StopAllSounds (true); if (developer.value) S_SoundInfo_f(); }