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`
This commit is contained in:
Roman Fomin 2022-12-13 20:34:55 +07:00 committed by GitHub
parent 1f39b0dc36
commit 2f27fa739a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 76 additions and 78 deletions

View File

@ -2502,7 +2502,8 @@ void D_DoomMain(void)
I_InitTimer(); I_InitTimer();
I_InitJoystick(); I_InitJoystick();
I_InitSound(); I_InitSound();
I_InitMusic(midi_player); I_InitMusic();
M_GetMidiDevices();
puts("NET_Init: Init network subsystem."); puts("NET_Init: Init network subsystem.");
NET_Init(); NET_Init();

View File

@ -715,46 +715,6 @@ static int GetSliceSize(void)
return 1024; 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 // 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 // haleyjd 04/11/03: don't use music if sfx aren't init'd
// (may be dependent, docs are unclear) // (may be dependent, docs are unclear)
@ -830,26 +828,29 @@ boolean I_InitMusic(int music_module_index)
} }
// always initilize SDL music // always initilize SDL music
active_module = &music_sdl_module; music_sdl_module.I_InitMusic(0);
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;
}
I_AtExit(I_ShutdownMusic, true); 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; 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 // Get a list of devices for all music modules. Retrieve the selected device, as
// each module manages and stores its own devices independently. // each module manages and stores its own devices independently.
int I_DeviceList(const char *devices[], int size, int music_module_index, int I_DeviceList(const char *devices[], int size, int *current_device)
int *current_device)
{ {
int i, accum; 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; music_modules[i].num_devices = numdev;
if (i == music_module_index) if (midi_player == i)
{ {
*current_device = accum + curdev; *current_device = accum + curdev;
} }

View File

@ -110,12 +110,14 @@ typedef struct
int (*I_DeviceList)(const char *devices[], int size, int *current_device); int (*I_DeviceList)(const char *devices[], int size, int *current_device);
} music_module_t; } music_module_t;
boolean I_InitMusic(int device); extern int midi_player;
boolean I_InitMusic(void);
void I_ShutdownMusic(void); void I_ShutdownMusic(void);
#define DEFAULT_MIDI_DEVICE -1 // use saved music module device #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. // Volume.
void I_SetMusicVolume(int volume); void I_SetMusicVolume(int volume);
@ -139,8 +141,7 @@ void I_StopSong(void *handle);
// See above (register), then think backwards // See above (register), then think backwards
void I_UnRegisterSong(void *handle); void I_UnRegisterSong(void *handle);
int I_DeviceList(const char *devices[], int size, int music_module_index, int I_DeviceList(const char *devices[], int size, int *current_device);
int *current_device);
// Determine whether memory block is a .mid file // Determine whether memory block is a .mid file
boolean IsMid(byte *mem, int len); boolean IsMid(byte *mem, int len);

View File

@ -3871,11 +3871,9 @@ enum {
gen1_end2, gen1_end2,
}; };
int midi_player;
int midi_player_menu; 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) void static M_SmoothLight(void)
{ {
@ -3909,7 +3907,7 @@ static void M_ResetGamma(void)
static void M_SetMidiPlayer(void) static void M_SetMidiPlayer(void)
{ {
S_StopMusic(); S_StopMusic();
I_SetMidiPlayer(&midi_player, midi_player_menu); I_SetMidiPlayer(midi_player_menu);
S_SetMusicVolume(snd_MusicVolume); S_SetMusicVolume(snd_MusicVolume);
S_RestartMusic(); 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, int numdev = I_DeviceList(midi_player_menu_strings,
midi_player, &midi_player_menu); MAX_MIDI_PLAYER_MENU_ITEMS - 1, &midi_player_menu);
midi_player_menu_strings[numdev] = NULL; midi_player_menu_strings[numdev] = NULL;
} }
@ -6921,8 +6919,6 @@ static void M_GetMidiDevices(void)
// //
void M_Init(void) void M_Init(void)
{ {
M_GetMidiDevices();
M_InitDefaults(); // killough 11/98 M_InitDefaults(); // killough 11/98
currentMenu = &MainDef; currentMenu = &MainDef;
menuactive = 0; menuactive = 0;

View File

@ -198,8 +198,8 @@ typedef enum
extern background_t menu_background; extern background_t menu_background;
extern boolean M_MenuIsShaded(void); extern boolean M_MenuIsShaded(void);
extern int midi_player; #define MAX_MIDI_PLAYER_MENU_ITEMS 16
#define MAX_MIDI_PLAYERS 16 extern void M_GetMidiDevices(void);
#endif #endif

View File

@ -2293,7 +2293,7 @@ default_t defaults[] = {
{ {
"midi_player_menu", "midi_player_menu",
(config_t *) &midi_player_menu, NULL, (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" "MIDI Player menu index"
}, },