Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ft2-clone for openSUSE:Factory 
checked in at 2024-04-10 17:49:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ft2-clone (Old)
 and      /work/SRC/openSUSE:Factory/.ft2-clone.new.29460 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ft2-clone"

Wed Apr 10 17:49:58 2024 rev:14 rq:1166626 version:1.81

Changes:
--------
--- /work/SRC/openSUSE:Factory/ft2-clone/ft2-clone.changes      2024-03-19 
17:32:10.367496530 +0100
+++ /work/SRC/openSUSE:Factory/.ft2-clone.new.29460/ft2-clone.changes   
2024-04-10 17:50:56.989708886 +0200
@@ -1,0 +2,11 @@
+Tue Apr  9 17:41:44 UTC 2024 - Martin Hauke <[email protected]>
+
+- Update to version 1.81
+  * Rewrote some of the MIDI init/close code, as it looked like
+    it could be buggy.
+- Update to version 1.80
+  * Doing note transpose on the whole song wouldn't count
+    overflowing notes properly (it would sometimes not show a
+    warning message first)
+
+-------------------------------------------------------------------

Old:
----
  ft2-clone-1.79.tar.gz

New:
----
  ft2-clone-1.81.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ft2-clone.spec ++++++
--- /var/tmp/diff_new_pack.XFLsAF/_old  2024-04-10 17:50:57.477726847 +0200
+++ /var/tmp/diff_new_pack.XFLsAF/_new  2024-04-10 17:50:57.477726847 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           ft2-clone
-Version:        1.79
+Version:        1.81
 Release:        0
 Summary:        Fasttracker II clone
 License:        BSD-3-Clause AND CC-BY-NC-SA-4.0

++++++ ft2-clone-1.79.tar.gz -> ft2-clone-1.81.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_platform.h
 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_platform.h
--- 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_platform.h
   2024-03-18 15:44:31.000000000 +0100
+++ 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_platform.h
   2024-04-09 19:31:47.000000000 +0200
@@ -199,8 +199,10 @@
 #undef __GDK__
 #define __GDK__ 1
 #endif
-#if defined(__PSP__)
+#if defined(__PSP__) || defined(__psp__)
+#ifdef __PSP__
 #undef __PSP__
+#endif
 #define __PSP__ 1
 #endif
 #if defined(PS2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_revision.h
 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_revision.h
--- 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_revision.h
   2024-03-18 15:44:31.000000000 +0100
+++ 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_revision.h
   2024-04-09 19:31:47.000000000 +0200
@@ -1,7 +1,7 @@
 /* Generated by updaterev.sh, do not edit */
 #ifdef SDL_VENDOR_INFO
-#define SDL_REVISION "SDL-release-2.30.1-0-g5adbf3765 (" SDL_VENDOR_INFO ")"
+#define SDL_REVISION "SDL-release-2.30.2-0-gf461d91cd (" SDL_VENDOR_INFO ")"
 #else
-#define SDL_REVISION "SDL-release-2.30.1-0-g5adbf3765"
+#define SDL_REVISION "SDL-release-2.30.2-0-gf461d91cd"
 #endif
 #define SDL_REVISION_NUMBER 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
--- 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
    2024-03-18 15:44:31.000000000 +0100
+++ 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Headers/SDL_version.h
    2024-04-09 19:31:47.000000000 +0200
@@ -59,7 +59,7 @@
 */
 #define SDL_MAJOR_VERSION   2
 #define SDL_MINOR_VERSION   30
