tidy up music keys, ALT-SHIFT-F9 ejects audio CDs

This commit is contained in:
kreatordxx 2008-06-15 08:50:05 +00:00
parent b20c810d1d
commit 16cfedcccd
7 changed files with 143 additions and 139 deletions

View file

@ -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
--------

View file

@ -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() {}

View file

@ -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 */

View file

@ -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

View file

@ -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
// ================================================================================================

View file

@ -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
**/

View file

@ -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);