qboolean CDAudio_Play_real (int track, qboolean looping, qboolean complain) { if(track < 1) { if(complain) Con_Print("Could not load BGM track.\n"); return false; } if (!cdValid) { CDAudio_GetAudioDiskInfo(); if (!cdValid) { if(complain) Con_DPrint ("No CD in player.\n"); return false; } } if (track > maxTrack) { if(complain) Con_DPrintf("CDAudio: Bad track number %u.\n", track); return false; } if (CDAudio_SysPlay(track) == -1) return false; if(cdaudio.integer != 3) Con_DPrintf ("CD track %u playing...\n", track); return true; }
/* ==================== SndSys_Submit Submit the contents of "snd_renderbuffer" to the sound card ==================== */ void SndSys_Submit (void) { LPWAVEHDR h; int wResult; // DirectSound doesn't need this if (!wav_init) return; paintpot += (snd_renderbuffer->endframe - prev_painted) * snd_renderbuffer->format.channels * snd_renderbuffer->format.width; if (paintpot > WAV_BUFFERS * wav_buffer_size) paintpot = WAV_BUFFERS * wav_buffer_size; prev_painted = snd_renderbuffer->endframe; // submit new sound blocks while (paintpot > wav_buffer_size) { h = lpWaveHdr + (snd_sent & WAV_MASK); /* * Now the data block can be sent to the output device. The * waveOutWrite function returns immediately and waveform * data is sent to the output device in the background. */ wResult = waveOutWrite(hWaveOut, h, sizeof(WAVEHDR)); if (wResult == MMSYSERR_NOERROR) snd_sent++; else if (wResult == WAVERR_STILLPLAYING) { if(developer_insane.integer) Con_DPrint("waveOutWrite failed (too much sound data)\n"); //h->dwFlags |= WHDR_DONE; //snd_sent++; } else { Con_Printf("waveOutWrite failed, error code %d\n", (int) wResult); SndSys_Shutdown (); return; } paintpot -= wav_buffer_size; } }
/* ==================== Host_Init ==================== */ static void Host_Init (void) { int i; const char* os; char vabuf[1024]; if (COM_CheckParm("-profilegameonly")) Sys_AllowProfiling(false); // LordHavoc: quake never seeded the random number generator before... heh if (COM_CheckParm("-benchmark")) srand(0); // predictable random sequence for -benchmark else srand((unsigned int)time(NULL)); // FIXME: this is evil, but possibly temporary // LordHavoc: doesn't seem very temporary... // LordHavoc: made this a saved cvar // COMMANDLINEOPTION: Console: -developer enables warnings and other notices (RECOMMENDED for mod developers) if (COM_CheckParm("-developer")) { developer.value = developer.integer = 1; developer.string = "1"; } if (COM_CheckParm("-developer2") || COM_CheckParm("-developer3")) { developer.value = developer.integer = 1; developer.string = "1"; developer_extra.value = developer_extra.integer = 1; developer_extra.string = "1"; developer_insane.value = developer_insane.integer = 1; developer_insane.string = "1"; developer_memory.value = developer_memory.integer = 1; developer_memory.string = "1"; developer_memorydebug.value = developer_memorydebug.integer = 1; developer_memorydebug.string = "1"; } if (COM_CheckParm("-developer3")) { gl_paranoid.integer = 1;gl_paranoid.string = "1"; gl_printcheckerror.integer = 1;gl_printcheckerror.string = "1"; } // COMMANDLINEOPTION: Console: -nostdout disables text output to the terminal the game was launched from if (COM_CheckParm("-nostdout")) sys_nostdout = 1; // used by everything Memory_Init(); // initialize console command/cvar/alias/command execution systems Cmd_Init(); // initialize memory subsystem cvars/commands Memory_Init_Commands(); // initialize console and logging and its cvars/commands Con_Init(); // initialize various cvars that could not be initialized earlier u8_Init(); Curl_Init_Commands(); Cmd_Init_Commands(); Sys_Init_Commands(); COM_Init_Commands(); FS_Init_Commands(); // initialize console window (only used by sys_win.c) Sys_InitConsole(); // initialize the self-pack (must be before COM_InitGameType as it may add command line options) FS_Init_SelfPack(); // detect gamemode from commandline options or executable name COM_InitGameType(); // construct a version string for the corner of the console os = DP_OS_NAME; dpsnprintf (engineversion, sizeof (engineversion), "%s %s %s", gamename, os, buildstring); Con_Printf("%s\n", engineversion); // initialize process nice level Sys_InitProcessNice(); // initialize ixtable Mathlib_Init(); // initialize filesystem (including fs_basedir, fs_gamedir, -game, scr_screenshot_name) FS_Init(); // register the cvars for session locking Host_InitSession(); // must be after FS_Init Crypto_Init(); Crypto_Init_Commands(); NetConn_Init(); Curl_Init(); //PR_Init(); //PR_Cmd_Init(); PRVM_Init(); Mod_Init(); World_Init(); SV_Init(); V_Init(); // some cvars needed by server player physics (cl_rollangle etc) Host_InitCommands(); Host_InitLocal(); Host_ServerOptions(); Thread_Init(); if (cls.state == ca_dedicated) Cmd_AddCommand ("disconnect", CL_Disconnect_f, "disconnect from server (or disconnect all clients if running a server)"); else { Con_DPrintf("Initializing client\n"); R_Modules_Init(); Palette_Init(); #ifdef CONFIG_MENU MR_Init_Commands(); #endif VID_Shared_Init(); VID_Init(); Render_Init(); S_Init(); CDAudio_Init(); Key_Init(); CL_Init(); } // save off current state of aliases, commands and cvars for later restore if FS_GameDir_f is called // NOTE: menu commands are freed by Cmd_RestoreInitState Cmd_SaveInitState(); // FIXME: put this into some neat design, but the menu should be allowed to crash // without crashing the whole game, so this should just be a short-time solution // here comes the not so critical stuff if (setjmp(host_abortframe)) { return; } Host_AddConfigText(); Cbuf_Execute(); // if stuffcmds wasn't run, then quake.rc is probably missing, use default if (!host_stuffcmdsrun) { Cbuf_AddText("exec default.cfg\nexec " CONFIGFILENAME "\nexec autoexec.cfg\nstuffcmds\n"); Cbuf_Execute(); } // put up the loading image so the user doesn't stare at a black screen... SCR_BeginLoadingPlaque(true); #ifdef CONFIG_MENU if (cls.state != ca_dedicated) { MR_Init(); } #endif // check for special benchmark mode // COMMANDLINEOPTION: Client: -benchmark <demoname> runs a timedemo and quits, results of any timedemo can be found in gamedir/benchmark.log (for example id1/benchmark.log) i = COM_CheckParm("-benchmark"); if (i && i + 1 < com_argc) if (!sv.active && !cls.demoplayback && !cls.connect_trying) { Cbuf_AddText(va(vabuf, sizeof(vabuf), "timedemo %s\n", com_argv[i + 1])); Cbuf_Execute(); } // check for special demo mode // COMMANDLINEOPTION: Client: -demo <demoname> runs a playdemo and quits i = COM_CheckParm("-demo"); if (i && i + 1 < com_argc) if (!sv.active && !cls.demoplayback && !cls.connect_trying) { Cbuf_AddText(va(vabuf, sizeof(vabuf), "playdemo %s\n", com_argv[i + 1])); Cbuf_Execute(); } // COMMANDLINEOPTION: Client: -capturedemo <demoname> captures a playdemo and quits i = COM_CheckParm("-capturedemo"); if (i && i + 1 < com_argc) if (!sv.active && !cls.demoplayback && !cls.connect_trying) { Cbuf_AddText(va(vabuf, sizeof(vabuf), "playdemo %s\ncl_capturevideo 1\n", com_argv[i + 1])); Cbuf_Execute(); } if (cls.state == ca_dedicated || COM_CheckParm("-listen")) if (!sv.active && !cls.demoplayback && !cls.connect_trying) { Cbuf_AddText("startmap_dm\n"); Cbuf_Execute(); } if (!sv.active && !cls.demoplayback && !cls.connect_trying) { #ifdef CONFIG_MENU Cbuf_AddText("togglemenu 1\n"); #endif Cbuf_Execute(); } Con_DPrint("========Initialized=========\n"); //Host_StartVideo(); if (cls.state != ca_dedicated) SV_StartThread(); }
void CDAudio_Play_byName (const char *trackname, qboolean looping, qboolean tryreal, float startposition) { unsigned int track; sfx_t* sfx; char filename[MAX_QPATH]; Host_StartVideo(); if (!enabled) return; if(tryreal && strspn(trackname, "0123456789") == strlen(trackname)) { track = (unsigned char) atoi(trackname); #ifdef MAXTRACKS if(track > 0 && track < MAXTRACKS) if(*remap[track]) { if(strspn(remap[track], "0123456789") == strlen(remap[track])) { trackname = remap[track]; } else { // ignore remappings to fake tracks if we're going to play a real track switch(cdaudio.integer) { case 0: // we never access CD case 1: // we have a replacement trackname = remap[track]; break; case 2: // we only use fake track replacement if CD track is invalid CDAudio_GetAudioDiskInfo(); if(!cdValid || track > maxTrack) trackname = remap[track]; break; case 3: // we always play from CD - ignore this remapping then case 4: // we randomize anyway break; } } } #endif } if(tryreal && strspn(trackname, "0123456789") == strlen(trackname)) { track = (unsigned char) atoi(trackname); if (track < 1) { Con_DPrintf("CDAudio: Bad track number %u.\n", track); return; } } else track = 0; // div0: I assume this code was intentionally there. Maybe turn it into a cvar? if (cdPlaying && cdPlayTrack == track && faketrack == -1) return; CDAudio_Stop (); if(track >= 1) { if(cdaudio.integer == 3) // only play real CD tracks at all { if(CDAudio_Play_real(track, looping, true)) goto success; return; } if(cdaudio.integer == 2) // prefer real CD track over fake { if(CDAudio_Play_real(track, looping, false)) goto success; } } if(cdaudio.integer == 4) // only play real CD tracks, EVEN instead of fake tracks! { if(CDAudio_Play_real(track, looping, false)) goto success; if(cdValid && maxTrack > 0) { track = 1 + (rand() % maxTrack); if(CDAudio_Play_real(track, looping, true)) goto success; } else { Con_DPrint ("No CD in player.\n"); } return; } // Try playing a fake track (sound file) first if(track >= 1) { dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%03u.wav", track); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%03u.ogg", track); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/track%03u.ogg", track);// added by motorsep if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/cdtracks/track%03u.ogg", track);// added by motorsep if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%02u.wav", track); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%02u.ogg", track); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/track%02u.ogg", track);// added by motorsep if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/cdtracks/track%02u.ogg", track);// added by motorsep } else { dpsnprintf(filename, sizeof(filename), "%s", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "%s.wav", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "%s.ogg", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s.wav", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s.ogg", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s.wav", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s.ogg", trackname); if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/%s.ogg", trackname); // added by motorsep if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "music/cdtracks/%s.ogg", trackname); // added by motorsep } if (FS_FileExists(filename) && (sfx = S_PrecacheSound (filename, false, true))) { faketrack = S_StartSound_StartPosition (-1, 0, sfx, vec3_origin, cdvolume, 0, startposition); if (faketrack != -1) { if (looping) S_SetChannelFlag (faketrack, CHANNELFLAG_FORCELOOP, true); S_SetChannelFlag (faketrack, CHANNELFLAG_FULLVOLUME, true); S_SetChannelFlag (faketrack, CHANNELFLAG_LOCALSOUND, true); // not pausable if(track >= 1) { if(cdaudio.integer != 0) // we don't need these messages if only fake tracks can be played anyway Con_DPrintf ("Fake CD track %u playing...\n", track); } else Con_DPrintf ("BGM track %s playing...\n", trackname); } } // If we can't play a fake CD track, try the real one if (faketrack == -1) { if(cdaudio.integer == 0 || track < 1) { Con_Print("Could not load BGM track.\n"); return; } else { if(!CDAudio_Play_real(track, looping, true)) return; } } success: cdPlayLooping = looping; cdPlayTrack = track; cdPlaying = true; if (cdvolume == 0.0 || bgmvolume.value == 0) CDAudio_Pause (); }
static void Palette_Load(void) { int i; unsigned char *out; float gamma, scale, base; fs_offset_t filesize; unsigned char *palfile; unsigned char texturegammaramp[256]; union { unsigned char b[4]; unsigned int i; } bgra; gamma = 1; scale = 1; base = 0; // COMMANDLINEOPTION: Client: -texgamma <number> sets the quake palette gamma, allowing you to make quake textures brighter/darker, not recommended i = COM_CheckParm("-texgamma"); if (i) gamma = atof(com_argv[i + 1]); // COMMANDLINEOPTION: Client: -texcontrast <number> sets the quake palette contrast, allowing you to make quake textures brighter/darker, not recommended i = COM_CheckParm("-texcontrast"); if (i) scale = atof(com_argv[i + 1]); // COMMANDLINEOPTION: Client: -texbrightness <number> sets the quake palette brightness (brightness of black), allowing you to make quake textures brighter/darker, not recommended i = COM_CheckParm("-texbrightness"); if (i) base = atof(com_argv[i + 1]); gamma = bound(0.01, gamma, 10.0); scale = bound(0.01, scale, 10.0); base = bound(0, base, 0.95); BuildGammaTable8(1.0f, gamma, scale, base, 1, texturegammaramp, 256); palfile = (unsigned char *)FS_LoadFile ("gfx/palette.lmp", tempmempool, false, &filesize); if (palfile && filesize >= 768) memcpy(palette_rgb, palfile, 768); else { Con_DPrint("Couldn't load gfx/palette.lmp, falling back on internal palette\n"); memcpy(palette_rgb, host_quakepal, 768); } if (palfile) Mem_Free(palfile); out = (unsigned char *) palette_bgra_complete; // palette is accessed as 32bit for speed reasons, but is created as 8bit bytes for (i = 0;i < 256;i++) { out[i*4+2] = texturegammaramp[palette_rgb[i][0]]; out[i*4+1] = texturegammaramp[palette_rgb[i][1]]; out[i*4+0] = texturegammaramp[palette_rgb[i][2]]; out[i*4+3] = 255; } if(*r_colormap_palette.string) palfile = (unsigned char *)FS_LoadFile (r_colormap_palette.string, tempmempool, false, &filesize); else palfile = NULL; if (palfile && filesize >= 48*2) { memcpy(palette_rgb_shirtcolormap[0], palfile, 48); memcpy(palette_rgb_shirtscoreboard[0], palfile + 48, 48); } else { for(i = 0;i < 16;i++) { VectorCopy(palette_rgb[(i << 4) | ((i >= 8 && i <= 13) ? 0x04 : 0x0C)], palette_rgb_shirtcolormap[i]); VectorCopy(palette_rgb[(i << 4) | 0x08], palette_rgb_shirtscoreboard[i]); } } if (palfile && filesize >= 48*4) { memcpy(palette_rgb_pantscolormap[0], palfile + 48*2, 48); memcpy(palette_rgb_pantsscoreboard[0], palfile + 48*3, 48); } else { memcpy(palette_rgb_pantscolormap, palette_rgb_shirtcolormap, sizeof(palette_rgb_pantscolormap)); memcpy(palette_rgb_pantsscoreboard, palette_rgb_shirtscoreboard, sizeof(palette_rgb_pantsscoreboard)); } if(palfile) Mem_Free(palfile); memset(palette_bgra_embeddedpic, 0, sizeof(palette_bgra_embeddedpic)); for (i = '1';i <= '7';i++) { Vector4Set(bgra.b, 255, 255, 255, (i - '0') * 255 / 7); palette_bgra_embeddedpic[i] = bgra.i; } Palette_SetupSpecialPalettes(); Palette_LoadQ2Colormap(); }
/* ==================== SndSys_Init Create "snd_renderbuffer" with the proper sound format if the call is successful May return a suggested format if the requested format isn't available ==================== */ qboolean SndSys_Init (const snd_format_t* requested, snd_format_t* suggested) { unsigned int buffersize; SDL_AudioSpec wantspec; SDL_AudioSpec obtainspec; snd_threaded = false; Con_DPrint ("SndSys_Init: using the SDL module\n"); // Init the SDL Audio subsystem if( SDL_InitSubSystem( SDL_INIT_AUDIO ) ) { Con_Print( "Initializing the SDL Audio subsystem failed!\n" ); return false; } buffersize = (unsigned int)ceil((double)requested->speed / 25.0); // 2048 bytes on 24kHz to 48kHz // Init the SDL Audio subsystem wantspec.callback = Buffer_Callback; wantspec.userdata = NULL; wantspec.freq = requested->speed; wantspec.format = ((requested->width == 1) ? AUDIO_U8 : AUDIO_S16SYS); wantspec.channels = requested->channels; wantspec.samples = CeilPowerOf2(buffersize); // needs to be a power of 2 on some platforms. Con_Printf("Wanted audio Specification:\n" "\tChannels : %i\n" "\tFormat : 0x%X\n" "\tFrequency : %i\n" "\tSamples : %i\n", wantspec.channels, wantspec.format, wantspec.freq, wantspec.samples); if( SDL_OpenAudio( &wantspec, &obtainspec ) ) { Con_Printf( "Failed to open the audio device! (%s)\n", SDL_GetError() ); return false; } Con_Printf("Obtained audio specification:\n" "\tChannels : %i\n" "\tFormat : 0x%X\n" "\tFrequency : %i\n" "\tSamples : %i\n", obtainspec.channels, obtainspec.format, obtainspec.freq, obtainspec.samples); // If we haven't obtained what we wanted if (wantspec.freq != obtainspec.freq || wantspec.format != obtainspec.format || wantspec.channels != obtainspec.channels) { SDL_CloseAudio(); // Pass the obtained format as a suggested format if (suggested != NULL) { suggested->speed = obtainspec.freq; // FIXME: check the format more carefully. There are plenty of unsupported cases suggested->width = ((obtainspec.format == AUDIO_U8) ? 1 : 2); suggested->channels = obtainspec.channels; } return false; } snd_threaded = true; snd_renderbuffer = Snd_CreateRingBuffer(requested, 0, NULL); if (snd_channellayout.integer == SND_CHANNELLAYOUT_AUTO) Cvar_SetValueQuick (&snd_channellayout, SND_CHANNELLAYOUT_STANDARD); sdlaudiotime = 0; SDL_PauseAudio( false ); return true; }