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) ); } }
//this should be called regularly to check for redbook restart void songs_check_redbook_repeat() { static fix last_check_time; fix current_time; if (!gameStates.sound.bRedbookPlaying || gameConfig.nRedbookVolume==0) return; current_time = TimerGetFixedSeconds(); if (current_time < last_check_time || (current_time - last_check_time) >= F2_0) { if (!RBAPeekPlayStatus()) { StopTime(); // if title ends, start credit music // if credits music ends, restart it if (gameStates.sound.bRedbookPlaying == REDBOOK_TITLE_TRACK || gameStates.sound.bRedbookPlaying == REDBOOK_CREDITS_TRACK) play_redbook_track(REDBOOK_CREDITS_TRACK,0); else { //songs_goto_next_song(); //new code plays all tracks to end of disk, so if disk has //stopped we must be at end. So start again with level 1 song. PlayLevelSong(1); } StartTime(); } last_check_time = current_time; } }
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); } }
void songs_play_song( int songnum, int repeat ) { songs_init(); //stop any music already playing songs_stop_all(); // The endgame track is the last track... if (songnum < SONG_ENDGAME) play_redbook_track(songnum + 2,0); else if (songnum == SONG_ENDGAME) play_redbook_track(REDBOOK_ENDGAME_TRACK,0); else if (songnum > SONG_ENDGAME) play_redbook_track(songnum + 1,0); if (!Redbook_playing) //not playing redbook, so play midi digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, repeat ); }
void digi_play_midi_song(int songnum, int loop ) { OSErr err; song_resource *song; ushort midi_id; if (!digi_initialized) return; digi_last_midi_song = songnum; digi_last_midi_song_loop = loop; #ifndef MAC_SHAREWARE if ( !have_descent_cd ) { if ( !cd_playing && !digi_cd_started ) redbook_start_play(); digi_cd_started = 1; return; } #endif digi_stop_current_song(); if (midi_volume < 1) return; #ifdef MAC_SHAREWARE Song_handle = GetResource('SONG', songnum); if (!Song_handle) return; song = (song_resource *)(*Song_handle); midi_id = song->midi_id; Midi_handle = GetResource('Midi', midi_id); if (!Midi_handle) { ReleaseResource(Song_handle); return; } song->sound_voices = digi_max_channels; song->norm_voices = 4 + (digi_max_channels/2); err = BeginSongFromMemory(songnum, Song_handle, Midi_handle, loop); if (err != noErr) return; #else play_redbook_track(songnum, loop); #endif digi_midi_song_playing = 1; }
//this should be called regularly to check for redbook restart //ideally, this would be handled by a hook void songs_check_redbook_repeat() { static fix last_check_time; fix current_time; if (!Redbook_playing || GameCfg.MusicVolume==0) return; current_time = timer_get_fixed_seconds(); if (current_time < last_check_time || (current_time - last_check_time) >= F2_0) { if (!RBAPeekPlayStatus() && (Redbook_playing != REDBOOK_ENDLEVEL_TRACK)) { stop_time(); play_redbook_track(Redbook_playing, 0); start_time(); } last_check_time = current_time; } }
void songs_play_level_song( int levelnum ) { int songnum; int n_tracks; Assert( levelnum != 0 ); songs_init(); songs_stop_all(); if (cGameSongsAvailable < 1) return; current_song_level = levelnum; if (levelnum < 0) songnum = (-levelnum) % cGameSongsAvailable; else songnum = (levelnum-1) % cGameSongsAvailable; if (!RBAEnabled() && GameCfg.SndEnableRedbook) // need this to determine if we currently have the official CD reinit_redbook(); n_tracks = RBAGetNumberOfTracks(); if (RBAEnabled() && GameCfg.SndEnableRedbook) { //try to play redbook play_redbook_track(REDBOOK_FIRST_LEVEL_TRACK + (songnum % (n_tracks-REDBOOK_FIRST_LEVEL_TRACK+1)),!songs_haved1_cd()); } if (! Redbook_playing) { //not playing redbook, so play midi songnum += SONG_LEVEL_MUSIC; digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, 1 ); } }