-#define SDL_PATCHLEVEL      1
+#define SDL_PATCHLEVEL      2
 
 /**
  * Macro to determine SDL version program was compiled against.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
--- 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
     2024-03-18 15:44:31.000000000 +0100
+++ 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/Info.plist
     2024-04-09 19:31:47.000000000 +0200
@@ -3,7 +3,7 @@
 <plist version="1.0">
 <dict>
        <key>BuildMachineOSBuild</key>
-       <string>23D60</string>
+       <string>23E224</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
@@ -19,7 +19,7 @@
        <key>CFBundlePackageType</key>
        <string>FMWK</string>
        <key>CFBundleShortVersionString</key>
-       <string>2.30.1</string>
+       <string>2.30.2</string>
        <key>CFBundleSignature</key>
        <string>SDLX</string>
        <key>CFBundleSupportedPlatforms</key>
@@ -27,7 +27,7 @@
                <string>MacOSX</string>
        </array>
        <key>CFBundleVersion</key>
-       <string>2.30.1</string>
+       <string>2.30.2</string>
        <key>DTCompiler</key>
        <string>com.apple.compilers.llvm.clang.1_0</string>
        <key>DTPlatformBuild</key>
@@ -35,15 +35,15 @@
        <key>DTPlatformName</key>
        <string>macosx</string>
        <key>DTPlatformVersion</key>
-       <string>14.2</string>
+       <string>14.4</string>
        <key>DTSDKBuild</key>
-       <string>23C53</string>
+       <string>23E208</string>
        <key>DTSDKName</key>
-       <string>macosx14.2</string>
+       <string>macosx14.4</string>
        <key>DTXcode</key>
-       <string>1520</string>
+       <string>1530</string>
        <key>DTXcodeBuild</key>
-       <string>15C500b</string>
+       <string>15E204a</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.11</string>
 </dict>
Binary files 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/default.metallib
 and 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/Resources/default.metallib
 differ
Binary files 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/SDL2
 and 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/SDL2
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
--- 
old/ft2-clone-1.79/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
     2024-03-18 15:44:31.000000000 +0100
+++ 
new/ft2-clone-1.81/release/macos/ft2-clone-macos.app/Contents/Frameworks/SDL2.framework/Versions/A/_CodeSignature/CodeResources
     2024-04-09 19:31:47.000000000 +0200
@@ -14,7 +14,7 @@
                </data>
                <key>Resources/Info.plist</key>
                <data>
-               ZHmmRK90boQu0lf8kuoupR5C534=
+               xxjLXf8umGDvorJwQToOZvJb+LI=
                </data>
                <key>Resources/License.txt</key>
                <data>
@@ -26,7 +26,7 @@
                </data>
                <key>Resources/default.metallib</key>
                <data>
-               QwX80pzFcZED9JtaD8IhQ/uayn0=
+               YrRnNqKCIDuni+6CKxtbY1kbYlw=
                </data>
        </dict>
        <key>files2</key>
@@ -508,11 +508,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       wJW6P5cSLWw7CLKwCduRMFILJMs=
+                       NywZ7lb1AObplGXdgvKYUQnFr3E=
                        </data>
                        <key>hash2</key>
                        <data>
-                       rfvhg9xhDPbHHDguY5qvRo/mzZyCbJMSA9625XkbQy0=
+                       /XPmip0lyp07Lnry52Ki2A7dornwXXFxn1W94/cdCO0=
                        </data>
                </dict>
                <key>Headers/SDL_power.h</key>
@@ -563,11 +563,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       BP7HEBYnBwbk8tHzZPgc3YbrqxQ=
+                       QR/EqmyEkjhJXrWe2LStfwBGG/4=
                        </data>
                        <key>hash2</key>
                        <data>
-                       OaVGrGQNu1FqBbGBlpCqSy2PHisu9o9LzvAg42f1/JI=
+                       uR4gNQwz5IYMMHZflMaZxOTwGwrYDLcyYQlbbPMpm3w=
                        </data>
                </dict>
                <key>Headers/SDL_rwops.h</key>
@@ -706,11 +706,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       OGZ8BfEEkHiQnTtIvNq9aYEj7FY=
+                       WO6pCYeF3qTP69F4sWD442sgezQ=
                        </data>
                        <key>hash2</key>
                        <data>
-                       juogOjtV5ZeXFCoHo69XFA1QWPNDN4r0MdblxepalE8=
+                       pXT1eYRliBTvr45AyMoEr960xzfZ19y99t80KzPQv3U=
                        </data>
                </dict>
                <key>Headers/SDL_video.h</key>
@@ -783,11 +783,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       ZHmmRK90boQu0lf8kuoupR5C534=
+                       xxjLXf8umGDvorJwQToOZvJb+LI=
                        </data>
                        <key>hash2</key>
                        <data>
-                       B6t0lho1afDvcrYh3u2JI7SM9qV8RRd+48xEAIyinO8=
+                       Ikl+0G36oc/K1BK2OQNF3aybj3O5vaHu74adDuyR5P8=
                        </data>
                </dict>
                <key>Resources/License.txt</key>
@@ -816,11 +816,11 @@
                <dict>
                        <key>hash</key>
                        <data>
-                       QwX80pzFcZED9JtaD8IhQ/uayn0=
+                       YrRnNqKCIDuni+6CKxtbY1kbYlw=
                        </data>
                        <key>hash2</key>
                        <data>
-                       81kjRE2J1UCGqrIQCmKYXixkYjbOC68/+l4AoNBo6C8=
+                       goC4ji0E3XChWw9+V/QA4PFdbLXiQkmV6QWCcaD6Wzo=
                        </data>
                </dict>
        </dict>
Binary files old/ft2-clone-1.79/release/win32/SDL2.dll and 
new/ft2-clone-1.81/release/win32/SDL2.dll differ
Binary files old/ft2-clone-1.79/release/win64/SDL2.dll and 
new/ft2-clone-1.81/release/win64/SDL2.dll differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_checkboxes.c 
new/ft2-clone-1.81/src/ft2_checkboxes.c
--- old/ft2-clone-1.79/src/ft2_checkboxes.c     2024-03-18 15:44:31.000000000 
+0100
+++ new/ft2-clone-1.81/src/ft2_checkboxes.c     2024-04-09 19:31:47.000000000 
+0200
@@ -26,8 +26,8 @@
        ** -- STRUCT INFO: --
        **  x        = x position
        **  y        = y position
-       **  w        = clickable width space, relative to x
-       **  h        = clickable height space, relative to y
+       **  w        = clickable width in pixels, relative to x
+       **  h        = clickable height in pixels, relative to y
        **  funcOnUp = function to call when released
        */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_config.c 
new/ft2-clone-1.81/src/ft2_config.c
--- old/ft2-clone-1.79/src/ft2_config.c 2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_config.c 2024-04-09 19:31:47.000000000 +0200
@@ -290,7 +290,7 @@
        audio.currInputDevice = getAudioInputDeviceFromConfig();
 
 #ifdef HAS_MIDI
-       if (midi.initThreadDone)
+       if (midi.supported && midi.initThreadDone)
        {
                setMidiInputDeviceFromConfig();
                if (ui.configScreenShown && editor.currConfigScreen == 
CONFIG_SCREEN_MIDI_INPUT)
@@ -390,7 +390,8 @@
 
        saveAudioDevicesToConfig(audio.currOutputDevice, audio.currInputDevice);
 #ifdef HAS_MIDI
-       saveMidiInputDeviceToConfig();
+       if (midi.supported)
+               saveMidiInputDeviceToConfig();
 #endif
 
        FILE *f = UNICHAR_FOPEN(editor.configFileLocationU, "wb");
@@ -673,7 +674,9 @@
        strcat(editor.configFileLocationU, "/FT2.CFG");
 #endif
 
-       editor.midiConfigFileLocationU = getFullMidiDevConfigPathU();
+       if (midi.supported)
+               editor.midiConfigFileLocationU = getFullMidiDevConfigPathU();
+
        editor.audioDevConfigFileLocationU = getFullAudDevConfigPathU();
 }
 
@@ -781,6 +784,8 @@
 {
        uint16_t tmpID;
 
+
+
        uncheckRadioButtonGroup(RB_GROUP_CONFIG_SELECT);
        switch (editor.currConfigScreen)
        {
@@ -795,6 +800,14 @@
        radioButtons[tmpID].state = RADIOBUTTON_CHECKED;
 
        showRadioButtonGroup(RB_GROUP_CONFIG_SELECT);
+
+       // hide MIDI radio button if MIDI is not supported (hackish)
+       if (!midi.supported)
+       {
+               radioButton_t *t = &radioButtons[RB_CONFIG_MIDI_INPUT];
+               hideRadioButton(RB_CONFIG_MIDI_INPUT);
+               fillRect(t->x, t->y, RADIOBUTTON_W, RADIOBUTTON_H, PAL_DESKTOP);
+       }
 }
 
 void setConfigAudioRadioButtonStates(void) // accessed by other .c files
@@ -1018,7 +1031,10 @@
        checkBoxes[CB_CONF_CHANGE_PATTLEN_INS_DEL].checked = 
config.recTrueInsert;
        checkBoxes[CB_CONF_MIDI_ALLOW_PC].checked = config.recMIDIAllowPC;
 #ifdef HAS_MIDI
-       checkBoxes[CB_CONF_MIDI_ENABLE].checked = midi.enable;
+       if (midi.supported)
+               checkBoxes[CB_CONF_MIDI_ENABLE].checked = midi.enable;
+       else
+               checkBoxes[CB_CONF_MIDI_ENABLE].checked = false;
 #else
        checkBoxes[CB_CONF_MIDI_ENABLE].checked = false;
 #endif
@@ -1109,7 +1125,8 @@
        textOutShadow(21, 35, PAL_FORGRND, PAL_DSKTOP2, "Layout");
        textOutShadow(21, 51, PAL_FORGRND, PAL_DSKTOP2, "Miscellaneous");
 #ifdef HAS_MIDI
-       textOutShadow(21, 67, PAL_FORGRND, PAL_DSKTOP2, "MIDI input");
+       if (midi.supported)
+               textOutShadow(21, 67, PAL_FORGRND, PAL_DSKTOP2, "MIDI input");
 #endif
        textOutShadow(20, 93, PAL_FORGRND, PAL_DSKTOP2, "Auto save");
 
@@ -1377,6 +1394,7 @@
                }
                break;
 
