/* * CG_DemocamInit */ void CG_DemocamInit( void ) { int name_size; bool hassoundstream = false; democam_editing_mode = false; demo_initial_timestamp = 0; if( !cgs.demoPlaying ) return; if( !*cgs.demoName ) CG_Error( "CG_LoadRecamScriptFile: no demo name string\n" ); // see if there is any script for this demo, and load it name_size = sizeof( char ) * ( strlen( cgs.demoName ) + strlen( ".cam" ) + 1 ); demoscriptname = ( char * )CG_Malloc( name_size ); Q_snprintfz( demoscriptname, name_size, "%s", cgs.demoName ); COM_ReplaceExtension( demoscriptname, ".cam", name_size ); CG_Printf( "cam: %s\n", demoscriptname ); // add console commands trap_Cmd_AddCommand( "demoEditMode", CG_DemoEditMode_Cmd_f ); trap_Cmd_AddCommand( "demoFreeFly", CG_DemoFreeFly_Cmd_f ); trap_Cmd_AddCommand( "camswitch", CG_CamSwitch_Cmd_f ); if( CG_LoadRecamScriptFile( demoscriptname ) ) { CG_Printf( "Loaded demo cam script\n" ); } // check for a sound stream file cgs.demoAudioStream = ( char * )CG_Malloc( name_size ); Q_snprintfz( cgs.demoAudioStream, name_size, "%s", cgs.demoName ); COM_ReplaceExtension( cgs.demoAudioStream, ".wav", name_size ); if( trap_FS_FOpenFile( cgs.demoAudioStream, NULL, FS_READ ) != -1 ) { hassoundstream = true; } else { COM_ReplaceExtension( cgs.demoAudioStream, ".ogg", name_size ); if( trap_FS_FOpenFile( cgs.demoAudioStream, NULL, FS_READ ) != -1 ) { hassoundstream = true; } } if( !hassoundstream ) { CG_Free( cgs.demoAudioStream ); cgs.demoAudioStream = NULL; } }
/* * SF_Init */ bool SF_Init( void *hwnd, int maxEntities, bool verbose ) { soundpool = S_MemAllocPool( "QF Sound Module" ); developer = trap_Cvar_Get( "developer", "0", 0 ); s_volume = trap_Cvar_Get( "s_volume", "0.8", CVAR_ARCHIVE ); s_musicvolume = trap_Cvar_Get( "s_musicvolume", "0.2", CVAR_ARCHIVE ); s_khz = trap_Cvar_Get( "s_khz", "44", CVAR_ARCHIVE|CVAR_LATCH_SOUND ); s_mixahead = trap_Cvar_Get( "s_mixahead", "0.14", CVAR_ARCHIVE ); s_show = trap_Cvar_Get( "s_show", "0", CVAR_CHEAT ); s_testsound = trap_Cvar_Get( "s_testsound", "0", 0 ); s_swapstereo = trap_Cvar_Get( "s_swapstereo", "0", CVAR_ARCHIVE ); s_vorbis = trap_Cvar_Get( "s_vorbis", "1", CVAR_ARCHIVE ); s_pseudoAcoustics = trap_Cvar_Get( "s_pseudoAcoustics", "0", CVAR_ARCHIVE ); s_separationDelay = trap_Cvar_Get( "s_separationDelay", "1.0", CVAR_ARCHIVE ); s_globalfocus = trap_Cvar_Get( "s_globalfocus", "0", CVAR_ARCHIVE ); #ifdef ENABLE_PLAY trap_Cmd_AddCommand( "play", SF_Play_f ); #endif trap_Cmd_AddCommand( "music", SF_Music_f ); trap_Cmd_AddCommand( "stopsound", SF_StopAllSounds_f ); trap_Cmd_AddCommand( "stopmusic", SF_StopBackgroundTrack ); trap_Cmd_AddCommand( "prevmusic", SF_PrevBackgroundTrack ); trap_Cmd_AddCommand( "nextmusic", SF_NextBackgroundTrack ); trap_Cmd_AddCommand( "pausemusic", SF_PauseBackgroundTrack ); trap_Cmd_AddCommand( "soundlist", SF_SoundList_f ); trap_Cmd_AddCommand( "soundinfo", SF_SoundInfo_f ); num_sfx = 0; s_num_ent_spats = 0; s_registration_sequence = 1; s_registering = false; s_cmdPipe = S_CreateSoundCmdPipe(); if( !s_cmdPipe ) { return false; } s_backThread = trap_Thread_Create( S_BackgroundUpdateProc, s_cmdPipe ); S_IssueInitCmd( s_cmdPipe, hwnd, maxEntities, verbose ); S_FinishSoundCmdPipe( s_cmdPipe ); if( !dma.buffer ) return false; SF_SetAttenuationModel( S_DEFAULT_ATTENUATION_MODEL, S_DEFAULT_ATTENUATION_MAXDISTANCE, S_DEFAULT_ATTENUATION_REFDISTANCE ); return true; }
/* * CG_DemoEditMode_Cmd_f */ static void CG_DemoEditMode_Cmd_f( void ) { if( !cgs.demoPlaying ) { return; } if( trap_Cmd_Argc() > 1 ) { if( !Q_stricmp( trap_Cmd_Argv( 1 ), "on" ) ) { democam_editing_mode = true; } else if( !Q_stricmp( trap_Cmd_Argv( 1 ), "off" ) ) { democam_editing_mode = false; } } else { democam_editing_mode = !democam_editing_mode; } CG_Printf( "demo cam editing mode %s\n", democam_editing_mode ? "on" : "off" ); if( democam_editing_mode ) { trap_Cmd_AddCommand( "addcam", CG_AddCam_Cmd_f ); trap_Cmd_AddCommand( "deletecam", CG_DeleteCam_Cmd_f ); trap_Cmd_AddCommand( "editcam", CG_EditCam_Cmd_f ); trap_Cmd_AddCommand( "saverecam", CG_SaveCam_Cmd_f ); trap_Cmd_AddCommand( "clearcams", CG_Democam_FreeCams ); trap_Cmd_AddCommand( "importcams", CG_Democam_ImportCams_f ); trap_Cmd_AddCommand( "subtitle", CG_AddSub_Cmd_f ); trap_Cmd_AddCommand( "addprint", CG_AddPrint_Cmd_f ); } else { CG_DemoEditMode_RemoveCmds(); } }
/* * SF_Init */ bool SF_Init( void *hwnd, int maxEntities, bool verbose ) { soundpool = S_MemAllocPool( "OpenAL sound module" ); s_num_ent_spats = 0; #ifdef OPENAL_RUNTIME if( !QAL_Init( ALDRIVER, verbose ) ) { #ifdef ALDRIVER_ALT if( !QAL_Init( ALDRIVER_ALT, verbose ) ) #endif { Com_Printf( "Failed to load OpenAL library: %s\n", ALDRIVER ); return false; } } #endif s_volume = trap_Cvar_Get( "s_volume", "0.8", CVAR_ARCHIVE ); s_musicvolume = trap_Cvar_Get( "s_musicvolume", "0.15", CVAR_ARCHIVE ); s_doppler = trap_Cvar_Get( "s_doppler", "1.0", CVAR_ARCHIVE ); s_sound_velocity = trap_Cvar_Get( "s_sound_velocity", "10976", CVAR_DEVELOPER ); s_stereo2mono = trap_Cvar_Get ( "s_stereo2mono", "0", CVAR_ARCHIVE ); s_globalfocus = trap_Cvar_Get( "s_globalfocus", "0", CVAR_ARCHIVE ); #ifdef ENABLE_PLAY trap_Cmd_AddCommand( "play", SF_Play_f ); #endif trap_Cmd_AddCommand( "music", SF_Music_f ); trap_Cmd_AddCommand( "stopmusic", SF_StopBackgroundTrack ); trap_Cmd_AddCommand( "prevmusic", SF_PrevBackgroundTrack ); trap_Cmd_AddCommand( "nextmusic", SF_NextBackgroundTrack ); trap_Cmd_AddCommand( "pausemusic", SF_PauseBackgroundTrack ); trap_Cmd_AddCommand( "soundlist", SF_SoundList_f ); trap_Cmd_AddCommand( "s_devices", SF_ListDevices_f ); s_cmdPipe = S_CreateSoundCmdPipe(); if( !s_cmdPipe ) { return false; } s_backThread = trap_Thread_Create( S_BackgroundUpdateProc, s_cmdPipe ); S_IssueInitCmd( s_cmdPipe, hwnd, maxEntities, verbose ); S_FinishSoundCmdPipe( s_cmdPipe ); if( !alContext ) { return false; } S_InitBuffers(); return true; }
/* * CG_RegisterCGameCommands */ void CG_RegisterCGameCommands( void ) { int i; char *name; cgcmd_t *cmd; CG_LoadingString( "commands" ); if( !cgs.demoPlaying ) { // add game side commands for( i = 0; i < MAX_GAMECOMMANDS; i++ ) { name = cgs.configStrings[CS_GAMECOMMANDS+i]; if( !name[0] ) continue; CG_LoadingItemName( name ); // check for local command overrides for( cmd = cgcmds; cmd->name; cmd++ ) { if( !Q_stricmp( cmd->name, name ) ) break; } if( cmd->name ) continue; if( !cgs.hasGametypeMenu && !Q_stricmp( name, "gametypemenu" ) ) { cgs.hasGametypeMenu = qtrue; } trap_Cmd_AddCommand( name, NULL ); } } // add local commands for( cmd = cgcmds; cmd->name; cmd++ ) { if( cgs.demoPlaying && !cmd->allowdemo ) continue; trap_Cmd_AddCommand( cmd->name, cmd->func ); } }
/* * FTLIB_Init */ qboolean FTLIB_Init( qboolean verbose ) { ftlibPool = FTLIB_AllocPool( "Generic pool" ); FTLIB_InitSubsystems( verbose ); trap_Cmd_AddCommand( "fontlist", &FTLIB_PrintFontList ); return qtrue; }
/* * G_AddCommands */ void G_AddServerCommands( void ) { if( dedicated->integer ) trap_Cmd_AddCommand( "say", Cmd_ConsoleSay_f ); trap_Cmd_AddCommand( "kick", Cmd_ConsoleKick_f ); // match controls trap_Cmd_AddCommand( "match", Cmd_Match_f ); // banning trap_Cmd_AddCommand( "addip", Cmd_AddIP_f ); trap_Cmd_AddCommand( "removeip", Cmd_RemoveIP_f ); trap_Cmd_AddCommand( "listip", Cmd_ListIP_f ); trap_Cmd_AddCommand( "writeip", Cmd_WriteIP_f ); // MBotGame: Add AI related commands trap_Cmd_AddCommand( "botdebug", AIDebug_ToogleBotDebug ); trap_Cmd_AddCommand( "editnodes", AITools_InitEditnodes ); trap_Cmd_AddCommand( "makenodes", AITools_InitMakenodes ); trap_Cmd_AddCommand( "savenodes", Cmd_SaveNodes_f ); trap_Cmd_AddCommand( "addnode", AITools_AddNode_Cmd ); trap_Cmd_AddCommand( "dropnode", AITools_AddNode_Cmd ); trap_Cmd_AddCommand( "addbotroam", AITools_AddBotRoamNode_Cmd ); trap_Cmd_AddCommand( "dumpASapi", G_asDumpAPI_f ); trap_Cmd_AddCommand( "listratings", G_ListRatings_f ); trap_Cmd_AddCommand( "listraces", G_ListRaces_f ); trap_Cmd_AddCommand( "listlocations", Cmd_ListLocations_f ); }
/* * CG_ConfigString */ void CG_ConfigString( int i, const char *s ) { size_t len; // wsw : jal : warn if configstring overflow len = strlen( s ); if( len >= MAX_CONFIGSTRING_CHARS ) CG_Printf( "%sWARNING:%s Configstring %i overflowed\n", S_COLOR_YELLOW, S_COLOR_WHITE, i ); if( i < 0 || i >= MAX_CONFIGSTRINGS ) CG_Error( "configstring > MAX_CONFIGSTRINGS" ); Q_strncpyz( cgs.configStrings[i], s, sizeof( cgs.configStrings[i] ) ); // do something apropriate if( i == CS_MAPNAME ) { CG_RegisterLevelMinimap(); } else if( i == CS_TVSERVER ) { CG_UpdateTVServerString(); } else if( i == CS_GAMETYPETITLE ) { } else if( i == CS_GAMETYPENAME ) { GS_SetGametypeName( cgs.configStrings[CS_GAMETYPENAME] ); } else if( i == CS_AUTORECORDSTATE ) { CG_SC_AutoRecordAction( cgs.configStrings[i] ); } else if( i >= CS_MODELS && i < CS_MODELS+MAX_MODELS ) { if( cgs.configStrings[i][0] == '$' ) // indexed pmodel cgs.pModelsIndex[i-CS_MODELS] = CG_RegisterPlayerModel( cgs.configStrings[i]+1 ); else cgs.modelDraw[i-CS_MODELS] = CG_RegisterModel( cgs.configStrings[i] ); } else if( i >= CS_SOUNDS && i < CS_SOUNDS+MAX_SOUNDS ) { if( cgs.configStrings[i][0] != '*' ) cgs.soundPrecache[i-CS_SOUNDS] = trap_S_RegisterSound( cgs.configStrings[i] ); } else if( i >= CS_IMAGES && i < CS_IMAGES+MAX_IMAGES ) { cgs.imagePrecache[i-CS_IMAGES] = trap_R_RegisterPic( cgs.configStrings[i] ); } else if( i >= CS_SKINFILES && i < CS_SKINFILES+MAX_SKINFILES ) { cgs.skinPrecache[i-CS_SKINFILES] = trap_R_RegisterSkinFile( cgs.configStrings[i] ); } else if( i >= CS_LIGHTS && i < CS_LIGHTS+MAX_LIGHTSTYLES ) { CG_SetLightStyle( i - CS_LIGHTS ); } else if( i >= CS_ITEMS && i < CS_ITEMS+MAX_ITEMS ) { CG_ValidateItemDef( i - CS_ITEMS, cgs.configStrings[i] ); } else if( i >= CS_PLAYERINFOS && i < CS_PLAYERINFOS+MAX_CLIENTS ) { CG_LoadClientInfo( &cgs.clientInfo[i-CS_PLAYERINFOS], cgs.configStrings[i], i-CS_PLAYERINFOS ); } else if( i >= CS_GAMECOMMANDS && i < CS_GAMECOMMANDS+MAX_GAMECOMMANDS ) { if( !cgs.demoPlaying ) { trap_Cmd_AddCommand( cgs.configStrings[i], NULL ); if( !Q_stricmp( cgs.configStrings[i], "gametypemenu" ) ) { cgs.hasGametypeMenu = qtrue; } } } else if( i >= CS_WEAPONDEFS && i < CS_WEAPONDEFS + MAX_WEAPONDEFS ) { CG_OverrideWeapondef( i - CS_WEAPONDEFS, cgs.configStrings[i] ); } }
/* * UI_Init */ void UI_Init( int vidWidth, int vidHeight, int protocol, int sharedSeed ) { m_active = NULL; m_cursoritem = NULL; m_drawfunc = NULL; m_keyfunc = NULL; m_entersound = qfalse; m_keypressed = 0; memset( &uis, 0, sizeof( uis ) ); uis.vidWidth = vidWidth; uis.vidHeight = vidHeight; uis.gameProtocol = protocol; #if 0 uis.scaleX = UI_WIDTHSCALE; uis.scaleY = UI_HEIGHTSCALE; #else uis.scaleX = 1; uis.scaleY = 1; #endif uis.cursorX = uis.vidWidth / 2; uis.cursorY = uis.vidHeight / 2; uis.initialSharedSeed = sharedSeed; uis.sharedSeed = uis.initialSharedSeed; uis.backgroundNum = Q_rand( &uis.sharedSeed ) % UI_SHADER_MAX_BACKGROUNDS; developer = trap_Cvar_Get( "developer", "0", CVAR_CHEAT ); // wsw/Mokshu : test svn addin for VS 2005 and what about a "help/news" menu (latest news from website for example) trap_Cmd_AddCommand( "menu_main", M_Menu_Main_f ); trap_Cmd_AddCommand( "menu_main_sbar", M_Menu_Main_Statusbar_f ); trap_Cmd_AddCommand( "menu_setup", M_Menu_Setup_f ); trap_Cmd_AddCommand( "menu_joinserver", M_Menu_JoinServer_f ); trap_Cmd_AddCommand( "menu_matchmaker", M_Menu_MatchMaker_f ); #ifdef AUTH_CODE trap_Cmd_AddCommand( "menu_login", M_Menu_Login_f ); trap_Cmd_AddCommand( "menu_register", M_Menu_Register_f ); #endif trap_Cmd_AddCommand( "menu_playerconfig", M_Menu_PlayerConfig_f ); trap_Cmd_AddCommand( "menu_startserver", M_Menu_StartServer_f ); trap_Cmd_AddCommand( "menu_sound", M_Menu_Sound_f ); trap_Cmd_AddCommand( "menu_options", M_Menu_Options_f ); trap_Cmd_AddCommand( "menu_performance", M_Menu_Performance_f ); trap_Cmd_AddCommand( "menu_performanceadv", M_Menu_PerformanceAdv_f ); trap_Cmd_AddCommand( "menu_keys", M_Menu_Keys_f ); trap_Cmd_AddCommand( "menu_vsays", M_Menu_Vsays_f ); trap_Cmd_AddCommand( "menu_quit", M_Menu_Quit_f ); trap_Cmd_AddCommand( "menu_reset", M_Menu_Reset_f ); trap_Cmd_AddCommand( "menu_demos", M_Menu_Demos_f ); trap_Cmd_AddCommand( "menu_mods", M_Menu_Mods_f ); trap_Cmd_AddCommand( "menu_game", M_Menu_Game_f ); trap_Cmd_AddCommand( "menu_tv", M_Menu_TV_f ); trap_Cmd_AddCommand( "menu_tv_channel_add", M_Menu_TV_ChannelAdd_f ); trap_Cmd_AddCommand( "menu_tv_channel_remove", M_Menu_TV_ChannelRemove_f ); trap_Cmd_AddCommand( "menu_failed", M_Menu_Failed_f ); trap_Cmd_AddCommand( "menu_msgbox", M_Menu_MsgBox_f ); trap_Cmd_AddCommand( "menu_custom", M_Menu_Custom_f ); trap_Cmd_AddCommand( "menu_chasecam", M_Menu_Chasecam_f ); trap_Cmd_AddCommand( "menu_teamconfig", M_Menu_TeamConfig_f ); trap_Cmd_AddCommand( "menu_force", UI_Force_f ); trap_Cmd_AddCommand( "menu_tutorials", M_Menu_Tutorials_f ); trap_Cmd_AddCommand( "menu_demoplay", M_Menu_Demoplay_f ); trap_Cmd_AddCommand( "menu_pop", Cmd_PopMenu_f ); M_Cache(); UI_Playermodel_Init(); // create a list with the available player models UI_InitTemporaryBoneposesCache(); uis.backGroundTrackStarted = qfalse; // jal: this is a small trick to assign userinfo flag to cg_oldMovement before cgame is loaded trap_Cvar_Get( "cg_oldMovement", "0", CVAR_USERINFO | CVAR_ARCHIVE ); trap_Cvar_Get( "cg_noAutohop", "0", CVAR_USERINFO | CVAR_ARCHIVE ); }
/* * S_Init */ qboolean S_Init( void *hwnd, int maxEntities, qboolean verbose ) { int numDevices; int userDeviceNum = -1; char *devices, *defaultDevice; soundpool = S_MemAllocPool( "OpenAL sound module" ); alDevice = NULL; alContext = NULL; #ifdef OPENAL_RUNTIME if( !QAL_Init( ALDRIVER, verbose ) ) { #ifdef ALDRIVER_ALT if( !QAL_Init( ALDRIVER_ALT, verbose ) ) #endif { Com_Printf( "Failed to load OpenAL library: %s\n", ALDRIVER ); goto fail_no_device; } } #endif // get system default device identifier defaultDevice = ( char * )qalcGetString( NULL, ALC_DEFAULT_DEVICE_SPECIFIER ); if( !defaultDevice ) { Com_Printf( "Failed to get openAL default device\n" ); goto fail_no_device; } s_openAL_device = trap_Cvar_Get( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice, CVAR_ARCHIVE|CVAR_LATCH_SOUND ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) { userDeviceNum = numDevices; // force case sensitive if( strcmp( s_openAL_device->string, devices ) ) trap_Cvar_ForceSet( "s_openAL_device", devices ); } } if( !numDevices ) { Com_Printf( "Failed to get openAL devices\n" ); goto fail_no_device; } // the device assigned by the user is not available if( userDeviceNum == -1 ) { Com_Printf( "'s_openAL_device': incorrect device name, reseting to default\n" ); trap_Cvar_ForceSet( "s_openAL_device", ALDEVICE_DEFAULT ? ALDEVICE_DEFAULT : defaultDevice ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( numDevices = 0; *devices; devices += strlen( devices ) + 1, numDevices++ ) { if( !Q_stricmp( s_openAL_device->string, devices ) ) userDeviceNum = numDevices; } if( userDeviceNum == -1 ) trap_Cvar_ForceSet( "s_openAL_device", defaultDevice ); } alDevice = qalcOpenDevice( (const ALchar *)s_openAL_device->string ); if( !alDevice ) { Com_Printf( "Failed to open device\n" ); goto fail_no_device; } // Create context alContext = qalcCreateContext( alDevice, NULL ); if( !alContext ) { Com_Printf( "Failed to create context\n" ); goto fail; } qalcMakeContextCurrent( alContext ); if( verbose ) { Com_Printf( "OpenAL initialized\n" ); if( numDevices ) { int i; Com_Printf( " Devices: " ); devices = ( char * )qalcGetString( NULL, ALC_DEVICE_SPECIFIER ); for( i = 0; *devices; devices += strlen( devices ) + 1, i++ ) Com_Printf( "%s%s", devices, ( i < numDevices - 1 ) ? ", " : "" ); Com_Printf( "\n" ); if( defaultDevice && *defaultDevice ) Com_Printf( " Default system device: %s\n", defaultDevice ); Com_Printf( "\n" ); } Com_Printf( " Device: %s\n", qalcGetString( alDevice, ALC_DEVICE_SPECIFIER ) ); Com_Printf( " Vendor: %s\n", qalGetString( AL_VENDOR ) ); Com_Printf( " Version: %s\n", qalGetString( AL_VERSION ) ); Com_Printf( " Renderer: %s\n", qalGetString( AL_RENDERER ) ); Com_Printf( " Extensions: %s\n", qalGetString( AL_EXTENSIONS ) ); } // Check for Linux shutdown race condition if( !Q_stricmp( qalGetString( AL_VENDOR ), "J. Valenzuela" ) ) snd_shutdown_bug = qtrue; s_volume = trap_Cvar_Get( "s_volume", "0.8", CVAR_ARCHIVE ); s_musicvolume = trap_Cvar_Get( "s_musicvolume", "0.5", CVAR_ARCHIVE ); s_doppler = trap_Cvar_Get( "s_doppler", "1.0", CVAR_ARCHIVE ); s_sound_velocity = trap_Cvar_Get( "s_sound_velocity", "10976", CVAR_DEVELOPER ); s_stereo2mono = trap_Cvar_Get ( "s_stereo2mono", "0", CVAR_ARCHIVE ); qalDopplerFactor( s_doppler->value ); qalDopplerVelocity( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); if( qalSpeedOfSound ) // opelAL 1.1 only. alDopplerVelocity being deprecated qalSpeedOfSound( s_sound_velocity->value > 0.0f ? s_sound_velocity->value : 0.0f ); s_doppler->modified = qfalse; S_SetAttenuationModel( S_DEFAULT_ATTENUATION_MODEL, S_DEFAULT_ATTENUATION_MAXDISTANCE, S_DEFAULT_ATTENUATION_REFDISTANCE ); S_LockBackgroundTrack( qfalse ); if( !S_InitDecoders( verbose ) ) { Com_Printf( "Failed to init decoders\n" ); goto fail; } if( !S_InitBuffers() ) { Com_Printf( "Failed to init buffers\n" ); goto fail; } if( !S_InitSources( maxEntities, verbose ) ) { Com_Printf( "Failed to init sources\n" ); goto fail; } #ifdef ENABLE_PLAY trap_Cmd_AddCommand( "play", S_Play ); #endif trap_Cmd_AddCommand( "music", S_Music ); trap_Cmd_AddCommand( "stopmusic", S_StopMusic ); trap_Cmd_AddCommand( "prevmusic", S_PrevMusic ); trap_Cmd_AddCommand( "nextmusic", S_NextMusic ); trap_Cmd_AddCommand( "pausemusic", S_PauseMusic ); trap_Cmd_AddCommand( "soundlist", S_SoundList ); trap_Cmd_AddCommand( "s_devices", S_ListDevices ); return qtrue; fail: if( alContext ) { if( !snd_shutdown_bug ) qalcMakeContextCurrent( NULL ); qalcDestroyContext( alContext ); alContext = NULL; } if( alDevice ) { qalcCloseDevice( alDevice ); alDevice = NULL; } fail_no_device: S_MemFreePool( &soundpool ); return qfalse; }