Handle all user input in callback for sounds menu, being more judicious about when to restart the music. Also make the jukebox path input a NM_TYPE_INPUT_MENU, allowing the user to abort changes

This commit is contained in:
kreatordxx 2010-02-26 08:42:44 +00:00
parent dab80569a6
commit 7046ea43ff
3 changed files with 98 additions and 63 deletions

View file

@ -1,5 +1,9 @@
D1X-Rebirth Changelog
20100226
--------
main/menu.c, main/newmenu.c: Handle all user input in callback for sounds menu, being more judicious about when to restart the music. Also make the jukebox path input a NM_TYPE_INPUT_MENU, allowing the user to abort changes
20100225
--------
main/game.c, main/gamecntl.c, main/gameseq.c, main/state.c, main/state.h: Put fast save back, using Alt-F1 instead of F6

View file

@ -1079,90 +1079,120 @@ void set_extmusic_volume(int volume);
int sound_menuset(newmenu *menu, d_event *event, void *userdata)
{
newmenu_item *items = newmenu_get_items(menu);
int citem = newmenu_get_citem(menu);
int nitems = newmenu_get_nitems(menu);
int replay = 0;
int rval = 0;
switch (event->type)
{
case EVENT_NEWMENU_CHANGED:
switch (newmenu_get_citem(menu))
switch (citem)
{
case 0:
GameCfg.DigiVolume = items[0].value;
GameCfg.DigiVolume = items[citem].value;
digi_set_digi_volume( (GameCfg.DigiVolume*32768)/8 );
digi_play_sample_once( SOUND_DROP_BOMB, F1_0 );
break;
case 1:
GameCfg.MusicVolume = items[1].value;
GameCfg.MusicVolume = items[citem].value;
if (EXT_MUSIC_ON)
set_extmusic_volume(GameCfg.MusicVolume);
else
digi_set_midi_volume( (GameCfg.MusicVolume*128)/8 );
break;
case 3:
case 4:
GameCfg.SndEnableRedbook = items[4].value;
replay = 1;
break;
#ifdef USE_SDLMIXER
case 5:
GameCfg.JukeboxOn = items[citem].value;
replay = 1;
break;
#endif
default:
if (citem == nitems - 1)
GameCfg.ReverseStereo = items[citem].value;
else if (citem == nitems - 2)
{
GameCfg.OrigTrackOrder = items[citem].value;
replay = Game_wind != NULL;
}
break;
}
break;
#ifdef USE_SDLMIXER
case EVENT_NEWMENU_SELECTED:
if (citem == 7) // changed the jukebox path
replay = 1;
rval = 1; // stay in menu
break;
#endif
case EVENT_WINDOW_CLOSE:
d_free(items);
break;
default:
break;
}
if (replay)
{
ext_music_stop();
ext_music_unload();
ext_music_select_system(GameCfg.JukeboxOn ? EXT_MUSIC_JUKEBOX : EXT_MUSIC_REDBOOK);
if (Game_wind)
songs_play_level_song( Current_level_num );
else
songs_play_song(SONG_TITLE, 1);
}
userdata = userdata;
return 0;
return rval;
}
#ifdef USE_SDLMIXER
#define SOUND_MENU_NITEMS 10
#else
#define SOUND_MENU_NITEMS 7
#endif
void do_sound_menu()
{
newmenu_item *m;
int nitems = 0;
if (GameCfg.SndEnableRedbook && GameCfg.JukeboxOn)
GameCfg.JukeboxOn = 0;
MALLOC(m, newmenu_item, SOUND_MENU_NITEMS);
if (!m)
return;
m[nitems].type = NM_TYPE_SLIDER; m[nitems].text=TXT_FX_VOLUME; m[nitems].value=GameCfg.DigiVolume; m[nitems].min_value=0; m[nitems++].max_value=8;
m[nitems].type = NM_TYPE_SLIDER; m[nitems].text="music volume"; m[nitems].value=GameCfg.MusicVolume; m[nitems].min_value=0; m[nitems++].max_value=8;
m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="";
m[nitems].type = NM_TYPE_RADIO; m[nitems].text = "MIDI Music enabled"; m[nitems].value = (!GameCfg.SndEnableRedbook && !GameCfg.JukeboxOn); m[nitems].group = 0; nitems++;
m[nitems].type = NM_TYPE_RADIO; m[nitems].text="CD Music enabled"; m[nitems].value=GameCfg.SndEnableRedbook; m[nitems].group = 0; nitems++;
#ifdef USE_SDLMIXER
newmenu_item m[10];
#else
newmenu_item m[7];
m[nitems].type = NM_TYPE_RADIO; m[nitems].text="jukebox enabled"; m[nitems].value=GameCfg.JukeboxOn; m[nitems].group = 0; nitems++;
m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="path to music for jukebox:";
m[nitems].type = NM_TYPE_INPUT_MENU; m[nitems].text = GameCfg.JukeboxPath; m[nitems++].text_len = NM_MAX_TEXT_LEN-1;
#endif
int i = 0;
int nitems;
do {
if (GameCfg.SndEnableRedbook && GameCfg.JukeboxOn)
GameCfg.JukeboxOn = 0;
nitems = 0;
m[nitems].type = NM_TYPE_SLIDER; m[nitems].text=TXT_FX_VOLUME; m[nitems].value=GameCfg.DigiVolume; m[nitems].min_value=0; m[nitems++].max_value=8;
m[nitems].type = NM_TYPE_SLIDER; m[nitems].text="music volume"; m[nitems].value=GameCfg.MusicVolume; m[nitems].min_value=0; m[nitems++].max_value=8;
m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="";
m[nitems].type = NM_TYPE_RADIO; m[nitems].text = "MIDI Music enabled"; m[nitems].value = (!GameCfg.SndEnableRedbook && !GameCfg.JukeboxOn); m[nitems].group = 0; nitems++;
m[nitems].type = NM_TYPE_RADIO; m[nitems].text="CD Music enabled"; m[nitems].value=GameCfg.SndEnableRedbook; m[nitems].group = 0; nitems++;
#ifdef USE_SDLMIXER
m[nitems].type = NM_TYPE_RADIO; m[nitems].text="jukebox enabled"; m[nitems].value=GameCfg.JukeboxOn; m[nitems].group = 0; nitems++;
m[nitems].type = NM_TYPE_TEXT; m[nitems++].text="path to music for jukebox:";
m[nitems].type = NM_TYPE_INPUT; m[nitems].text = GameCfg.JukeboxPath; m[nitems++].text_len = NM_MAX_TEXT_LEN-1;
#endif
m[nitems].type = NM_TYPE_CHECK; m[nitems].text="Force Mac Descent CD track order"; m[nitems++].value=GameCfg.OrigTrackOrder;
m[nitems].type = NM_TYPE_CHECK; m[nitems].text=TXT_REVERSE_STEREO; m[nitems++].value=GameCfg.ReverseStereo;
i = newmenu_do1( NULL, "Sound Effects & Music", nitems, m, sound_menuset, NULL, i );
GameCfg.ReverseStereo = m[nitems - 1].value;
GameCfg.OrigTrackOrder = m[nitems - 2].value;
if ((GameCfg.SndEnableRedbook != m[4].value)
#ifdef USE_SDLMIXER
|| (GameCfg.JukeboxOn != m[5].value) || (GameCfg.JukeboxOn)
#endif
)
{
GameCfg.SndEnableRedbook = m[4].value;
#ifdef USE_SDLMIXER
GameCfg.JukeboxOn = m[5].value;
#endif
ext_music_stop();
ext_music_unload();
ext_music_select_system(GameCfg.JukeboxOn ? EXT_MUSIC_JUKEBOX : EXT_MUSIC_REDBOOK);
if (Function_mode == FMODE_GAME)
songs_play_level_song( Current_level_num );
else
songs_play_song(SONG_TITLE, 1);
}
} while( i>-1 );
m[nitems].type = NM_TYPE_CHECK; m[nitems].text="Force Mac Descent CD track order"; m[nitems++].value=GameCfg.OrigTrackOrder;
m[nitems].type = NM_TYPE_CHECK; m[nitems].text=TXT_REVERSE_STEREO; m[nitems++].value=GameCfg.ReverseStereo;
Assert(nitems == SOUND_MENU_NITEMS);
newmenu_do1( NULL, "Sound Effects & Music", nitems, m, sound_menuset, NULL, 0 );
}
#define ADD_CHECK(n,txt,v) do { m[n].type=NM_TYPE_CHECK; m[n].text=txt; m[n].value=v;} while (0)

