From 2f27fa739a1a5d324a58952b8c561643856f0d4b Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Tue, 13 Dec 2022 20:34:55 +0700 Subject: [PATCH] fall back to `module 0 device 0` if the music module failed to initialize (#845) * fall back to `module 0 device 0` if the music module failed to initialize Remove `music_module_index`, use instead `midi_player` - it's global anyway. * add fall back to `I_SetMidiPlayer` --- src/d_main.c | 3 +- src/i_sound.c | 122 +++++++++++++++++++++++++------------------------- src/i_sound.h | 9 ++-- src/m_menu.c | 14 +++--- src/m_menu.h | 4 +- src/m_misc.c | 2 +- 6 files changed, 76 insertions(+), 78 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 47b3f4df..b92a9d14 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -2502,7 +2502,8 @@ void D_DoomMain(void) I_InitTimer(); I_InitJoystick(); I_InitSound(); - I_InitMusic(midi_player); + I_InitMusic(); + M_GetMidiDevices(); puts("NET_Init: Init network subsystem."); NET_Init(); diff --git a/src/i_sound.c b/src/i_sound.c index 1a2b3b9d..41baad80 100644 --- a/src/i_sound.c +++ b/src/i_sound.c @@ -715,46 +715,6 @@ static int GetSliceSize(void) return 1024; } -// Set the midi player device. Retrieve the current music module, as it may -// change when select a device. - -void I_SetMidiPlayer(int *music_module_index, int device) -{ - int i, accum; - - if (midi_player_module) - { - midi_player_module->I_ShutdownMusic(); - midi_player_module = NULL; - } - - for (i = 0, accum = 0; i < arrlen(music_modules); ++i) - { - int num_devices = music_modules[i].num_devices; - - if (device >= accum && device < accum + num_devices) - { - midi_player_module = music_modules[i].module; - *music_module_index = i; - device -= accum; - break; - } - - accum += num_devices; - } - - if (midi_player_module) - { - active_module = midi_player_module; - if (!active_module->I_InitMusic(device)) - { - // fall back to SDL on error - midi_player_module = NULL; - active_module = &music_sdl_module; - } - } -} - // // I_InitSound // @@ -820,7 +780,45 @@ void I_InitSound(void) } } -boolean I_InitMusic(int music_module_index) +int midi_player; // current music module + +void I_SetMidiPlayer(int device) +{ + int i, accum; + + if (midi_player_module) + { + midi_player_module->I_ShutdownMusic(); + midi_player_module = NULL; + } + + for (i = 0, accum = 0; i < arrlen(music_modules); ++i) + { + int num_devices = music_modules[i].num_devices; + + if (device >= accum && device < accum + num_devices) + { + midi_player_module = music_modules[i].module; + midi_player = i; + device -= accum; + break; + } + + accum += num_devices; + } + + if (!midi_player_module->I_InitMusic(device)) + { + midi_player_module = music_modules[0].module; + if (midi_player_module != &music_sdl_module) + { + midi_player_module->I_InitMusic(0); + } + } + active_module = midi_player_module; +} + +boolean I_InitMusic(void) { // haleyjd 04/11/03: don't use music if sfx aren't init'd // (may be dependent, docs are unclear) @@ -830,26 +828,29 @@ boolean I_InitMusic(int music_module_index) } // always initilize SDL music - active_module = &music_sdl_module; - active_module->I_InitMusic(0); - - if (music_module_index >= arrlen(music_modules)) - { - music_module_index = 0; - } - - midi_player_module = music_modules[music_module_index].module; - if (midi_player_module->I_InitMusic(DEFAULT_MIDI_DEVICE)) - { - active_module = midi_player_module; - } - else - { - midi_player_module = NULL; - } + music_sdl_module.I_InitMusic(0); I_AtExit(I_ShutdownMusic, true); + if (midi_player < arrlen(music_modules)) + { + midi_player_module = music_modules[midi_player].module; + if (midi_player_module->I_InitMusic(DEFAULT_MIDI_DEVICE)) + { + active_module = midi_player_module; + return true; + } + } + + // Fall back to module 0 device 0. + midi_player = 0; + midi_player_module = music_modules[0].module; + if (midi_player_module != &music_sdl_module) + { + midi_player_module->I_InitMusic(0); + } + active_module = midi_player_module; + return true; } @@ -929,8 +930,7 @@ void I_UnRegisterSong(void *handle) // Get a list of devices for all music modules. Retrieve the selected device, as // each module manages and stores its own devices independently. -int I_DeviceList(const char *devices[], int size, int music_module_index, - int *current_device) +int I_DeviceList(const char *devices[], int size, int *current_device) { int i, accum; @@ -945,7 +945,7 @@ int I_DeviceList(const char *devices[], int size, int music_module_index, music_modules[i].num_devices = numdev; - if (i == music_module_index) + if (midi_player == i) { *current_device = accum + curdev; } diff --git a/src/i_sound.h b/src/i_sound.h index 665ef03e..4b3dd1d5 100644 --- a/src/i_sound.h +++ b/src/i_sound.h @@ -110,12 +110,14 @@ typedef struct int (*I_DeviceList)(const char *devices[], int size, int *current_device); } music_module_t; -boolean I_InitMusic(int device); +extern int midi_player; + +boolean I_InitMusic(void); void I_ShutdownMusic(void); #define DEFAULT_MIDI_DEVICE -1 // use saved music module device -void I_SetMidiPlayer(int *music_module_index, int device); +void I_SetMidiPlayer(int device); // Volume. void I_SetMusicVolume(int volume); @@ -139,8 +141,7 @@ void I_StopSong(void *handle); // See above (register), then think backwards void I_UnRegisterSong(void *handle); -int I_DeviceList(const char *devices[], int size, int music_module_index, - int *current_device); +int I_DeviceList(const char *devices[], int size, int *current_device); // Determine whether memory block is a .mid file boolean IsMid(byte *mem, int len); diff --git a/src/m_menu.c b/src/m_menu.c index 4d345dd9..d7f92c3e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3871,11 +3871,9 @@ enum { gen1_end2, }; -int midi_player; - int midi_player_menu; -static const char *midi_player_menu_strings[MAX_MIDI_PLAYERS]; +static const char *midi_player_menu_strings[MAX_MIDI_PLAYER_MENU_ITEMS]; void static M_SmoothLight(void) { @@ -3909,7 +3907,7 @@ static void M_ResetGamma(void) static void M_SetMidiPlayer(void) { S_StopMusic(); - I_SetMidiPlayer(&midi_player, midi_player_menu); + I_SetMidiPlayer(midi_player_menu); S_SetMusicVolume(snd_MusicVolume); S_RestartMusic(); } @@ -6908,10 +6906,10 @@ void M_InitHelpScreen() } } -static void M_GetMidiDevices(void) +void M_GetMidiDevices(void) { - int numdev = I_DeviceList(midi_player_menu_strings, MAX_MIDI_PLAYERS - 1, - midi_player, &midi_player_menu); + int numdev = I_DeviceList(midi_player_menu_strings, + MAX_MIDI_PLAYER_MENU_ITEMS - 1, &midi_player_menu); midi_player_menu_strings[numdev] = NULL; } @@ -6921,8 +6919,6 @@ static void M_GetMidiDevices(void) // void M_Init(void) { - M_GetMidiDevices(); - M_InitDefaults(); // killough 11/98 currentMenu = &MainDef; menuactive = 0; diff --git a/src/m_menu.h b/src/m_menu.h index e477212c..81bd4e3c 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -198,8 +198,8 @@ typedef enum extern background_t menu_background; extern boolean M_MenuIsShaded(void); -extern int midi_player; -#define MAX_MIDI_PLAYERS 16 +#define MAX_MIDI_PLAYER_MENU_ITEMS 16 +extern void M_GetMidiDevices(void); #endif diff --git a/src/m_misc.c b/src/m_misc.c index 489ea3e9..7527c1e7 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2293,7 +2293,7 @@ default_t defaults[] = { { "midi_player_menu", (config_t *) &midi_player_menu, NULL, - {0}, {0, MAX_MIDI_PLAYERS - 1}, number, ss_gen, wad_no, + {0}, {0, MAX_MIDI_PLAYER_MENU_ITEMS - 1}, number, ss_gen, wad_no, "MIDI Player menu index" },