+#ifdef HAS_MIDI
                case CONFIG_SCREEN_MIDI_INPUT:
                {
                        drawFramework(110, 0, 394, 173, FRAMEWORK_TYPE1);
@@ -1387,15 +1405,14 @@
 
                        blitFast(517, 51, bmp.midiLogo, 103, 55);
 
-#ifdef HAS_MIDI
                        showPushButton(PB_CONFIG_MIDI_INPUT_DOWN);
                        showPushButton(PB_CONFIG_MIDI_INPUT_UP);
                        rescanMidiInputDevices();
                        drawMidiInputList();
                        showScrollBar(SB_MIDI_INPUT_SCROLL);
-#endif
                }
                break;
+#endif
        }
 }
 
@@ -2072,7 +2089,17 @@
 void cbMIDIEnable(void)
 {
 #ifdef HAS_MIDI
-       midi.enable ^= 1;
+       if (midi.supported)
+       {
+               midi.enable ^= 1;
+       }
+       else
+       {
+               checkBoxes[CB_CONF_MIDI_ENABLE].checked = false;
+               drawCheckBox(CB_CONF_MIDI_ENABLE);
+
+               okBox(0, "System message", "MIDI support is disabled for 
Windows XP as it is buggy!", NULL);
+       }
 #else
        checkBoxes[CB_CONF_MIDI_ENABLE].checked = false;
        drawCheckBox(CB_CONF_MIDI_ENABLE);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_config.h 
new/ft2-clone-1.81/src/ft2_config.h
--- old/ft2-clone-1.79/src/ft2_config.h 2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_config.h 2024-04-09 19:31:47.000000000 +0200
@@ -13,7 +13,9 @@
        CONFIG_SCREEN_AUDIO,
        CONFIG_SCREEN_LAYOUT,
        CONFIG_SCREEN_MISCELLANEOUS,
+#ifdef HAS_MIDI
        CONFIG_SCREEN_MIDI_INPUT,
+#endif
 
        CONFIG_HIDE_ERRORS = 0,
        CONFIG_SHOW_ERRORS = 1,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_edit.c 
new/ft2-clone-1.81/src/ft2_edit.c
--- old/ft2-clone-1.79/src/ft2_edit.c   2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_edit.c   2024-04-09 19:31:47.000000000 +0200
@@ -909,7 +909,7 @@
                        {
                                note_t *p = pattern[i];
                                if (p == NULL)
-                                       return 0; // empty pattern
+                                       continue; // empty pattern, skip it
 
                                for (int32_t row = 0; row < patternNumRows[i]; 
row++, p += pitch)
                                {
@@ -1052,7 +1052,7 @@
                        {
                                note_t *p = pattern[i];
                                if (p == NULL)
-                                       continue; // empty pattern
+                                       continue; // empty pattern, skip it
 
                                for (int32_t row = 0; row < patternNumRows[i]; 
row++, p += pitch)
                                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_events.c 
new/ft2-clone-1.81/src/ft2_events.c
--- old/ft2-clone-1.79/src/ft2_events.c 2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_events.c 2024-04-09 19:31:47.000000000 +0200
@@ -33,7 +33,7 @@
 #include "ft2_sample_ed_features.h"
 #include "ft2_structs.h"
 
-#define CRASH_TEXT "Oh no! The Fasttracker II clone has crashed...\nA backup 
.xm was hopefully " \
+#define CRASH_TEXT "Oh no! The Fasttracker II clone has crashed...\nA backup 
of the song was hopefully " \
                    "saved to the current module directory.\n\nPlease report 
this bug if you can.\n" \
                    "Try to mention what you did before the crash happened.\n" \
                    "My email is on the bottom of https://16-bits.org";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_gui.c 
new/ft2-clone-1.81/src/ft2_gui.c
--- old/ft2-clone-1.79/src/ft2_gui.c    2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_gui.c    2024-04-09 19:31:47.000000000 +0200
@@ -139,15 +139,15 @@
 
        // set uninitialized GUI struct entries
 
-       textBox_t *t = &textBoxes[1]; // skip first entry, it's reserved for 
inputBox())
+       textBox_t *t = &textBoxes[1]; // skip first entry, it's reserved for 
inputBox()
        for (int32_t i = 1; i < NUM_TEXTBOXES; i++, t++)
        {
                t->visible = false;
                t->bufOffset = 0;
                t->cursorPos = 0;
                t->textPtr = NULL;
-               t->renderBufW = (9 + 1) * t->maxChars; // 9 = max 
character/glyph width possible
-               t->renderBufH = 10; // 10 = max character height possible
+               t->renderBufW = (9 + 1) * t->maxChars; // 9 = max text glyph 
width (+1 for kerning)
+               t->renderBufH = 10; // 10 = max text glyph height
                t->renderW = t->w - (t->tx * 2);
 
                t->renderBuf = (uint8_t *)malloc(t->renderBufW * t->renderBufH 
* sizeof (int8_t));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_header.h 
new/ft2-clone-1.81/src/ft2_header.h
--- old/ft2-clone-1.79/src/ft2_header.h 2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_header.h 2024-04-09 19:31:47.000000000 +0200
@@ -12,26 +12,24 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "1.79"
+#define PROG_VER_STR "1.81"
 
 // do NOT change these! It will only mess things up...
 
 #define FT2_VBLANK_HZ 70.086302895323 /* nominal, 640x400 @ 70Hz */
 #define SCREEN_W 632
 #define SCREEN_H 400
-
-/* "60Hz" ranges everywhere from 59..61Hz depending on the monitor, so with
-** no vsync we will get stuttering because the rate is not perfect...
-*/
 #define VBLANK_HZ 60
 
 // 70Hz (FT2 vblank) delta -> 60Hz vblank delta (rounded)
 #define SCALE_VBLANK_DELTA(x) (int32_t)(((x) * ((double)VBLANK_HZ / 
FT2_VBLANK_HZ)) + 0.5)
 
-// scopes must be clocked slightly higher than the nominal vblank rate
+/* Scopes must be clocked slightly higher than the nominal vblank rate
+** to prevent update/draw racing issues. Setting it too high will
+** cause more issues!
+*/
 #define SCOPE_HZ 64
 
-
 /* Amount of extra bytes to allocate for every instrument sample,
 ** this is used for a hack for resampling interpolation to be
 ** branchless in the inner channel mixer loop.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_help.c 
new/ft2-clone-1.81/src/ft2_help.c
--- old/ft2-clone-1.79/src/ft2_help.c   2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_help.c   2024-04-09 19:31:47.000000000 +0200
@@ -393,7 +393,7 @@
                default:
                case 0: tmpID = RB_HELP_FEATURES;       break;
                case 1: tmpID = RB_HELP_EFFECTS;        break;
-               case 2: tmpID = RB_HELP_KEYBINDINGS;       break;
+               case 2: tmpID = RB_HELP_KEYBINDINGS;    break;
                case 3: tmpID = RB_HELP_HOW_TO_USE_FT2; break;
                case 4: tmpID = RB_HELP_FAQ;            break;
                case 5: tmpID = RB_HELP_KNOWN_BUGS;     break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_keyboard.c 
new/ft2-clone-1.81/src/ft2_keyboard.c
--- old/ft2-clone-1.79/src/ft2_keyboard.c       2024-03-18 15:44:31.000000000 
+0100
+++ new/ft2-clone-1.81/src/ft2_keyboard.c       2024-04-09 19:31:47.000000000 
+0200
@@ -24,6 +24,7 @@
 #include "ft2_audio.h"
 #include "ft2_trim.h"
 #include "ft2_sample_ed_features.h"
+#include "ft2_midi.h"
 #include "ft2_structs.h"
 
 keyb_t keyb; // globalized
@@ -1280,16 +1281,18 @@
 
                                return true;
                        }
-#ifdef HAS_MIDI
                        else if (keyb.leftCtrlPressed)
                        {
-                               editor.currConfigScreen = 3;
-                               showConfigScreen();
-                               checkRadioButton(RB_CONFIG_MIDI_INPUT);
-
+#ifdef HAS_MIDI
+                               if (midi.supported)
+                               {
+                                       editor.currConfigScreen = 3;
+                                       showConfigScreen();
+                                       checkRadioButton(RB_CONFIG_MIDI_INPUT);
+                               }
+#endif
                                return true;
                        }
-#endif
                }
                break;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_main.c 
new/ft2-clone-1.81/src/ft2_main.c
--- old/ft2-clone-1.79/src/ft2_main.c   2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_main.c   2024-04-09 19:31:47.000000000 +0200
@@ -9,6 +9,7 @@
 #ifdef _WIN32
 #define WIN32_MEAN_AND_LEAN
 #include <windows.h>
+#include <versionhelpers.h>
 #include <SDL2/SDL_syswm.h>
 #else
 #include <unistd.h> // chdir()
@@ -35,10 +36,6 @@
 #include "ft2_structs.h"
 #include "ft2_hpc.h"
 
-#ifdef HAS_MIDI
-static SDL_Thread *initMidiThread;
-#endif
-
 static void initializeVars(void);
 static void cleanUpAndExit(void); // never call this inside the main loop
 #ifdef __APPLE__
@@ -99,6 +96,10 @@
 #endif
 
 #ifdef _WIN32
+       // disable MIDI support if using Windows XP, as it is unstable
+       if (!IsWindowsVistaOrGreater())
+               midi.supported = false;
+
 #ifndef _MSC_VER
        SetProcessDPIAware();
 #endif
@@ -231,14 +232,16 @@
 
 #ifdef HAS_MIDI
        // set up MIDI input (in a thread because it can take quite a while on 
f.ex. macOS)
-       initMidiThread = SDL_CreateThread(initMidiFunc, NULL, NULL);
-       if (initMidiThread == NULL)
+       if (midi.supported)
        {
-               showErrorMsgBox("Couldn't create MIDI initialization thread!");
-               cleanUpAndExit();
-               return 1;
+               midi.initMidiThread = SDL_CreateThread(initMidiFunc, NULL, 
NULL);
+               if (midi.initMidiThread == NULL)
+               {
+                       showErrorMsgBox("Couldn't create MIDI initialization 
thread!");
+                       cleanUpAndExit();
+                       return 1;
+               }
        }
-       SDL_DetachThread(initMidiThread); // don't wait for this thread, let it 
clean up when done
 #endif
 
        hpc_ResetCounters(&video.vblankHpc); // quirk: this is needed for 
potential okBox() calls in handleModuleLoadFromArg()
@@ -271,6 +274,10 @@
        cpu.hasSSE2 = SDL_HasSSE2();
 
        // clear common structs
+#ifdef HAS_MIDI
+       memset(&midi, 0, sizeof (midi));
+       midi.supported = true;
+#endif
        memset(&video, 0, sizeof (video));
        memset(&keyb, 0, sizeof (keyb));
        memset(&mouse, 0, sizeof (mouse));
@@ -289,7 +296,7 @@
 
        // now set data that must be initialized to non-zero values...
 
-       audio.locked = true;
+       audio.locked = true; // XXX: Why..?
        audio.rescanAudioDevicesSupported = true;
 
        // set non-zero values
@@ -305,7 +312,7 @@
        editor.srcInstr = 1;
        editor.curInstr = 1;
        editor.curOctave = 4;
-       editor.smpEd_NoteNr = 48 + 1; // middle-C
+       editor.smpEd_NoteNr = 1+NOTE_C4;
 
        editor.ptnJumpPos[0] = 0x00;
        editor.ptnJumpPos[1] = 0x10;
@@ -316,25 +323,41 @@
        memset(editor.copyMask, 1, sizeof (editor.copyMask));
        memset(editor.pasteMask, 1, sizeof (editor.pasteMask));
 
-#ifdef HAS_MIDI
-       midi.enable = true;
-#endif
-
        editor.diskOpReadOnOpen = true;
 
        audio.linearPeriodsFlag = true;
        calcReplayerLogTab();
 
+#ifdef HAS_MIDI
+       midi.enable = true;
+#endif
+
        editor.programRunning = true;
 }
 
 static void cleanUpAndExit(void) // never call this inside the main loop!
 {
 #ifdef HAS_MIDI
-       if (midi.closeMidiOnExit)
+       if (midi.supported)
        {
+               if (midi.initMidiThread != NULL)
+               {
+                       SDL_WaitThread(midi.initMidiThread, NULL);
+                       midi.initMidiThread = NULL;
+               }
+
+               midi.enable = false; // stop MIDI callback from doing things
+               while (midi.callbackBusy) SDL_Delay(1); // wait for MIDI 
callback to finish
+
                closeMidiInDevice();
                freeMidiIn();
+               freeMidiInputDeviceList();
+
+               if (midi.inputDeviceName != NULL)
+               {
+                       free(midi.inputDeviceName);
+                       midi.inputDeviceName = NULL;
+               }
        }
 #endif
 
@@ -345,22 +368,11 @@
        freeDiskOp();
        clearCopyBuffer();
        freeAudioDeviceSelectorBuffers();
-#ifdef HAS_MIDI
-       freeMidiInputDeviceList();
-#endif
        windUpFTHelp();
        freeTextBoxes();
        freeMouseCursors();
        freeBMPs();
 
-#ifdef HAS_MIDI
-       if (midi.inputDeviceName != NULL)
-       {
-               free(midi.inputDeviceName);
-               midi.inputDeviceName = NULL;
-       }
-#endif
-
        if (editor.audioDevConfigFileLocationU != NULL)
        {
                free(editor.audioDevConfigFileLocationU);
@@ -396,7 +408,7 @@
 static void osxSetDirToProgramDirFromArgs(char **argv)
 {
        /* OS X/macOS: hackish way of setting the current working directory to 
the place where we double clicked
-       ** on the icon (for protracker.ini loading)
+       ** on the icon (for FT2.CFG loading)
        */
 
        // if we launched from the terminal, argv[0][0] would be '.'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_midi.c 
new/ft2-clone-1.81/src/ft2_midi.c
--- old/ft2-clone-1.79/src/ft2_midi.c   2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_midi.c   2024-04-09 19:31:47.000000000 +0200
@@ -1,3 +1,5 @@
+// this implements MIDI input only!
+
 #ifdef HAS_MIDI
 
 // for finding memory leaks in debug mode with Visual Studio
@@ -18,20 +20,16 @@
 #include "ft2_structs.h"
 #include "rtmidi/rtmidi_c.h"
 
-#define MAX_DEV_STR_LEN 256
-
 // hide POSIX warnings
 #ifdef _MSC_VER
 #pragma warning(disable: 4996)
 #endif
 
-// This implements MIDI input only!
-
 midi_t midi; // globalized
 
 static volatile bool midiDeviceOpened;
 static bool recMIDIValidChn = true;
-static RtMidiPtr midiDev;
+static RtMidiPtr midiInDev;
 
 static inline void midiInSetChannel(uint8_t status)
 {
@@ -97,13 +95,15 @@
        }
 }
 
-static void midiInCallback(double dTimeStamp, const unsigned char *message, 
size_t messageSize, void *userData)
+static void midiInCallback(double timeStamp, const unsigned char *message, 
size_t messageSize, void *userData)
 {
        uint8_t byte[3];
 
        if (!midi.enable || messageSize < 2)
                return;
 
+       midi.callbackBusy = true;
+
        byte[0] = message[0];
        if (byte[0] > 127 && byte[0] < 240)
        {
@@ -122,25 +122,27 @@
                else if (byte[0] >= 224 && byte[0] <= 224+15) 
midiInPitchBendChange(byte[1], byte[2]);
        }
 
-       (void)dTimeStamp;
+       midi.callbackBusy = false;
+
+       (void)timeStamp;
        (void)userData;
 }
 
 static uint32_t getNumMidiInDevices(void)
 {
-       if (midiDev == NULL)
+       if (midiInDev == NULL)
                return 0;
 
-       return rtmidi_get_port_count(midiDev);
+       return rtmidi_get_port_count(midiInDev);
 }
 
 static char *getMidiInDeviceName(uint32_t deviceID)
 {
-       if (midiDev == NULL)
-               return NULL;
+       if (midiInDev == NULL)
+               return NULL; // MIDI not initialized
 
-       char *devStr = (char *)rtmidi_get_port_name(midiDev, deviceID);
-       if (!midiDev->ok)
+       char *devStr = (char *)rtmidi_get_port_name(midiInDev, deviceID);
+       if (devStr == NULL || !midiInDev->ok)
                return NULL;
 
        return devStr;
@@ -148,14 +150,12 @@
 
 void closeMidiInDevice(void)
 {
-       while (!midi.initThreadDone);
-
        if (midiDeviceOpened)
        {
-               if (midiDev != NULL)
+               if (midiInDev != NULL)
                {
-                       rtmidi_in_cancel_callback(midiDev);
-                       rtmidi_close_port(midiDev);
+                       rtmidi_in_cancel_callback(midiInDev);
+                       rtmidi_close_port(midiInDev);
                }
 
                midiDeviceOpened = false;
@@ -164,51 +164,48 @@
 
 void freeMidiIn(void)
 {
-       while (!midi.initThreadDone);
-
-       if (midiDev != NULL)
+       if (midiInDev != NULL)
        {
-               rtmidi_in_free(midiDev);
-               midiDev = NULL;
+               rtmidi_in_free(midiInDev);
+               midiInDev = NULL;
        }
 }
 
 bool initMidiIn(void)
 {
-       if (midiDev != NULL)
-               return false; // already initialized
+       midiInDev = rtmidi_in_create_default();
+       if (midiInDev == NULL)
+               return false;
 
-       midiDev = rtmidi_in_create_default();
-       if (!midiDev->ok)
+       if (!midiInDev->ok)
        {
-               midiDev = NULL;
+               rtmidi_in_free(midiInDev);
                return false;
        }
 
-       midiDeviceOpened = false;
        return true;
 }
 
 bool openMidiInDevice(uint32_t deviceID)
 {
-       if (midiDev == NULL)
+       if (midiDeviceOpened)
                return false;
 
-       if (getNumMidiInDevices() == 0)
+       if (midiInDev == NULL || getNumMidiInDevices() == 0)
                return false;
 
-       rtmidi_open_port(midiDev, deviceID, "FT2 Clone MIDI Port");
-       if (!midiDev->ok)
+       rtmidi_open_port(midiInDev, deviceID, "FT2 Clone MIDI Port");
+       if (!midiInDev->ok)
                return false;
 
-       rtmidi_in_set_callback(midiDev, midiInCallback, NULL);
-       if (!midiDev->ok)
+       rtmidi_in_set_callback(midiInDev, midiInCallback, NULL);
+       if (!midiInDev->ok)
        {
-               rtmidi_close_port(midiDev);
+               rtmidi_close_port(midiInDev);
                return false;
        }
 
-       rtmidi_in_ignore_types(midiDev, true, true, true);
+       rtmidi_in_ignore_types(midiInDev, true, true, true);
 
        midiDeviceOpened = true;
        return true;
@@ -255,7 +252,7 @@
 
 bool saveMidiInputDeviceToConfig(void)
 {
-       if (!midi.initThreadDone || midiDev == NULL || !midiDeviceOpened)
+       if (!midi.initThreadDone || midiInDev == NULL || !midiDeviceOpened)
                return false;
 
        const uint32_t numDevices = getNumMidiInDevices();
@@ -284,8 +281,10 @@
 {
        uint32_t i;
 
-       if (midi.inputDeviceName != NULL)
-               free(midi.inputDeviceName);
+       // XXX: Something in here is corrupting!
+
+       if (editor.midiConfigFileLocationU == NULL)
+               goto setDefMidiInputDev;
 
        const uint32_t numDevices = getNumMidiInDevices();
        if (numDevices == 0)
@@ -295,16 +294,15 @@
        if (f == NULL)
                goto setDefMidiInputDev;
 
-       char *devString = (char *)malloc((MAX_DEV_STR_LEN+4) * sizeof (char));
+       char *devString = (char *)malloc(1024+2);
        if (devString == NULL)
        {
                fclose(f);
                goto setDefMidiInputDev;
        }
-
        devString[0] = '\0';
 
-       if (fgets(devString, MAX_DEV_STR_LEN, f) == NULL)
+       if (fgets(devString, 1024, f) == NULL)
        {
                fclose(f);
                free(devString);
@@ -334,6 +332,12 @@
        if (i == numDevices)
                goto setDefMidiInputDev;
 
+       if (midi.inputDeviceName != NULL)
+       {
+               free(midi.inputDeviceName);
+               midi.inputDeviceName = NULL;
+       }
+
        midi.inputDevice = i;
        midi.inputDeviceName = midiInStr;
        midi.numInputDevices = numDevices;
@@ -342,9 +346,15 @@
 
        // couldn't load device, set default
 setDefMidiInputDev:
+       if (midi.inputDeviceName != NULL)
+       {
+               free(midi.inputDeviceName);
+               midi.inputDeviceName = NULL;
+       }
+
        midi.inputDevice = 0;
        midi.inputDeviceName = strdup("RtMidi");
-       midi.numInputDevices = numDevices;
+       midi.numInputDevices = 1;
 
        return false;
 }
@@ -371,7 +381,7 @@
        if (midi.numInputDevices > MAX_MIDI_DEVICES)
                midi.numInputDevices = MAX_MIDI_DEVICES;
 
-       for (int32_t i = 0; i < midi.numInputDevices; i++)
+       for (uint32_t i = 0; i < midi.numInputDevices; i++)
        {
                char *deviceName = getMidiInDeviceName(i);
                if (deviceName == NULL)
@@ -393,7 +403,7 @@
 {
        clearRect(114, 4, 365, 165);
 
-       if (!midi.initThreadDone || midiDev == NULL || midi.numInputDevices == 
0)
+       if (!midi.initThreadDone || midiInDev == NULL || midi.numInputDevices 
== 0)
        {
                textOut(114, 4 + (0 * 11), PAL_FORGRND, "No MIDI input devices 
found!");
                textOut(114, 4 + (1 * 11), PAL_FORGRND, "Either wait a few 
seconds for MIDI to initialize, or restart the");
@@ -403,7 +413,10 @@
 
        for (uint16_t i = 0; i < 15; i++)
        {
-               const int32_t deviceEntry = 
getScrollBarPos(SB_MIDI_INPUT_SCROLL) + i;
+               uint32_t deviceEntry = getScrollBarPos(SB_MIDI_INPUT_SCROLL) + 
i;
+               if (deviceEntry > MAX_MIDI_DEVICES)
+                       deviceEntry = MAX_MIDI_DEVICES;
+
                if (deviceEntry < midi.numInputDevices)
                {
                        if (midi.inputDeviceNames[deviceEntry] == NULL)
@@ -448,19 +461,19 @@
 bool testMidiInputDeviceListMouseDown(void)
 {
        if (!ui.configScreenShown || editor.currConfigScreen != 
CONFIG_SCREEN_MIDI_INPUT)
-               return false; // we didn't click the area
+               return false;
+
+       if (mouse.x < 114 || mouse.x > 479 || mouse.y < 4 || mouse.y > 166)
+               return false; // we didn't click inside the list area
 
        if (!midi.initThreadDone)
                return true;
 
-       const int32_t mx = mouse.x;
-       const int32_t my = mouse.y;
+       uint32_t deviceNum = (uint32_t)scrollBars[SB_MIDI_INPUT_SCROLL].pos + 
((mouse.y - 4) / 11);
+       if (deviceNum > MAX_MIDI_DEVICES)
+               deviceNum = MAX_MIDI_DEVICES;
 
-       if (my < 4 || my > 166 || mx < 114 || mx > 479)
-               return false; // we didn't click the area
-
-       const int32_t deviceNum = (int32_t)scrollBars[SB_MIDI_INPUT_SCROLL].pos 
+ ((my - 4) / 11);
-       if (midi.numInputDevices <= 0 || deviceNum >= midi.numInputDevices)
+       if (midi.numInputDevices == 0 || deviceNum >= midi.numInputDevices)
                return true;
 
        if (midi.inputDeviceName != NULL)
@@ -469,6 +482,7 @@
                        return true; // we clicked the currently selected 
device, do nothing
 
                free(midi.inputDeviceName);
+               midi.inputDeviceName = NULL;
        }
 
        midi.inputDeviceName = strdup(midi.inputDeviceNames[deviceNum]);
@@ -485,21 +499,17 @@
 
 int32_t SDLCALL initMidiFunc(void *ptr)
 {
-       midi.closeMidiOnExit = true;
-
        midi.initThreadDone = false;
        initMidiIn();
        setMidiInputDeviceFromConfig();
        openMidiInDevice(midi.inputDevice);
-       midi.initThreadDone = true;
-
        midi.rescanDevicesFlag = true;
-
+       midi.initThreadDone = true;
        return true;
 
        (void)ptr;
 }
 
 #else
-typedef int make_iso_compilers_happy; // kludge: prevent warning about empty 
.c file if HAS_MIDI is not defined
+typedef int prevent_compiler_warning; // kludge: prevent warning about empty 
.c file if HAS_MIDI is not defined
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_midi.h 
new/ft2-clone-1.81/src/ft2_midi.h
--- old/ft2-clone-1.79/src/ft2_midi.h   2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_midi.h   2024-04-09 19:31:47.000000000 +0200
@@ -12,11 +12,11 @@
 typedef struct midi_t
 {
        char *inputDeviceName, *inputDeviceNames[MAX_MIDI_DEVICES];
-       volatile bool closeMidiOnExit, initThreadDone;
-       uint32_t inputDevice;
-       bool enable, rescanDevicesFlag;
+       volatile bool supported, initThreadDone, callbackBusy, enable;
+       bool rescanDevicesFlag;
+       uint32_t inputDevice, numInputDevices;
        int16_t currMIDIVibDepth, currMIDIPitch;
-       int32_t numInputDevices;
+       SDL_Thread *initMidiThread;
 } midi_t;
 
 extern midi_t midi; // ft2_midi.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_mouse.c 
new/ft2-clone-1.81/src/ft2_mouse.c
--- old/ft2-clone-1.79/src/ft2_mouse.c  2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_mouse.c  2024-04-09 19:31:47.000000000 +0200
@@ -915,6 +915,10 @@
                my -= video.renderY;
        }
 
+       // kludge: this can happen and prevent buttons from pressing on the 
very first row of pixels
+       if (mx == -1) mx = 0;
+       if (my == -1) my = 0;
+
        // multiply coords by video upscaling factors
        mouse.x = (int32_t)floor(mx * video.dMouseXMul);
        mouse.y = (int32_t)floor(my * video.dMouseYMul);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_radiobuttons.c 
new/ft2-clone-1.81/src/ft2_radiobuttons.c
--- old/ft2-clone-1.79/src/ft2_radiobuttons.c   2024-03-18 15:44:31.000000000 
+0100
+++ new/ft2-clone-1.81/src/ft2_radiobuttons.c   2024-04-09 19:31:47.000000000 
+0200
@@ -24,7 +24,7 @@
        ** -- STRUCT INFO: --
        **  x        = x position
        **  y        = y position
-       **  w        = clickable width space, relative to x
+       **  w        = clickable width in pixels, relative to x
        **  group    = what group the radiobutton belongs to
        **  funcOnUp = function to call when released
        */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_video.c 
new/ft2-clone-1.81/src/ft2_video.c
--- old/ft2-clone-1.79/src/ft2_video.c  2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_video.c  2024-04-09 19:31:47.000000000 +0200
@@ -123,10 +123,10 @@
                     "HPC frequency (timer): %.4fMHz\n" \
                     "Audio frequency: %.1fkHz (expected %.1fkHz)\n" \
                     "Audio buffer samples: %d (expected %d)\n" \
-                    "Audio latency: %.1fms (expected %.1fms)\n" \
                     "Render size: %dx%d (offset %d,%d)\n" \
                     "Disp. size: %dx%d (window: %dx%d)\n" \
                     "Render scaling: x=%.4f, y=%.4f\n" \
+                    "DPI zoom factors: x=%.4f, y=%.4f\n" \
                     "Mouse pixel-space muls: x=%.4f, y=%.4f\n" \
                     "Relative mouse coords: %d,%d\n" \
                     "Absolute mouse coords: %d,%d\n" \
@@ -138,10 +138,10 @@
                     hpcFreq.freq64 / (1000.0 * 1000.0),
                     audio.haveFreq / 1000.0, audio.wantFreq / 1000.0,
                     audio.haveSamples, audio.wantSamples,
-                    dAudLatency, ((audio.wantSamples * 1000.0) / 
audio.wantFreq),
                     video.renderW, video.renderH, video.renderX, video.renderY,
                     video.displayW, video.displayH, video.windowW, 
video.windowH,
                     (double)video.renderW / SCREEN_W, (double)video.renderH / 
SCREEN_H,
+                    video.dDpiZoomFactorX, video.dDpiZoomFactorY,
                     video.dMouseXMul, video.dMouseYMul,
                     mouse.x, mouse.y,
                     mouse.absX, mouse.absY);
@@ -255,20 +255,25 @@
 
 void showErrorMsgBox(const char *fmt, ...)
 {
-       char strBuf[256];
+       char strBuf[512+1];
        va_list args;
 
        // format the text string
        va_start(args, fmt);
-       vsnprintf(strBuf, sizeof (strBuf), fmt, args);
+       vsnprintf(strBuf, sizeof (strBuf)-1, fmt, args);
        va_end(args);
 
-       // window can be NULL here, no problem...
-       SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", strBuf, 
video.window);
+       // SDL message boxes can be very buggy on Windows XP, use MessageBoxA() 
instead
+#ifdef _WIN32
+       MessageBoxA(NULL, strBuf, "Error", MB_OK | MB_ICONERROR);
+#else
+       SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", strBuf, NULL);
+#endif
 }
 
 static void updateRenderSizeVars(void)
 {
+       int32_t widthInPixels, heightInPixels;
        SDL_DisplayMode dm;
 
        int32_t di = SDL_GetWindowDisplayIndex(video.window);
@@ -293,6 +298,11 @@
 
                        video.renderW = video.windowW;
                        video.renderH = video.windowH;
+
+                       // get DPI zoom factors (Macs with Retina, etc... 
returns 1.0 if no zoom)
+                       SDL_GL_GetDrawableSize(video.window, &widthInPixels, 
&heightInPixels);
+                       video.dDpiZoomFactorX = (double)widthInPixels / 
video.windowW;
+                       video.dDpiZoomFactorY = (double)heightInPixels / 
video.windowH;
                }
                else
                {
@@ -304,16 +314,15 @@
                        video.renderX = (video.windowW - video.renderW) / 2;
                        video.renderY = (video.windowH - video.renderH) / 2;
 
-                       // get hi-DPI upscale factors (returns 1.0 if no hi-DPI 
upscaling)
-                       int32_t widthInPixels, heightInPixels;
+                       // get DPI zoom factors (Macs with Retina, etc... 
returns 1.0 if no zoom)
                        SDL_GL_GetDrawableSize(video.window, &widthInPixels, 
&heightInPixels);
-                       double dHiDPIScaleX = (double)widthInPixels / 
video.windowW;
-                       double dHiDPIScaleY = (double)heightInPixels / 
video.windowH;
+                       video.dDpiZoomFactorX = (double)widthInPixels / 
video.windowW;
+                       video.dDpiZoomFactorY = (double)heightInPixels / 
video.windowH;
 
-                       video.renderRect.x = (int32_t)floor(video.renderX * 
dHiDPIScaleX);
-                       video.renderRect.y = (int32_t)floor(video.renderY * 
dHiDPIScaleY);
-                       video.renderRect.w = (int32_t)floor(video.renderW * 
dHiDPIScaleX);
-                       video.renderRect.h = (int32_t)floor(video.renderH * 
dHiDPIScaleY);
+                       video.renderRect.x = (int32_t)floor(video.renderX * 
video.dDpiZoomFactorX);
+                       video.renderRect.y = (int32_t)floor(video.renderY * 
video.dDpiZoomFactorY);
+                       video.renderRect.w = (int32_t)floor(video.renderW * 
video.dDpiZoomFactorX);
+                       video.renderRect.h = (int32_t)floor(video.renderH * 
video.dDpiZoomFactorY);
                        video.useCustomRenderRect = true; // use the 
destination coordinates above in SDL_RenderCopy()
                }
        }
@@ -322,6 +331,11 @@
                // windowed mode
 
                SDL_GetWindowSize(video.window, &video.renderW, &video.renderH);
+
+               // get DPI zoom factors (Macs with Retina, etc... returns 1.0 
if no zoom)
+               SDL_GL_GetDrawableSize(video.window, &widthInPixels, 
&heightInPixels);
+               video.dDpiZoomFactorX = (double)widthInPixels / video.windowW;
+               video.dDpiZoomFactorY = (double)heightInPixels / video.windowH;
        }
 
        // "hardware mouse" calculations
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/ft2_video.h 
new/ft2-clone-1.81/src/ft2_video.h
--- old/ft2-clone-1.79/src/ft2_video.h  2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/src/ft2_video.h  2024-04-09 19:31:47.000000000 +0200
@@ -23,7 +23,7 @@
        uint8_t windowModeUpscaleFactor;
        int32_t renderX, renderY, renderW, renderH, displayW, displayH, 
windowW, windowH;
        uint32_t mouseCursorUpscaleFactor, *frameBuffer, palette[PAL_NUM];
-       double dMonitorRefreshRate, dMouseXMul, dMouseYMul;
+       double dMonitorRefreshRate, dDpiZoomFactorX, dDpiZoomFactorY, 
dMouseXMul, dMouseYMul;
 #ifdef _WIN32
        HWND hWnd;
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ft2-clone-1.79/src/mixer/ft2_mix.h 
new/ft2-clone-1.81/src/mixer/ft2_mix.h
--- old/ft2-clone-1.79/src/mixer/ft2_mix.h      2024-03-18 15:44:31.000000000 
+0100
+++ new/ft2-clone-1.81/src/mixer/ft2_mix.h      2024-04-09 19:31:47.000000000 
+0200
@@ -2,7 +2,7 @@
 
 #include <stdint.h>
 
-#define MAX_TAPS 32
+#define MAX_TAPS 16
 #define MAX_LEFT_TAPS ((MAX_TAPS/2)-1)
 #define MAX_RIGHT_TAPS (MAX_TAPS/2)
 
Binary files old/ft2-clone-1.79/vs2019_project/ft2-clone/SDL2.dll and 
new/ft2-clone-1.81/vs2019_project/ft2-clone/SDL2.dll differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/vs2019_project/ft2-clone/ft2-clone.vcxproj 
new/ft2-clone-1.81/vs2019_project/ft2-clone/ft2-clone.vcxproj
--- old/ft2-clone-1.79/vs2019_project/ft2-clone/ft2-clone.vcxproj       
2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/vs2019_project/ft2-clone/ft2-clone.vcxproj       
2024-04-09 19:31:47.000000000 +0200
@@ -26,7 +26,7 @@
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" 
Label="Configuration">
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
     <CharacterSet>Unicode</CharacterSet>
     <WholeProgramOptimization>true</WholeProgramOptimization>
   </PropertyGroup>
@@ -37,7 +37,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" 
Label="Configuration">
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
+    <PlatformToolset>v141</PlatformToolset>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" 
Label="Configuration">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_platform.h 
new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_platform.h
--- old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_platform.h 
2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_platform.h 
2024-04-09 19:31:47.000000000 +0200
@@ -199,8 +199,10 @@
 #undef __GDK__
 #define __GDK__ 1
 #endif
-#if defined(__PSP__)
+#if defined(__PSP__) || defined(__psp__)
+#ifdef __PSP__
 #undef __PSP__
+#endif
 #define __PSP__ 1
 #endif
 #if defined(PS2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_revision.h 
new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_revision.h
--- old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_revision.h 
2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_revision.h 
2024-04-09 19:31:47.000000000 +0200
@@ -1,7 +1,7 @@
 /* Generated by updaterev.sh, do not edit */
 #ifdef SDL_VENDOR_INFO
-#define SDL_REVISION "SDL-release-2.30.1-0-g5adbf3765 (" SDL_VENDOR_INFO ")"
+#define SDL_REVISION "SDL-release-2.30.2-0-gf461d91cd (" SDL_VENDOR_INFO ")"
 #else
-#define SDL_REVISION "SDL-release-2.30.1-0-g5adbf3765"
+#define SDL_REVISION "SDL-release-2.30.2-0-gf461d91cd"
 #endif
 #define SDL_REVISION_NUMBER 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h 
new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h
--- old/ft2-clone-1.79/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h  
2024-03-18 15:44:31.000000000 +0100
+++ new/ft2-clone-1.81/vs2019_project/ft2-clone/sdl/include/SDL2/SDL_version.h  
2024-04-09 19:31:47.000000000 +0200
@@ -59,7 +59,7 @@
 */
 #define SDL_MAJOR_VERSION   2
 #define SDL_MINOR_VERSION   30
-#define SDL_PATCHLEVEL      1
+#define SDL_PATCHLEVEL      2
 
 /**
  * Macro to determine SDL version program was compiled against.
Binary files old/ft2-clone-1.79/vs2019_project/x64/Debug/SDL2.dll and 
new/ft2-clone-1.81/vs2019_project/x64/Debug/SDL2.dll differ

Reply via email to