View file

@ -729,6 +729,9 @@ int newmenu_key_command(window *wind, d_event *event, newmenu *menu)
}
} else
{
if (item->type==NM_TYPE_INPUT_MENU)
item->group = 0; // go out of editing mode
// Tell callback, allow staying in menu
event->type = EVENT_NEWMENU_SELECTED;
if (menu->subfunction && (*menu->subfunction)(menu, event, menu->userdata))
@ -1317,7 +1320,7 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item,
if (!menu)
return -1;
memset(menu, 0, sizeof(newmenu));
memset(menu, 0, sizeof(newmenu));
menu->citem = citem;
menu->scroll_offset = 0;
menu->last_scroll_check = -1;
@ -1435,23 +1438,21 @@ int newmenu_do4( char * title, char * subtitle, int nitems, newmenu_item * item,
item[i].right_offset = w1;
}
if ( item[i].type == NM_TYPE_INPUT ) {
if ((item[i].type == NM_TYPE_INPUT) || (item[i].type == NM_TYPE_INPUT_MENU))
{
Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN );
strcpy(item[i].saved_text, item[i].text );
nothers++;
string_width = item[i].text_len*FSPACX(8)+item[i].text_len;
if ( string_width > MAX_TEXT_WIDTH )
string_width = MAX_TEXT_WIDTH;
item[i].value = -1;
}
if ( item[i].type == NM_TYPE_INPUT_MENU ) {
Assert( strlen(item[i].text) < NM_MAX_TEXT_LEN );
strcpy(item[i].saved_text, item[i].text );
nmenus++;
string_width = item[i].text_len*FSPACX(8)+item[i].text_len;
item[i].value = -1;
item[i].group = 0;
if (item[i].type == NM_TYPE_INPUT_MENU)
nmenus++;
else
nothers++;
}
item[i].w = string_width;