void CDAudio_Play(byte track, qboolean looping) { HANDLE playingThread; char filename[MAX_PATH]; struct ThreadArgList_t *tal; if (!enabled) return; if (!cdValid) { CDAudio_GetAudioDiskInfo(); if (!cdValid) return; } track = remap[track]; if (track < 1 || track > maxTrack) { Con_DPrintf("CDAudio: Bad track number %u.\n", track); return; } if (playing) { if (playTrack == track) return; CDAudio_Stop(); } tal = malloc(sizeof(struct ThreadArgList_t)); tal->playLooping = looping; tal->playTrack = track; sprintf(filename, "%s\\Track%03d.ogg", com_gamedir, track); if (!OpenOGG(filename, tal)) { sprintf(filename, "%s\\sound\\cdtracks\\Track%03d.ogg", com_gamedir, track); if (!OpenOGG(filename, tal)) { Con_DPrintf("CDAudio: Cannot open Vorbis file \"%s\"", filename); return; } } playLooping = looping; playTrack = track; playing = true; // force volume update cdvolume = -1; playingThread = (HANDLE)_beginthreadex(NULL, 0, PlayingThreadProc, tal, CREATE_SUSPENDED, NULL); SetThreadPriority(playingThread, THREAD_PRIORITY_TIME_CRITICAL); ResumeThread(playingThread); }
//----------------------------------------------------------------------------- // Name: idWaveFile::Open() // Desc: Opens a wave file for reading //----------------------------------------------------------------------------- int idWaveFile::Open(const char *strFileName, waveformatex_t *pwfx) { mbIsReadingFromMemory = false; mpbData = NULL; mpbDataCur = mpbData; if (strFileName == NULL) { return -1; } idStr name = strFileName; // note: used to only check for .wav when making a build name.SetFileExtension(".ogg"); if (fileSystem->ReadFile(name, NULL, NULL) != -1) { return OpenOGG(name, pwfx); } memset(&mpwfx, 0, sizeof(waveformatextensible_t)); mhmmio = fileSystem->OpenFileRead(strFileName); if (!mhmmio) { mdwSize = 0; return -1; } if (mhmmio->Length() <= 0) { mhmmio = NULL; return -1; } if (ReadMMIO() != 0) { // ReadMMIO will fail if its an not a wave file Close(); return -1; } mfileTime = mhmmio->Timestamp(); if (ResetFile() != 0) { Close(); return -1; } // After the reset, the size of the wav file is mck.cksize so store it now mdwSize = mck.cksize / sizeof(short); mMemSize = mck.cksize; if (mck.cksize != 0xffffffff) { if (pwfx) { memcpy(pwfx, (waveformatex_t *)&mpwfx, sizeof(waveformatex_t)); } return 0; } return -1; }