From 16cfedcccda9727bf79663b35aaf64a7829cfcb8 Mon Sep 17 00:00:00 2001 From: kreatordxx <> Date: Sun, 15 Jun 2008 08:50:05 +0000 Subject: [PATCH] tidy up music keys, ALT-SHIFT-F9 ejects audio CDs --- CHANGELOG.txt | 1 + arch/sdl/digi_mixer.c | 3 +- arch/sdl/rbaudio.c | 102 ++++++++++++++++++++++++++------------ include/rbaudio.h | 3 +- main/game.c | 111 ++++++++++++++++-------------------------- main/inferno.h | 6 +++ main/songs.c | 56 ++++++++------------- 7 files changed, 143 insertions(+), 139 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index f294c7c81..99c7e1eca 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,7 @@ D1X-Rebirth Changelog 20080615 -------- main/gameseq.c, main/mission.c, main/newdemo.c, main/scores.c: Fixed scores write (wasn't PhysFS); Fixed PLAYING_BUILTING_MISSION in D1X; Better call for DoJasonInterpolate in demo code (hopefully) +arch/sdl/digi_mixer.c, arch/sdl/rbaudio.c, include/inferno.h, include/rbaudio.h, main/game.c, main/songs.c: tidy up music keys, ALT-SHIFT-F9 ejects audio CDs 20080612 -------- diff --git a/arch/sdl/digi_mixer.c b/arch/sdl/digi_mixer.c index 91984d07c..5f0d87582 100644 --- a/arch/sdl/digi_mixer.c +++ b/arch/sdl/digi_mixer.c @@ -278,7 +278,8 @@ void digi_mixer_stop_current_song() { digi_midi_song_playing = 0; } #endif - jukebox_stop(); //stops jukebox as well as standard music + jukebox_stop(); + mix_stop_music(); } void digi_mixer_pause_midi() {} diff --git a/arch/sdl/rbaudio.c b/arch/sdl/rbaudio.c index a640839d0..28b8601c8 100644 --- a/arch/sdl/rbaudio.c +++ b/arch/sdl/rbaudio.c @@ -31,7 +31,7 @@ static int initialised = 0; void RBAExit() { - if (initialised) + if (s_cd) { SDL_CDStop(s_cd); SDL_CDClose(s_cd); @@ -40,6 +40,9 @@ void RBAExit() void RBAInit() { + int num_cds; + int i,j; + if (initialised) return; if (SDL_Init(SDL_INIT_CDROM) < 0) @@ -48,34 +51,20 @@ void RBAInit() return; } - RBARegisterCD(); - - atexit(RBAExit); - initialised = 1; -} - -int RBAEnabled() -{ - return initialised; -} - -void RBARegisterCD() -{ - int num_cds; - int i,j; - - if (s_cd && CD_INDRIVE(SDL_CDStatus(s_cd))) - return; - num_cds = SDL_CDNumDrives(); if (num_cds < 1) { Warning("No cdrom drives found!\n"); +#if defined(__APPLE__) || defined(macintosh) + SDL_QuitSubSystem(SDL_INIT_CDROM); // necessary for rescanning CDROMs +#endif return; } for (i = 0; i < num_cds; i++) { + if (s_cd) + SDL_CDClose(s_cd); s_cd = SDL_CDOpen(i); if (s_cd && CD_INDRIVE(SDL_CDStatus(s_cd))) @@ -89,17 +78,36 @@ void RBARegisterCD() if (j != s_cd->numtracks) break; // we've found an audio CD } + else if (s_cd == NULL) + Warning("Could not open cdrom %i for redbook audio:%s\n", i, SDL_GetError()); } + if (i == num_cds) { - Warning("Could not open cdrom for redbook audio!\n"); + Warning("No audio CDs found\n"); + if (s_cd) // if there's no audio CD, say that there's no redbook and hence play MIDI instead + { + SDL_CDClose(s_cd); + s_cd = NULL; + } +#if defined(__APPLE__) || defined(macintosh) + SDL_QuitSubSystem(SDL_INIT_CDROM); // necessary for rescanning CDROMs +#endif return; } + + atexit(RBAExit); + initialised = 1; +} + +int RBAEnabled() +{ + return initialised; } int RBAPlayTrack(int a) { - if (!initialised) return -1; + if (!s_cd) return -1; if (CD_INDRIVE(SDL_CDStatus(s_cd)) ) { SDL_CDPlayTracks(s_cd, a-1, 0, 0, 0); @@ -109,17 +117,27 @@ int RBAPlayTrack(int a) void RBAStop() { - if (!initialised) return; + if (!s_cd) return; SDL_CDStop(s_cd); } +void RBAEjectDisk() +{ + if (!s_cd) return; + SDL_CDEject(s_cd); // play nothing until it tries to load a song +#if defined(__APPLE__) || defined(macintosh) + SDL_QuitSubSystem(SDL_INIT_CDROM); // necessary for rescanning CDROMs +#endif + initialised = 0; +} + void RBASetVolume(int volume) { #ifdef __linux__ int cdfile, level; struct cdrom_volctrl volctrl; - if (!initialised) return; + if (!s_cd) return; cdfile = s_cd->id; level = volume * 3; @@ -143,20 +161,34 @@ void RBASetVolume(int volume) void RBAPause() { - if (!initialised) return; + if (!s_cd) return; SDL_CDPause(s_cd); } int RBAResume() { - if (!initialised) return -1; + if (!s_cd) return -1; SDL_CDResume(s_cd); return 1; } +int RBAPauseResume() +{ + if (!s_cd) return 0; + + if (SDL_CDStatus(s_cd) == CD_PLAYING) + SDL_CDPause(s_cd); + else if (SDL_CDStatus(s_cd) == CD_PAUSED) + SDL_CDResume(s_cd); + else + return 0; + + return 1; +} + int RBAGetNumberOfTracks() { - if (!initialised) return -1; + if (!s_cd) return -1; SDL_CDStatus(s_cd); return s_cd->numtracks; } @@ -164,7 +196,7 @@ int RBAGetNumberOfTracks() // plays tracks first through last, inclusive int RBAPlayTracks(int first, int last) { - if (!initialised) + if (!s_cd) return 0; if (CD_INDRIVE(SDL_CDStatus(s_cd))) @@ -178,7 +210,7 @@ int RBAPlayTracks(int first, int last) // is called. Returns 0 if no track playing, else track number int RBAGetTrackNum() { - if (!initialised) + if (!s_cd) return 0; if (SDL_CDStatus(s_cd) != CD_PLAYING) @@ -189,7 +221,15 @@ int RBAGetTrackNum() int RBAPeekPlayStatus() { - return (SDL_CDStatus(s_cd) == CD_PLAYING); + if (!s_cd) + return 0; + + if (SDL_CDStatus(s_cd) == CD_PLAYING) + return 1; + else if (SDL_CDStatus(s_cd) == CD_PAUSED) // hack so it doesn't keep restarting paused music + return -1; + + return 0; } static int cddb_sum(int n) @@ -213,7 +253,7 @@ unsigned long RBAGetDiscID() { int i, t = 0, n = 0; - if (!initialised) + if (!s_cd) return 0; /* For backward compatibility this algorithm must not change */ diff --git a/include/rbaudio.h b/include/rbaudio.h index 216a61f2f..1506c2e6a 100644 --- a/include/rbaudio.h +++ b/include/rbaudio.h @@ -30,7 +30,6 @@ typedef struct _RBACHANNELCTL { #else extern void RBAInit(ubyte cd_drive_num); //drive a == 0, drive b == 1 #endif -extern void RBARegisterCD(void); extern long RBAGetDeviceStatus(void); extern int RBAPlayTrack(int track); extern int RBAPlayTracks(int first, int last); //plays tracks first through last, inclusive @@ -38,6 +37,7 @@ extern int RBACheckMediaChange(); extern long RBAGetHeadLoc(int *min, int *sec, int *frame); extern int RBAPeekPlayStatus(void); extern void RBAStop(void); +extern void RBAEjectDisk(void); extern void RBASetStereoAudio(RBACHANNELCTL *channels); extern void RBASetQuadAudio(RBACHANNELCTL *channels); extern void RBAGetAudioInfo(RBACHANNELCTL *channels); @@ -49,6 +49,7 @@ extern void RBAEnable(void); extern int RBAGetNumberOfTracks(void); extern void RBAPause(); extern int RBAResume(); +extern int RBAPauseResume(); //return the track number currently playing. Useful if RBAPlayTracks() //is called. Returns 0 if no track playing, else track number diff --git a/main/game.c b/main/game.c index 6b701ea93..ab1b1e38a 100644 --- a/main/game.c +++ b/main/game.c @@ -1402,10 +1402,16 @@ int do_game_pause() return key; } +#ifdef USE_SDLMIXER +#define EXT_MUSIC_TEXT "Jukebox/Audio CD" +#else +#define EXT_MUSIC_TEXT "Audio CD" +#endif + void show_help() { int nitems = 0; - newmenu_item m[25]; + newmenu_item m[26]; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_ESC; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "SHIFT-ESC\t SHOW GAME LOG"; @@ -1418,10 +1424,9 @@ void show_help() m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_PRTSCN; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_1TO5; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = TXT_HELP_6TO10; -#ifdef USE_SDLMIXER - m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "Alt-Shift-F10\t Play/Pause Jukebox"; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "Alt-Shift-F9\t Eject Audio CD"; + m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "Alt-Shift-F10\t Play/Pause " EXT_MUSIC_TEXT; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "Alt-Shift-F11/F12\t Previous/Next Song"; -#endif m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = ""; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "MULTIPLAYER:"; m[nitems].type = NM_TYPE_TEXT; m[nitems++].text = "ALT-F4\t SHOW RETICLE NAMES"; @@ -2196,84 +2201,50 @@ void HandleGameKey(int key) case KEY_ALTED+KEY_F2: if (!Player_is_dead) state_save_all( 0 ); break; // 0 means not between levels. case KEY_ALTED+KEY_F3: if (!Player_is_dead) state_restore_all(1); break; - case KEY_MINUS + KEY_ALTED: songs_goto_prev_song(); break; - case KEY_EQUAL + KEY_ALTED: songs_goto_next_song(); break; - -#ifdef MACINTOSH - - case KEY_COMMAND+KEY_M: -#if !defined(SHAREWARE) || defined(APPLE_DEMO) - if ( (Game_mode & GM_MULTI) ) // don't process in multiplayer games - break; - - key_close(); // no processing of keys with keyboard handler.. jeez - stop_time(); - show_boxed_message ("Mounting CD\nESC to quit", 0); - RBAMountDisk(); // OS has totaly control of the CD. - if (Function_mode == FMODE_MENU) - songs_play_song(SONG_TITLE,1); - else if (Function_mode == FMODE_GAME) - songs_play_level_song( Current_level_num ); - key_init(); - start_time(); -#endif - - break; - - case KEY_COMMAND+KEY_E: + /* + * Jukebox hotkeys -- MD2211, 2007 + * Now for all music + * ============================================== + */ + case KEY_ALTED + KEY_SHIFTED + KEY_F9: + MAC(case KEY_COMMAND+KEY_E:) songs_stop_redbook(); RBAEjectDisk(); break; - case KEY_COMMAND+KEY_RIGHT: - songs_goto_next_song(); - break; - case KEY_COMMAND+KEY_LEFT: - songs_goto_prev_song(); - break; - case KEY_COMMAND+KEY_UP: - songs_play_level_song(1); - break; - case KEY_COMMAND+KEY_DOWN: - songs_stop_redbook(); + case KEY_ALTED + KEY_SHIFTED + KEY_F10: + MAC(case KEY_COMMAND+KEY_UP:) + MAC(case KEY_COMMAND+KEY_DOWN:) + if (GameCfg.SndEnableRedbook && !RBAPauseResume()) + { + if (Function_mode == FMODE_GAME) + songs_play_level_song( Current_level_num ); + else if (Function_mode == FMODE_MENU) + songs_play_song(SONG_TITLE, 1); + } +#ifdef USE_SDLMIXER + jukebox_pause_resume(); +#endif break; + case KEY_MINUS + KEY_ALTED: + case KEY_ALTED + KEY_SHIFTED + KEY_F11: + MAC(case KEY_COMMAND+KEY_LEFT:) + songs_goto_prev_song(); + break; + case KEY_EQUAL + KEY_ALTED: + case KEY_ALTED + KEY_SHIFTED + KEY_F12: + MAC(case KEY_COMMAND+KEY_RIGHT:) + songs_goto_next_song(); + break; + +#ifdef MACINTOSH case KEY_COMMAND+KEY_Q: if ( !(Game_mode & GM_MULTI) ) macintosh_quit(); break; #endif - -#ifdef USE_SDLMIXER - /* - * Jukebox hotkeys -- MD2211, 2007 - * ============================================== - */ - case KEY_ALTED + KEY_SHIFTED + KEY_F10: - jukebox_pause_resume(); - break; - case KEY_ALTED + KEY_SHIFTED + KEY_F11: - if (GameCfg.JukeboxOn) - jukebox_prev(); - else - songs_goto_prev_song(); - break; - case KEY_ALTED + KEY_SHIFTED + KEY_F12: - if (GameCfg.JukeboxOn) - jukebox_next(); - else - songs_goto_next_song(); - break; -#else - case KEY_ALTED + KEY_SHIFTED + KEY_F11: - songs_goto_prev_song(); - break; - case KEY_ALTED + KEY_SHIFTED + KEY_F12: - songs_goto_next_song(); - break; -#endif - //use function keys for window sizing // ================================================================================================ diff --git a/main/inferno.h b/main/inferno.h index 02b581d3f..a2984303b 100644 --- a/main/inferno.h +++ b/main/inferno.h @@ -20,6 +20,12 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #ifndef _INFERNO_H #define _INFERNO_H +#if MACINTOSH +#define MAC(x) x +#else +#define MAC(x) +#endif + /** ** Constants **/ diff --git a/main/songs.c b/main/songs.c index 9da5a91f0..abec2a60d 100644 --- a/main/songs.c +++ b/main/songs.c @@ -30,6 +30,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "rbaudio.h" #include "config.h" #include "timer.h" +#include "jukebox.h" song_info Songs[MAX_SONGS]; int Songs_initialized = 0; @@ -144,12 +145,7 @@ void songs_init() if (GameCfg.SndEnableRedbook) { RBAInit(); - - if (RBAEnabled()) - { - set_redbook_volume(GameCfg.MusicVolume); - RBARegisterCD(); - } + set_redbook_volume(GameCfg.MusicVolume); } atexit(RBAStop); // stop song on exit #endif // endof ifndef SHAREWARE, ie ifdef SHAREWARE @@ -194,18 +190,10 @@ void songs_stop_all(void) songs_stop_redbook(); // Stop CD, if playing } -int force_rb_register=0; - void reinit_redbook() { RBAInit(); - - if (RBAEnabled()) - { - set_redbook_volume(GameCfg.MusicVolume); - RBARegisterCD(); - force_rb_register=0; - } + set_redbook_volume(GameCfg.MusicVolume); } @@ -216,15 +204,10 @@ int play_redbook_track(int tracknum,int keep_playing) { Redbook_playing = 0; - if ((RBAGetNumberOfTracks() < 1) && GameCfg.SndEnableRedbook) + if (!RBAEnabled() && GameCfg.SndEnableRedbook) reinit_redbook(); - if (force_rb_register) { - RBARegisterCD(); //get new track list for new CD - force_rb_register = 0; - } - - if (GameCfg.SndEnableRedbook && RBAEnabled()) { + if (GameCfg.SndEnableRedbook) { int num_tracks = RBAGetNumberOfTracks(); if (tracknum <= num_tracks) if (RBAPlayTracks(tracknum,keep_playing?num_tracks:tracknum)) { @@ -247,11 +230,6 @@ void songs_play_song( int songnum, int repeat ) songs_stop_all(); - if (force_rb_register) { - RBARegisterCD(); //get new track list for new CD - force_rb_register = 0; - } - // The endgame track is the last track... if (songnum < SONG_ENDGAME) play_redbook_track(songnum + 2,0); @@ -287,15 +265,7 @@ void songs_play_level_song( int levelnum ) else songnum = (levelnum-1) % cGameSongsAvailable; - if ((RBAGetNumberOfTracks() < 2) && GameCfg.SndEnableRedbook) - reinit_redbook(); - - if (force_rb_register) { - RBARegisterCD(); //get new track list for new CD - force_rb_register = 0; - } - - if (GameCfg.SndEnableRedbook && RBAEnabled() && (n_tracks = RBAGetNumberOfTracks()) > 1) { + if (GameCfg.SndEnableRedbook) { //try to play redbook @@ -333,6 +303,13 @@ void songs_goto_next_song() { if (Redbook_playing) //get correct track current_song_level = RBAGetTrackNum() - REDBOOK_FIRST_LEVEL_TRACK + 1; +#ifdef USE_SDLMIXER + else if (GameCfg.JukeboxOn) + { + jukebox_next(); + return; + } +#endif songs_play_level_song(current_song_level+1); @@ -343,6 +320,13 @@ void songs_goto_prev_song() { if (Redbook_playing) //get correct track current_song_level = RBAGetTrackNum() - REDBOOK_FIRST_LEVEL_TRACK + 1; +#ifdef USE_SDLMIXER + else if (GameCfg.JukeboxOn) + { + jukebox_prev(); + return; + } +#endif if (current_song_level > 1) songs_play_level_song(current_song_level-1);