commit ed86fc6286d78f4b7ccae6d21f3032390e2fc5ca
Author: ceski <56656010+ceski-1@users.noreply.github.com>
AuthorDate: Thu Oct 26 06:04:07 2023 -0700
Commit: GitHub <noreply@github.com>
CommitDate: Thu Oct 26 16:04:07 2023 +0300
win midi: Fall back to default midi device (#1624)
* win midi: Fall back to default midi device
* Simplify, avoid const string
* Use strncasecmp
* Formatting
---
src/i_winmusic.c | 40 ++++++++-------------------
src/setup/sound.c | 83 +++++++++++++++++--------------------------------------
2 files changed, 37 insertions(+), 86 deletions(-)
diff --git a/src/i_winmusic.c b/src/i_winmusic.c
index c02aac4a..54341f18 100644
--- a/src/i_winmusic.c
+++ b/src/i_winmusic.c
@@ -1379,45 +1379,27 @@ static DWORD WINAPI PlayerProc(void)
static boolean I_WIN_InitMusic(void)
{
- int all_devices;
+ const int all_devices = midiOutGetNumDevs();
int i;
- MIDIOUTCAPS mcaps;
MMRESULT mmr;
- // find the midi device that matches the saved one
- if (winmm_midi_device != NULL)
+ for (i = 0; i < all_devices; i++)
{
- all_devices = midiOutGetNumDevs() + 1; // include MIDI_MAPPER
- for (i = 0; i < all_devices; ++i)
- {
- // start from device id -1 (MIDI_MAPPER)
- mmr = midiOutGetDevCaps(i - 1, &mcaps, sizeof(mcaps));
- if (mmr == MMSYSERR_NOERROR)
- {
- if (strstr(winmm_midi_device, mcaps.szPname))
- {
- MidiDevice = i - 1;
- break;
- }
- }
+ MIDIOUTCAPS caps;
- if (i == all_devices - 1)
- {
- // give up and use MIDI_MAPPER
- free(winmm_midi_device);
- winmm_midi_device = NULL;
- }
+ if (midiOutGetDevCaps(i, &caps, sizeof(caps)) == MMSYSERR_NOERROR &&
+ !strncasecmp(winmm_midi_device, caps.szPname, MAXPNAMELEN))
+ {
+ MidiDevice = i;
+ break;
}
}
- if (winmm_midi_device == NULL)
+ if (i == all_devices)
{
+ free(winmm_midi_device);
+ winmm_midi_device = M_StringDuplicate("Microsoft MIDI Mapper");
MidiDevice = MIDI_MAPPER;
- mmr = midiOutGetDevCaps(MIDI_MAPPER, &mcaps, sizeof(mcaps));
- if (mmr == MMSYSERR_NOERROR)
- {
- winmm_midi_device = M_StringDuplicate(mcaps.szPname);
- }
}
mmr = midiStreamOpen(&hMidiStream, &MidiDevice, (DWORD)1,
diff --git a/src/setup/sound.c b/src/setup/sound.c
index 6f5de1f7..95203ef0 100644
--- a/src/setup/sound.c
+++ b/src/setup/sound.c
@@ -80,8 +80,7 @@ static char *gus_patch_path = NULL;
static int gus_ram_kb = 1024;
#ifdef _WIN32
#define MAX_MIDI_DEVICES 20
-static char **midi_names;
-static int midi_num_devices;
+static char *midi_names[MAX_MIDI_DEVICES];
static int midi_index;
char *winmm_midi_device = NULL;
int winmm_complevel = 0;
@@ -170,74 +169,44 @@ static void UpdateMidiDevice(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(data))
static txt_dropdown_list_t *MidiDeviceSelector(void)
{
txt_dropdown_list_t *result;
- int all_devices;
- int device_ids[MAX_MIDI_DEVICES];
- MMRESULT mmr;
- MIDIOUTCAPS mcaps;
+ int num_devices = 1;
+ int all_devices = midiOutGetNumDevs();
int i;
- if (midi_num_devices > 0)
- {
- for (i = 0; i < midi_num_devices; ++i)
- {
- free(midi_names[i]);
- midi_names[i] = NULL;
- }
- free(midi_names);
- midi_names = NULL;
- }
- midi_num_devices = 0;
+ midi_index = 0;
+ free(midi_names[0]);
+ midi_names[0] = M_StringDuplicate("Microsoft MIDI Mapper");
- // get the number of midi devices on this system
- all_devices = midiOutGetNumDevs() + 1; // include MIDI_MAPPER
- if (all_devices > MAX_MIDI_DEVICES)
+ if (all_devices > MAX_MIDI_DEVICES - num_devices)
{
- all_devices = MAX_MIDI_DEVICES;
+ all_devices = MAX_MIDI_DEVICES - num_devices;
}
- // get the valid device ids only, starting from -1 (MIDI_MAPPER)
- for (i = 0; i < all_devices; ++i)
+ for (i = 0; i < all_devices; i++)
{
- mmr = midiOutGetDevCaps(i - 1, &mcaps, sizeof(mcaps));
- if (mmr == MMSYSERR_NOERROR)
- {
- device_ids[midi_num_devices] = i - 1;
- midi_num_devices++;
- }
- }
+ MIDIOUTCAPS caps;
- // get the device names
- midi_names = malloc(midi_num_devices * sizeof(char *));
- for (i = 0; i < midi_num_devices; ++i)
- {
- mmr = midiOutGetDevCaps(device_ids[i], &mcaps, sizeof(mcaps));
- if (mmr == MMSYSERR_NOERROR)
+ if (midiOutGetDevCaps(i, &caps, sizeof(caps)) == MMSYSERR_NOERROR)
{
- midi_names[i] = M_StringDuplicate(mcaps.szPname);
- }
- }
+ free(midi_names[num_devices]);
+ midi_names[num_devices] = M_StringDuplicate(caps.szPname);
- // set the dropdown list index to the previously selected device
- for (i = 0; i < midi_num_devices; ++i)
- {
- if (winmm_midi_device != NULL &&
- strstr(winmm_midi_device, midi_names[i]))
- {
- midi_index = i;
- break;
- }
- else if (winmm_midi_device == NULL || i == midi_num_devices - 1)
- {
- // give up and use MIDI_MAPPER
- midi_index = 0;
- free(winmm_midi_device);
- winmm_midi_device = M_StringDuplicate(midi_names[0]);
- break;
+ if (!strncasecmp(winmm_midi_device, midi_names[num_devices],
+ MAXPNAMELEN))
+ {
+ // Set the dropdown list index to the saved device.
+ midi_index = num_devices;
+ }
+
+ num_devices++;
}
}
- result = TXT_NewDropdownList(&midi_index, (const char **)midi_names,
- midi_num_devices);
+ free(winmm_midi_device);
+ winmm_midi_device = M_StringDuplicate(midi_names[midi_index]);
+
+ result = TXT_NewDropdownList(&midi_index, (const char **) midi_names,
+ num_devices);
TXT_SignalConnect(result, "changed", UpdateMidiDevice, NULL);
return result;