void PlayLevelSong( int levelnum ) { int songnum; int n_tracks; int bD1Song = (gameData.missions.list[gameData.missions.nCurrentMission].descent_version == 1); Assert( levelnum != 0 ); if ( !gameData.songs.bInitialized ) songs_init(); SongsStopAll(); nCurrentLevelSong = levelnum; songnum = (levelnum > 0) ? levelnum - 1 : -levelnum; gameStates.sound.nCurrentSong = songnum; if (!RBAEnabled() && gameStates.sound.bRedbookEnabled && gameOpts->sound.bUseRedbook) reinit_redbook(); if (force_rb_register) { RBARegisterCD(); //get new track list for new CD force_rb_register = 0; } if (gameStates.sound.bRedbookEnabled && RBAEnabled() && (n_tracks = RBAGetNumberOfTracks()) > 1) { //try to play redbook play_redbook_track(REDBOOK_FIRST_LEVEL_TRACK + (songnum % (n_tracks-REDBOOK_FIRST_LEVEL_TRACK+1)),1); } if (! gameStates.sound.bRedbookPlaying) { //not playing redbook, so play midi songnum = gameData.songs.nLevelSongs [bD1Song] ? gameData.songs.nFirstLevelSong [bD1Song] + (songnum % gameData.songs.nLevelSongs [bD1Song]) : 0; gameStates.sound.nCurrentSong = songnum; DigiPlayMidiSong( gameData.songs.info [songnum].filename, gameData.songs.info [songnum].melodic_bank_file, gameData.songs.info [songnum].drum_bank_file, 1, bD1Song); } }
//returns 1 if track started sucessfully //start at tracknum. if keep_playing set, play to end of disc. else //play only specified track int play_redbook_track(int tracknum,int keep_playing) { gameStates.sound.bRedbookPlaying = 0; #ifdef _DEBUG tracknum = 1; #endif if (!RBAEnabled() && gameStates.sound.bRedbookEnabled && !gameOpts->sound.bUseRedbook) reinit_redbook(); if (force_rb_register) { RBARegisterCD(); //get new track list for new CD force_rb_register = 0; } if (gameStates.sound.bRedbookEnabled && RBAEnabled()) { int num_tracks = RBAGetNumberOfTracks(); if (tracknum <= num_tracks) if (RBAPlayTracks(tracknum,keep_playing?num_tracks:tracknum)) { gameStates.sound.bRedbookPlaying = tracknum; } } return (gameStates.sound.bRedbookPlaying != 0); }
void songs_play_song( int songnum, int repeat ) { #ifndef SHAREWARE //Assert(songnum != SONG_ENDLEVEL && songnum != SONG_ENDGAME); //not in full version #endif if ( !gameData.songs.bInitialized ) songs_init(); //stop any music already playing if (!(gameStates.sound.bRedbookEnabled ? gameConfig.nRedbookVolume : gameConfig.nMidiVolume)) return; SongsStopAll(); //do we want any of these to be redbook songs? if (force_rb_register) { RBARegisterCD(); //get new track list for new CD force_rb_register = 0; } gameStates.sound.nCurrentSong = songnum; if (songnum == SONG_TITLE) play_redbook_track(REDBOOK_TITLE_TRACK,0); else if (songnum == SONG_CREDITS) play_redbook_track(REDBOOK_CREDITS_TRACK,0); if (!gameStates.sound.bRedbookPlaying) { //not playing redbook, so play midi DigiPlayMidiSong( gameData.songs.info[songnum].filename, gameData.songs.info[songnum].melodic_bank_file, gameData.songs.info[songnum].drum_bank_file, repeat, gameData.songs.nD1Songs && (songnum >= gameData.songs.nD2Songs) ); } }
void SongsInit () { int i, bD1Songs; char *p, inputline [81]; CFILE cf; if (gameData.songs.bInitialized) return; CFUseD1HogFile ("descent.hog"); for (i = 0, bD1Songs = 0; bD1Songs < 2; bD1Songs++) { if (!FindArg ("-nomixer")) CD_blast_mixer (); // Crank it! if (CFExist ("descent.sng", gameFolders.szDataDir, bD1Songs)) { // mac (demo?) datafiles don't have the .sng file if (!CFOpen (&cf, "descent.sng", gameFolders.szDataDir, "rb", bD1Songs)) { if (bD1Songs) break; else Error ("Couldn't open descent.sng"); } while (CFGetS (inputline, 80, &cf)) { if ((p = strchr (inputline,'\n'))) *p = '\0'; if (*inputline) { Assert(i < MAX_NUM_SONGS); if (3 == sscanf (inputline, "%s %s %s", gameData.songs.info [i].filename, gameData.songs.info [i].melodicBankFile, gameData.songs.info [i].drumBankFile)) { if (!gameData.songs.nFirstLevelSong [bD1Songs] && strstr (gameData.songs.info [i].filename, "game01.hmp")) gameData.songs.nFirstLevelSong [bD1Songs] = i; if (bD1Songs && strstr (gameData.songs.info [i].filename, "endlevel.hmp")) gameData.songs.nD1EndLevelSong = i; i++; } } } gameData.songs.nSongs [bD1Songs] = i; gameData.songs.nLevelSongs [bD1Songs] = gameData.songs.nSongs [bD1Songs] - gameData.songs.nFirstLevelSong [bD1Songs]; if (!gameData.songs.nFirstLevelSong [bD1Songs]) Error ("Descent 1 songs are missing."); CFClose(&cf); } gameData.songs.nTotalSongs = i; gameData.songs.bInitialized = 1; // RBA Hook if (!gameOpts->sound.bUseRedbook) gameStates.sound.bRedbookEnabled = 0; else { // use redbook RBAInit (); if (RBAEnabled ()) { SetRedbookVolume(gameConfig.nRedbookVolume); RBARegisterCD (); } } atexit(RBAStop); // stop song on exit } }
void ReInitRedbook () { RBAInit (); if (RBAEnabled ()) { SetRedbookVolume (gameConfig.nRedbookVolume); RBARegisterCD (); bForceRBRegister = 0; } }
void reinit_redbook() { #ifndef __MSDOS__ RBAInit(); #else RBAInit(toupper(CDROM_dir[0]) - 'A'); #endif if (RBAEnabled()) { set_redbook_volume(gameConfig.nRedbookVolume); RBARegisterCD(); force_rb_register=0; } }
void PlayLevelSong (int nLevel, int bFromHog) { int nSong; int nTracks; int bD1Song = (gameData.missions.list [gameData.missions.nCurrentMission].nDescentVersion == 1); char szFilename [FILENAME_LEN]; if (!nLevel) return; if (!gameData.songs.bInitialized) SongsInit (); SongsStopAll (); nCurrentLevelSong = nLevel; nSong = (nLevel > 0) ? nLevel - 1 : -nLevel; gameStates.sound.nCurrentSong = nSong; if (!RBAEnabled () && gameStates.sound.bRedbookEnabled && gameOpts->sound.bUseRedbook) ReInitRedbook (); if (bForceRBRegister) { RBARegisterCD (); //get new track list for new CD bForceRBRegister = 0; } if (bFromHog) { strcpy (szFilename, LevelSongName (nLevel)); if (*szFilename && CFExtract (szFilename, gameFolders.szDataDir, 0, szFilename)) { char szSong [FILENAME_LEN]; sprintf (szSong, "%s%s%s", gameFolders.szCacheDir, *gameFolders.szCacheDir ? "/" : "", szFilename); if (DigiPlayMidiSong (szSong, NULL, NULL, 1, 0)) return; } } if ((nLevel > 0) && gameData.songs.user.nLevelSongs) { if (DigiPlayMidiSong (gameData.songs.user.pszLevelSongs [(nLevel - 1) % gameData.songs.user.nLevelSongs], NULL, NULL, 1, 0)) return; } if (gameStates.sound.bRedbookEnabled && RBAEnabled () && (nTracks = RBAGetNumberOfTracks ()) > 1) //try to play redbook PlayRedbookTrack (REDBOOK_FIRST_LEVEL_TRACK + (nSong % (nTracks-REDBOOK_FIRST_LEVEL_TRACK+1)),1); if (!gameStates.sound.bRedbookPlaying) { //not playing redbook, so play midi nSong = gameData.songs.nLevelSongs [bD1Song] ? gameData.songs.nFirstLevelSong [bD1Song] + (nSong % gameData.songs.nLevelSongs [bD1Song]) : 0; gameStates.sound.nCurrentSong = nSong; DigiPlayMidiSong ( gameData.songs.info [nSong].filename, gameData.songs.info [nSong].melodicBankFile, gameData.songs.info [nSong].drumBankFile, 1, bD1Song); } }
int main() { fix fsecs; int oldmin=-1, oldsec=-1; error_init(NULL, NULL); dpmi_init(0); timer_init(); key_init(); RBAInit(); RBARegisterCD(); RBAPlayTrack(2); fsecs = timer_get_fixed_seconds(); do { int min, sec, frame; long headloc; if ((timer_get_fixed_seconds() - fsecs) >= F2_0) { headloc = RBAGetHeadLoc(&min, &sec, &frame); printf("Head loc: %d (%d:%d:%d)\n", headloc, min, sec, frame); if (min==oldmin && sec==oldsec) { printf("\nRepeating track..\n"); RBAPlayTrack(2); } oldmin = min; oldsec = sec; fsecs = timer_get_fixed_seconds(); } if (key_inkey()) { RBAStop(); printf("\nCD stopped.\n"); break; } } while (1); key_close(); timer_close(); return 0; }
void SongsPlaySong (int nSong, int repeat) { //Assert(nSong != SONG_ENDLEVEL && nSong != SONG_ENDGAME); //not in full version if (!gameData.songs.bInitialized) SongsInit (); //stop any music already playing if (!(gameStates.sound.bRedbookEnabled ? gameConfig.nRedbookVolume : gameConfig.nMidiVolume)) return; SongsStopAll (); //do we want any of these to be redbook songs? if (bForceRBRegister) { RBARegisterCD (); //get new track list for new CD bForceRBRegister = 0; } gameStates.sound.nCurrentSong = nSong; if (nSong == SONG_TITLE) { if (*gameData.songs.user.szIntroSong && DigiPlayMidiSong (gameData.songs.user.szIntroSong, NULL, NULL, repeat, 0)) return; PlayRedbookTrack (REDBOOK_TITLE_TRACK, 0); } else if (nSong == SONG_CREDITS) { if (*gameData.songs.user.szCreditsSong && DigiPlayMidiSong (gameData.songs.user.szCreditsSong, NULL, NULL, repeat, 0)) return; PlayRedbookTrack (REDBOOK_CREDITS_TRACK, 0); } else if (nSong == SONG_BRIEFING) { if (*gameData.songs.user.szBriefingSong && DigiPlayMidiSong (gameData.songs.user.szBriefingSong, NULL, NULL, repeat, 0)) return; } if (!gameStates.sound.bRedbookPlaying) { //not playing redbook, so play midi DigiPlayMidiSong ( gameData.songs.info [nSong].filename, gameData.songs.info [nSong].melodicBankFile, gameData.songs.info [nSong].drumBankFile, repeat, gameData.songs.nSongs [1] && (nSong >= gameData.songs.nSongs [0])); } }
//------------------------------------------------------------------------------ //returns 1 if track started sucessfully //start at nTrack. if bKeepPlaying set, play to end of disc. else //play only specified track int PlayRedbookTrack (int nTrack, int bKeepPlaying) { gameStates.sound.bRedbookPlaying = 0; #if DBG nTrack = 1; #endif if (!RBAEnabled () && gameStates.sound.bRedbookEnabled && !gameOpts->sound.bUseRedbook) ReInitRedbook (); if (bForceRBRegister) { RBARegisterCD (); //get new track list for new CD bForceRBRegister = 0; } if (gameStates.sound.bRedbookEnabled && RBAEnabled ()) { int nTracks = RBAGetNumberOfTracks (); if (nTrack <= nTracks) if (RBAPlayTracks(nTrack, bKeepPlaying ? nTracks : nTrack)) { gameStates.sound.bRedbookPlaying = nTrack; } } return (gameStates.sound.bRedbookPlaying != 0); }
void songs_init() { int i, bD1Songs; char inputline[80+1]; CFILE * fp; if ( gameData.songs.bInitialized ) return; CFUseD1HogFile("descent.hog"); for (bD1Songs = 0; bD1Songs < 2; bD1Songs++) { #if !defined(WINDOWS) if (!FindArg("-nomixer")) CD_blast_mixer(); // Crank it! #endif if (CFExist("descent.sng", gameFolders.szDataDir, bD1Songs)) { // mac (demo?) datafiles don't have the .sng file fp = CFOpen( "descent.sng", gameFolders.szDataDir, "rb", bD1Songs ); if ( fp == NULL ) { if (bD1Songs) break; else Error( "Couldn't open descent.sng" ); } i = gameData.songs.nSongs; while (CFGetS(inputline, 80, fp )) { char *p = strchr(inputline,'\n'); if (p) *p = '\0'; if ( strlen( inputline ) ) { Assert( i < MAX_NUM_SONGS ); sscanf( inputline, "%s %s %s", gameData.songs.info[i].filename, gameData.songs.info[i].melodic_bank_file, gameData.songs.info[i].drum_bank_file ); if (!gameData.songs.nFirstLevelSong [bD1Songs] && strstr (gameData.songs.info [i].filename, "game01.hmp")) gameData.songs.nFirstLevelSong [bD1Songs] = i; if (bD1Songs && strstr (gameData.songs.info [i].filename, "endlevel.hmp")) gameData.songs.nD1EndLevelSong = i; ////printf( "%d. '%s' '%s' '%s'\n",i,gameData.songs.info[i].filename,gameData.songs.info[i].melodic_bank_file,gameData.songs.info[i].drum_bank_file ); i++; } } if (bD1Songs) gameData.songs.nD1Songs = i - gameData.songs.nSongs; else gameData.songs.nD2Songs = i - gameData.songs.nSongs; gameData.songs.nSongs = i; gameData.songs.nLevelSongs [bD1Songs] = gameData.songs.nSongs - gameData.songs.nFirstLevelSong [bD1Songs]; if (!gameData.songs.nFirstLevelSong [bD1Songs]) Error("gameData.songs.info are missing."); CFClose(fp); } gameData.songs.bInitialized = 1; // RBA Hook #if !defined(SHAREWARE) || ( defined(SHAREWARE) && defined(APPLE_DEMO) ) if (!gameOpts->sound.bUseRedbook) gameStates.sound.bRedbookEnabled = 0; else // use redbook { #ifndef __MSDOS__ RBAInit(); #else RBAInit(toupper(CDROM_dir[0]) - 'A'); #endif if (RBAEnabled()) { set_redbook_volume(gameConfig.nRedbookVolume); RBARegisterCD(); } } atexit(RBAStop); // stop song on exit #endif // endof ifndef SHAREWARE, ie ifdef SHAREWARE } }