diff --git a/src/d_main.c b/src/d_main.c index 2de9a3f4..3d27f3c9 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -2688,6 +2688,7 @@ void D_DoomMain(void) I_InitController(); I_InitSound(); I_InitMusic(); + MN_InitMidiPlayer(); I_Printf(VB_INFO, "NET_Init: Init network subsystem."); NET_Init(); diff --git a/src/i_flmusic.c b/src/i_flmusic.c index 323433ec..f0efa089 100644 --- a/src/i_flmusic.c +++ b/src/i_flmusic.c @@ -136,7 +136,10 @@ static void GetSoundFonts(void) { char *left, *p, *dup_path; - array_clear(soundfonts); + if (array_size(soundfonts)) + { + return; + } // Split into individual dirs within the list. dup_path = M_StringDuplicate(soundfont_dir); @@ -413,7 +416,7 @@ static const char **I_FL_DeviceList(void) for (int i = 0; i < array_size(soundfonts); ++i) { char *name = M_StringDuplicate(M_BaseName(soundfonts[i])); - if (strlen(name) >= NAME_MAX_LENGTH) + if (strlen(name) > NAME_MAX_LENGTH) { name[NAME_MAX_LENGTH] = '\0'; } diff --git a/src/i_sound.c b/src/i_sound.c index b88c75a8..633da6fa 100644 --- a/src/i_sound.c +++ b/src/i_sound.c @@ -29,7 +29,6 @@ #include "i_printf.h" #include "i_system.h" #include "m_array.h" -#include "mn_setup.h" #include "p_mobj.h" #include "sounds.h" #include "w_wad.h" @@ -509,13 +508,15 @@ void I_SetSoundModule(int device) } } -void I_SetMidiPlayer(int device) +void I_SetMidiPlayer(int *menu_index) { if (nomusicparm) { return; } + const int device = *menu_index; + if (midi_module) { midi_module->I_ShutdownMusic(); @@ -542,13 +543,20 @@ void I_SetMidiPlayer(int device) // Fall back the the first module that initializes, device 0. + count_devices = 0; + for (int i = 0; i < arrlen(music_modules); ++i) { + const char **strings = music_modules[i]->I_DeviceList(); + if (music_modules[i]->I_InitMusic(0)) { midi_module = music_modules[i]; + *menu_index = count_devices; return; } + + count_devices += array_size(strings); } I_Error("I_SetMidiPlayer: No music module could be initialized"); @@ -568,8 +576,6 @@ boolean I_InitMusic(void) I_AtExit(I_ShutdownMusic, true); - I_SetMidiPlayer(midi_player_menu); - return true; } diff --git a/src/i_sound.h b/src/i_sound.h index 82ab689c..0aea3296 100644 --- a/src/i_sound.h +++ b/src/i_sound.h @@ -179,7 +179,7 @@ extern music_module_t music_mid_module; boolean I_InitMusic(void); void I_ShutdownMusic(void); -void I_SetMidiPlayer(int device); +void I_SetMidiPlayer(int *menu_index); // Volume. void I_SetMusicVolume(int volume); diff --git a/src/m_config.c b/src/m_config.c index 75c855d1..87f72283 100644 --- a/src/m_config.c +++ b/src/m_config.c @@ -461,6 +461,13 @@ default_t defaults[] = { "MIDI Player menu index" }, + { + "midi_player_string", + (config_t *) &midi_player_string, NULL, + {.s = ""}, {0}, string, ss_none, wad_no, + "MIDI Player string" + }, + #if defined(HAVE_FLUIDSYNTH) { "soundfont_dir", diff --git a/src/mn_menu.h b/src/mn_menu.h index 8aff2079..c9b0c626 100644 --- a/src/mn_menu.h +++ b/src/mn_menu.h @@ -81,6 +81,8 @@ boolean MN_MenuIsShaded(void); void MN_SetQuickSaveSlot(int slot); +void MN_InitMidiPlayer(void); + void MN_InitMenuStrings(void); boolean MN_StartsWithMapIdentifier(char *str); diff --git a/src/mn_setup.c b/src/mn_setup.c index 21c4ee33..3dc4df83 100644 --- a/src/mn_setup.c +++ b/src/mn_setup.c @@ -2048,23 +2048,17 @@ static void SetSoundModule(void) } int midi_player_menu; - -static const char **GetMidiDevicesStrings(void) -{ - const char **devices = I_DeviceList(); - if (midi_player_menu >= array_size(devices)) - { - midi_player_menu = 0; - } - return devices; -} +const char *midi_player_string = ""; static void SetMidiPlayer(void) { S_StopMusic(); - I_SetMidiPlayer(midi_player_menu); + I_SetMidiPlayer(&midi_player_menu); S_SetMusicVolume(snd_MusicVolume); S_RestartMusic(); + + const char **strings = GetStrings(str_midi_player); + midi_player_string = strings[midi_player_menu]; } static setup_menu_t gen_settings2[] = { @@ -3801,11 +3795,34 @@ static void UpdateHUDModeStrings(void) selectstrings[str_hudmode] = GetHUDModeStrings(); } +void MN_InitMidiPlayer(void) +{ + const char **devices = I_DeviceList(); + + for (int i = 0; i < array_size(devices); ++i) + { + if (!strcasecmp(devices[i], midi_player_string)) + { + midi_player_menu = i; + break; + } + } + + if (midi_player_menu >= array_size(devices)) + { + midi_player_menu = 0; + } + + I_SetMidiPlayer(&midi_player_menu); + midi_player_string = devices[midi_player_menu]; + + selectstrings[str_midi_player] = devices; +} + void MN_InitMenuStrings(void) { UpdateHUDModeStrings(); selectstrings[str_resolution_scale] = GetResolutionScaleStrings(); - selectstrings[str_midi_player] = GetMidiDevicesStrings(); selectstrings[str_mouse_accel] = GetMouseAccelStrings(); } diff --git a/src/mn_setup.h b/src/mn_setup.h index 30f8c4da..aab8e6ff 100644 --- a/src/mn_setup.h +++ b/src/mn_setup.h @@ -93,6 +93,7 @@ void MN_DrawEnemy(void); extern int resolution_scale; extern int midi_player_menu; +extern const char *midi_player_string; ///////////////////////////// //