foxygit / doom Log in
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;