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_InitJoystick();
I_InitSound();
I_InitMusic(midi_player);
I_InitMusic();
M_GetMidiDevices();
puts("NET_Init: Init network subsystem.");
NET_Init();

View File

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

View File

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

View File

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

View File

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

View File

@ -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"
},