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 2026-10-31 23:07:22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ft2-clone (Old) and /work/SRC/openSUSE:Factory/.ft2-clone.new.1255 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ft2-clone" Sat Oct 31 23:07:22 2026 rev:51 rq:1393947 version:2.28 Changes: -------- --- /work/SRC/openSUSE:Factory/ft2-clone/ft2-clone.changes 2026-10-26 10:03:42.629044634 +0100 +++ /work/SRC/openSUSE:Factory/.ft2-clone.new.1255/ft2-clone.changes 2026-10-31 23:09:34.076895465 +0100 @@ -1,0 +2,8 @@ +Fri Oct 30 18:42:19 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 2.28 + * Fixed crash when using the "Fix DC" button (S.E.Ext) on a marked + selection. + * Did some tweaks to the routines in Smp. Ed. -> Effects. + +------------------------------------------------------------------- Old: ---- ft2-clone-2.27.tar.gz New: ---- ft2-clone-2.28.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ft2-clone.spec ++++++ --- /var/tmp/diff_new_pack.9dCx2j/_old 2026-10-31 23:09:34.977932771 +0100 +++ /var/tmp/diff_new_pack.9dCx2j/_new 2026-10-31 23:09:34.978932812 +0100 @@ -17,7 +17,7 @@ Name: ft2-clone -Version: 2.27 +Version: 2.28 Release: 0 Summary: Fasttracker II clone License: BSD-3-Clause AND CC-BY-NC-SA-4.0 ++++++ ft2-clone-2.27.tar.gz -> ft2-clone-2.28.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_about.c new/ft2-clone-2.28/src/ft2_about.c --- old/ft2-clone-2.27/src/ft2_about.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_about.c 2026-10-29 18:44:55.000000000 +0100 @@ -10,7 +10,7 @@ #include "ft2_config.h" #include "ft2_random.h" -#define NUM_STARS 1500 +#define NUM_STARS 2048 #define STARSHINE_ALPHA_PERCENTAGE 33 #define ABOUT_SCREEN_X 3 #define ABOUT_SCREEN_Y 3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_audio.c new/ft2-clone-2.28/src/ft2_audio.c --- old/ft2-clone-2.27/src/ft2_audio.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_audio.c 2026-10-29 18:44:55.000000000 +0100 @@ -351,7 +351,7 @@ if (status & CS_UPDATE_VOL) { v->fVolume = ch->fFinalVol; // 0.0f .. 1.0f - v->scopeVolume = (int16_t)(int32_t)((ch->fFinalVol * (SCOPE_HEIGHT*512)) + 0.5f); + v->scopeVolume = (uint16_t)(int32_t)((ch->fFinalVol * 32768.0f) + 0.5f); } if (status & CS_UPDATE_PAN) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_audio.h new/ft2-clone-2.28/src/ft2_audio.h --- old/ft2-clone-2.27/src/ft2_audio.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_audio.h 2026-10-29 18:44:55.000000000 +0100 @@ -62,7 +62,7 @@ const int16_t *base16, *revBase16; bool active, samplingBackwards, isFadeOutVoice, hasLooped; uint8_t mixFuncOffset, panning, loopType; - int16_t scopeVolume; + uint16_t scopeVolume; int32_t position, sampleEnd, loopStart, loopLength; uint32_t volumeRampLength; uint64_t positionFrac, delta, scopeDelta; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_config.c new/ft2-clone-2.28/src/ft2_config.c --- old/ft2-clone-2.27/src/ft2_config.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_config.c 2026-10-29 18:44:55.000000000 +0100 @@ -259,7 +259,7 @@ showTopScreen(DONT_RESTORE_SCREENS); showBottomScreen(); - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2); if (config.specialFlags2 & HARDWARE_MOUSE) @@ -369,7 +369,7 @@ showTopScreen(DONT_RESTORE_SCREENS); showBottomScreen(); - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); updateImageStretchAndPixelFilter(oldWindowFlags, oldSpecialFlags2); if (config.specialFlags2 & HARDWARE_MOUSE) @@ -1988,7 +1988,7 @@ config.windowFlags &= ~(WINSIZE_1X + WINSIZE_2X + WINSIZE_3X + WINSIZE_4X); config.windowFlags |= WINSIZE_AUTO; - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); checkRadioButton(RB_CONFIG_WIN_SIZE_AUTO); } @@ -2002,7 +2002,7 @@ config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_2X + WINSIZE_3X + WINSIZE_4X); config.windowFlags |= WINSIZE_1X; - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); checkRadioButton(RB_CONFIG_WIN_SIZE_1X); } @@ -2016,7 +2016,7 @@ config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_3X + WINSIZE_4X); config.windowFlags |= WINSIZE_2X; - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); checkRadioButton(RB_CONFIG_WIN_SIZE_2X); } @@ -2030,7 +2030,7 @@ config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + WINSIZE_4X); config.windowFlags |= WINSIZE_3X; - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); checkRadioButton(RB_CONFIG_WIN_SIZE_3X); } @@ -2044,7 +2044,7 @@ config.windowFlags &= ~(WINSIZE_AUTO + WINSIZE_1X + WINSIZE_2X + WINSIZE_3X); config.windowFlags |= WINSIZE_4X; - setWindowSizeFromConfig(true); + setWindowSizeFromConfig(UPDATE_RENDERER); checkRadioButton(RB_CONFIG_WIN_SIZE_4X); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_gui.c new/ft2-clone-2.28/src/ft2_gui.c --- old/ft2-clone-2.27/src/ft2_gui.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_gui.c 2026-10-29 18:44:55.000000000 +0100 @@ -556,16 +556,6 @@ } } -void textOutBorder(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t borderPaletteIndex, const char *textPtr) -{ - textOut(x, y-1, borderPaletteIndex, textPtr); // top - textOut(x+1, y, borderPaletteIndex, textPtr); // right - textOut(x, y+1, borderPaletteIndex, textPtr); // bottom - textOut(x-1, y, borderPaletteIndex, textPtr); // left - - textOut(x, y, paletteIndex, textPtr); -} - // fixed width void textOutFixed(uint16_t x, uint16_t y, uint8_t fgPaltete, uint8_t bgPalette, const char *textPtr) { @@ -855,7 +845,7 @@ for (int32_t i = 0; i < h; i++) { *dstPtr = pixVal; - dstPtr += SCREEN_W; + dstPtr += SCREEN_W; } } @@ -879,8 +869,8 @@ const int16_t dy = y2 - y1; const uint16_t ay = ABS(dy) * 2; const int16_t sy = SGN(dy); - int16_t x = x1; - int16_t y = y1; + + int16_t x = x1, y = y1; uint32_t pixVal = video.palette[paletteIndex]; const int32_t pitch = sy * SCREEN_W; @@ -1257,7 +1247,7 @@ } else { - showTopLeftMainScreen(restoreScreens); // updates ui.scopesShown + showTopLeftMainScreen(restoreScreens); // also sets ui.scopesShown showTopRightMainScreen(); } } @@ -1276,7 +1266,7 @@ { setScrollBarPos(SB_POS_ED, 0, DONT_TRIGGER_CALLBACK); - showTopScreen(DONT_RESTORE_SCREENS); // false = don't restore screens + showTopScreen(DONT_RESTORE_SCREENS); showPatternEditor(); ui.updatePosSections = true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_gui.h new/ft2-clone-2.28/src/ft2_gui.h --- old/ft2-clone-2.27/src/ft2_gui.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_gui.h 2026-10-29 18:44:55.000000000 +0100 @@ -37,6 +37,9 @@ enum { + DONT_UPDATE_RENDERER = false, + UPDATE_RENDERER = true, + DONT_RESTORE_SCREENS = false, RESTORE_SCREENS = true, @@ -106,7 +109,6 @@ void bigCharOut(uint16_t xPos, uint16_t yPos, uint8_t paletteIndex, char chr); void charOutOutlined(uint16_t x, uint16_t y, uint8_t paletteIndex, char chr); void textOut(uint16_t x, uint16_t y, uint8_t paletteIndex, const char *textPtr); -void textOutBorder(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t borderPaletteIndex, const char *textPtr); void textOutFixed(uint16_t x, uint16_t y, uint8_t fgPaltete, uint8_t bgPalette, const char *textPtr); void bigTextOut(uint16_t x, uint16_t y, uint8_t paletteIndex, const char *textPtr); void bigTextOutShadow(uint16_t x, uint16_t y, uint8_t paletteIndex, uint8_t shadowPaletteIndex, const char *textPtr); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_header.h new/ft2-clone-2.28/src/ft2_header.h --- old/ft2-clone-2.27/src/ft2_header.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_header.h 2026-10-29 18:44:55.000000000 +0100 @@ -14,7 +14,7 @@ #endif #include "ft2_replayer.h" -#define PROG_VER_STR "2.27" +#define PROG_VER_STR "2.28" // do NOT change these! It will only mess things up... diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_pattern_ed.c new/ft2-clone-2.28/src/ft2_pattern_ed.c --- old/ft2-clone-2.27/src/ft2_pattern_ed.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_pattern_ed.c 2026-10-29 18:44:55.000000000 +0100 @@ -2167,19 +2167,15 @@ void resetPlaybackTime(void) { - song.playbackSeconds = 0; - song.playbackSecondsFrac = 0; - - last_TimeH = 0; - last_TimeM = 0; - last_TimeS = 0; + song.dPlaybackSeconds = 0.0; + last_TimeH = last_TimeM = last_TimeS = 0; } void drawPlaybackTime(void) { if (songPlaying) { - uint32_t seconds = song.playbackSeconds; + uint32_t seconds = (int32_t)song.dPlaybackSeconds; last_TimeH = seconds / 3600; seconds -= last_TimeH * 3600; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_replayer.c new/ft2-clone-2.28/src/ft2_replayer.c --- old/ft2-clone-2.27/src/ft2_replayer.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_replayer.c 2026-10-29 18:44:55.000000000 +0100 @@ -30,8 +30,7 @@ #include "mixer/ft2_windowed_sinc.h" static uint32_t logTab[4*12*16], frequencyMulFactor, frequencyDivFactor; -static uint64_t songTickDuration52fp[(MAX_BPM-MIN_BPM)+1]; -static double dDeltaMul, dScopeDeltaMul, dScopeDrawDeltaMul; +static double dSongTickDuration[(MAX_BPM-MIN_BPM)+1], dDeltaMul, dScopeDeltaMul, dScopeDrawDeltaMul; static bool bxxOverflow; static note_t nilPatternLine[MAX_CHANNELS]; @@ -490,7 +489,9 @@ const int32_t i = bpm - MIN_BPM; audio.samplesPerTickIntTab[i] = (uint32_t)dSamplesPerTickInt; audio.samplesPerTickFracTab[i] = (uint64_t)(dSamplesPerTickFrac * BPM_FRAC_SCALE); - songTickDuration52fp[i] = (uint64_t)round((1ULL << 52ULL) / dFt2BPMHz); + + dSongTickDuration[i] = 1.0 / dFt2BPMHz; + audio.tickTimeIntTab[i] = (uint32_t)dTickTimeInt; audio.tickTimeFracTab[i] = (uint64_t)(dTickTimeFrac * TICK_TIME_FRAC_SCALE); } @@ -2374,12 +2375,10 @@ // for song playback counter (hh:mm:ss) if (song.BPM >= MIN_BPM && song.BPM <= MAX_BPM) // just in case { - song.playbackSecondsFrac += songTickDuration52fp[song.BPM-MIN_BPM]; - if (song.playbackSecondsFrac >= 1ULL << 52) - { - song.playbackSecondsFrac &= (1ULL << 52)-1; - song.playbackSeconds++; - } + song.dPlaybackSeconds += dSongTickDuration[song.BPM-MIN_BPM]; + + if (song.dPlaybackSeconds >= (99.0*60.0*60.0)+60.0) // wrap around 99:59:59 -> 00:00:00 + song.dPlaybackSeconds = 0.0; } bool tickZero = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_replayer.h new/ft2-clone-2.28/src/ft2_replayer.h --- old/ft2-clone-2.27/src/ft2_replayer.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_replayer.h 2026-10-29 18:44:55.000000000 +0100 @@ -198,8 +198,7 @@ typedef struct syncedChannel_t // used for audio/video sync queue (pack to save RAM) { uint8_t status, pianoNoteNum, smpNum, instrNum; - int16_t scopeVolume; - uint16_t period; + uint16_t scopeVolume, period; int32_t smpStartPos; } #ifdef __GNUC__ @@ -274,9 +273,7 @@ int16_t songPos, pattNum, row, currNumRows; uint16_t songLength, songLoopStart, BPM, speed, initialSpeed, globalVolume, tick; int32_t numChannels; - - uint32_t playbackSeconds; - uint64_t playbackSecondsFrac; + double dPlaybackSeconds; } song_t; int32_t getSampleC4Hz(sample_t *s); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_sample_ed.c new/ft2-clone-2.28/src/ft2_sample_ed.c --- old/ft2-clone-2.27/src/ft2_sample_ed.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_sample_ed.c 2026-10-29 18:44:55.000000000 +0100 @@ -3587,14 +3587,14 @@ if (s->flags & SAMPLE_16BIT) { + ptr16 = (int16_t *)s->dataPtr; if (!sampleDataMarked) { - ptr16 = (int16_t *)s->dataPtr; length = s->length; } else { - ptr16 = (int16_t *)&s->dataPtr + smpEd_Rx1; + ptr16 += smpEd_Rx1; length = smpEd_Rx2 - smpEd_Rx1; } @@ -3610,6 +3610,7 @@ int64_t averageDC = 0; for (int32_t i = 0; i < length; i++) averageDC += ptr16[i]; + averageDC = (averageDC + (length>>1)) / length; // rounded const int32_t smpSub = (int32_t)averageDC; @@ -3624,14 +3625,14 @@ } else // 8-bit { + ptr8 = s->dataPtr; if (!sampleDataMarked) { - ptr8 = s->dataPtr; length = s->length; } else { - ptr8 = &s->dataPtr[smpEd_Rx1]; + ptr8 += smpEd_Rx1; length = smpEd_Rx2 - smpEd_Rx1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_smpfx.c new/ft2-clone-2.28/src/ft2_smpfx.c --- old/ft2-clone-2.27/src/ft2_smpfx.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_smpfx.c 2026-10-29 18:44:55.000000000 +0100 @@ -180,16 +180,16 @@ memset(lengthStr, '\0', sizeof (lengthStr)); snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength); - if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof (lengthStr)-1) != 1) + if (inputBox(1, "Enter new waveform length (3..9999):", lengthStr, sizeof (lengthStr)-1) != 1) return; if (lengthStr[0] == '\0') return; lastWaveLength = (int32_t)atoi(lengthStr); - if (lastWaveLength <= 1 || lastWaveLength > 65536) + if (lastWaveLength < 3 || lastWaveLength > 9999) { - okBox(0, "System message", "Illegal range! Allowed range is 2..65535", NULL); + okBox(0, "System message", "Illegal length! Allowed range is 3..9999", NULL); return; } @@ -207,20 +207,23 @@ return; } - const double delta = 4.0 / lastWaveLength; - double phase = 0.0; - int16_t *ptr16 = (int16_t *)s->dataPtr; + + const double dDelta = 4.0 / (double)lastWaveLength; + double dPhase = 0.0; + for (int32_t i = 0; i < newLength; i++) { - double t = phase; - if (t > 3.0) - t -= 4.0; - else if (t >= 1.0) - t = 2.0 - t; + double dT = dPhase; + if (dT > 3.0) + dT -= 4.0; + else if (dT >= 1.0) + dT = 2.0 - dT; - *ptr16++ = (int16_t)(t * INT16_MAX); - phase = fmod(phase + delta, 4.0); + dPhase = fmod(dPhase + dDelta, 4.0); + + int32_t smp = (int32_t)round(INT16_MAX * dT); + *ptr16++ = (int16_t)smp; } s->loopLength = newLength; @@ -238,16 +241,16 @@ memset(lengthStr, '\0', sizeof (lengthStr)); snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength); - if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof (lengthStr)-1) != 1) + if (inputBox(1, "Enter new waveform length (3..9999):", lengthStr, sizeof (lengthStr)-1) != 1) return; if (lengthStr[0] == '\0') return; lastWaveLength = (int32_t)atoi(lengthStr); - if (lastWaveLength <= 1 || lastWaveLength > 65536) + if (lastWaveLength < 3 || lastWaveLength > 9999) { - okBox(0, "System message", "Illegal range! Allowed range is 2..65535", NULL); + okBox(0, "System message", "Illegal length! Allowed range is 3..9999", NULL); return; } @@ -264,15 +267,17 @@ okBox(0, "System message", "Not enough memory!", NULL); return; } + + int16_t *ptr16 = (int16_t *)s->dataPtr; - uint64_t point64 = 0; - uint64_t delta64 = ((uint64_t)(INT16_MAX*2) << 32ULL) / lastWaveLength; + const double dDelta = (INT16_MAX * 2.0) / (double)lastWaveLength; + double dPoint = 0.0; - int16_t *ptr16 = (int16_t *)s->dataPtr; for (int32_t i = 0; i < newLength; i++) { - *ptr16++ = (int16_t)(point64 >> 32); - point64 += delta64; + int32_t smp = (int32_t)round(dPoint); + *ptr16++ = (int16_t)smp; + dPoint += dDelta; } s->loopLength = newLength; @@ -290,16 +295,16 @@ memset(lengthStr, '\0', sizeof (lengthStr)); snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength); - if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof (lengthStr)-1) != 1) + if (inputBox(1, "Enter new waveform length (6..9999):", lengthStr, sizeof (lengthStr)-1) != 1) return; if (lengthStr[0] == '\0') return; lastWaveLength = (int32_t)atoi(lengthStr); - if (lastWaveLength <= 1 || lastWaveLength > 65536) + if (lastWaveLength < 6 || lastWaveLength > 9999) { - okBox(0, "System message", "Illegal range! Allowed range is 2..65535", NULL); + okBox(0, "System message", "Illegal length! Allowed range is 6..9999", NULL); return; } @@ -317,11 +322,14 @@ return; } - const double dMul = (2.0 * M_PI) / lastWaveLength; - int16_t *ptr16 = (int16_t *)s->dataPtr; + + const double dMul = (2.0 * M_PI) / (double)lastWaveLength; for (int32_t i = 0; i < newLength; i++) - *ptr16++ = (int16_t)(INT16_MAX * sin(i * dMul)); + { + int32_t smp = (int32_t)round(INT16_MAX * sin(i * dMul)); + *ptr16++ = (int16_t)smp; + } s->loopLength = newLength; s->flags |= LOOP_FORWARD; @@ -338,16 +346,22 @@ memset(lengthStr, '\0', sizeof (lengthStr)); snprintf(lengthStr, sizeof (lengthStr), "%d", lastWaveLength); - if (inputBox(1, "Enter new waveform length:", lengthStr, sizeof (lengthStr)-1) != 1) + if (inputBox(1, "Enter new waveform length (2..9999, even):", lengthStr, sizeof (lengthStr)-1) != 1) return; if (lengthStr[0] == '\0') return; lastWaveLength = (int32_t)atoi(lengthStr); - if (lastWaveLength <= 1 || lastWaveLength > 65536) + if (lastWaveLength < 2 || lastWaveLength > 9999) + { + okBox(0, "System message", "Illegal length! Allowed range is 2..9999", NULL); + return; + } + + if (lastWaveLength & 1) { - okBox(0, "System message", "Illegal range! Allowed range is 2..65535", NULL); + okBox(0, "System message", "Illegal length! Length must be an even number (2, 4, 6, 8, ...)", NULL); return; } @@ -528,15 +542,16 @@ int16_t *ptr16 = (int16_t *)s->dataPtr + x1; for (int32_t i = 0; i < len; i++) { - double out = (f->a1*ptr16[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); + double dOut = (f->a1*ptr16[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); f->inTmp[1] = f->inTmp[0]; f->inTmp[0] = ptr16[i]; f->outTmp[1] = f->outTmp[0]; - f->outTmp[0] = out; + f->outTmp[0] = dOut; - ptr16[i] = (int16_t)CLAMP(out, INT16_MIN, INT16_MAX); + int32_t sample = (int32_t)CLAMP(dOut, INT16_MIN, INT16_MAX); + ptr16[i] = (int16_t)sample; } } else @@ -544,15 +559,16 @@ int8_t *ptr8 = (int8_t *)s->dataPtr + x1; for (int32_t i = 0; i < len; i++) { - double out = (f->a1*ptr8[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); + double dOut = (f->a1*ptr8[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); f->inTmp[1] = f->inTmp[0]; f->inTmp[0] = ptr8[i]; f->outTmp[1] = f->outTmp[0]; - f->outTmp[0] = out; + f->outTmp[0] = dOut; - ptr8[i] = (int8_t)CLAMP(out, INT8_MIN, INT8_MAX); + int32_t sample = (int32_t)CLAMP(dOut, INT8_MIN, INT8_MAX); + ptr8[i] = (int8_t)sample; } } @@ -587,36 +603,42 @@ double peak = 0.0; for (int32_t i = 0; i < len; i++) { - const double out = (f->a1*dSmp[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); + const double dOut = (f->a1*dSmp[i]) + (f->a2*f->inTmp[0]) + (f->a3*f->inTmp[1]) - (f->b1*f->outTmp[0]) - (f->b2*f->outTmp[1]); f->inTmp[1] = f->inTmp[0]; f->inTmp[0] = dSmp[i]; f->outTmp[1] = f->outTmp[0]; - f->outTmp[0] = out; + f->outTmp[0] = dOut; - dSmp[i] = out; + dSmp[i] = dOut; - const double outAbs = fabs(out); + const double outAbs = fabs(dOut); if (outAbs > peak) peak = outAbs; } if (s->flags & SAMPLE_16BIT) { - const double scale = INT16_MAX / peak; + const double dScale = INT16_MAX / peak; int16_t *ptr16 = (int16_t *)s->dataPtr + x1; for (int32_t i = 0; i < len; i++) - ptr16[i] = (int16_t)(dSmp[i] * scale); + { + int32_t sample = (int32_t)(dSmp[i] * dScale); + ptr16[i] = (int16_t)sample; + } } else { - const double scale = INT8_MAX / peak; + const double dScale = INT8_MAX / peak; int8_t *ptr8 = (int8_t *)s->dataPtr + x1; for (int32_t i = 0; i < len; i++) - ptr8[i] = (int8_t)(dSmp[i] * scale); + { + int32_t sample = (int32_t)(dSmp[i] * dScale); + ptr8[i] = (int8_t)sample; + } } free(dSmp); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_sysreqs.c new/ft2-clone-2.28/src/ft2_sysreqs.c --- old/ft2-clone-2.27/src/ft2_sysreqs.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_sysreqs.c 2026-10-29 18:44:55.000000000 +0100 @@ -196,6 +196,8 @@ pushButton_t *p; SDL_Event inputEvent; + volatile bool wasBusy = editor.busy; + if (editor.editTextFlag) { exitTextEditing(); @@ -402,6 +404,10 @@ showBottomScreen(); SDL_EventState(SDL_DROPFILE, SDL_ENABLE); + + if (wasBusy) + mouseAnimOn(); + return returnVal; } @@ -416,6 +422,8 @@ SDL_Event inputEvent; + volatile bool wasBusy = editor.busy; + if (editor.editTextFlag) { exitTextEditing(); @@ -673,6 +681,10 @@ showBottomScreen(); SDL_EventState(SDL_DROPFILE, SDL_ENABLE); + + if (wasBusy) + mouseAnimOn(); + return returnVal; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/ft2_video.c new/ft2-clone-2.28/src/ft2_video.c --- old/ft2-clone-2.27/src/ft2_video.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/ft2_video.c 2026-10-29 18:44:55.000000000 +0100 @@ -353,7 +353,7 @@ SDL_SetWindowFullscreen(video.window, 0); SDL_Delay(15); // fixes possible issues - setWindowSizeFromConfig(false); // false = do not change actual window size, only update variables + setWindowSizeFromConfig(DONT_UPDATE_RENDERER); SDL_SetWindowSize(video.window, SCREEN_W * video.windowModeUpscaleFactor, SCREEN_H * video.windowModeUpscaleFactor); updateRenderSizeVars(); @@ -911,7 +911,7 @@ windowFlags |= SDL_WINDOW_HIDDEN; #endif - setWindowSizeFromConfig(false); + setWindowSizeFromConfig(DONT_UPDATE_RENDERER); int32_t di = SDL_GetWindowDisplayIndex(video.window); if (di < 0) @@ -1007,7 +1007,9 @@ SDL_SetRenderDrawColor(video.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); + // for CTRL+SHIFT+F info screen dFrameDurationDiv = (1000.0 * FPS_SCAN_FRAMES) / hpcFreq.dFreqMulMs; + return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/mixer/ft2_mix_macros.h new/ft2-clone-2.28/src/mixer/ft2_mix_macros.h --- old/ft2-clone-2.27/src/mixer/ft2_mix_macros.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/mixer/ft2_mix_macros.h 2026-10-29 18:44:55.000000000 +0100 @@ -78,246 +78,199 @@ fVolumeL += fVolumeLDelta; \ fVolumeR += fVolumeRDelta; -/* It may look like we are potentially going out of bounds while looking up the sample points, -** but the sample data is actually padded on both the left (negative) and right side, where correct tap -** samples are stored according to loop mode (or no loop). +#define MIX_SAMPLE \ + *fMixBufferL++ += fSample * fVolumeL; \ + *fMixBufferR++ += fSample * fVolumeR; + + +/* ----------------------------------------------------------------------- */ +/* SAMPLE INTERPOLATION MACROS */ +/* ----------------------------------------------------------------------- */ +/* Notes: +** It may look like we are potentially going out of bounds while looking +** up the sample points and interpolation LUT data, but we have the +** correct data stored at the correct places for this. ** -** There is also a second special case for the left edge (negative taps) after the sample has looped once. +** The _TAP_FIX macros are for special left-edge cases to get proper tap +** data after one loop cycle. These are only used on looped samples. */ + /* ----------------------------------------------------------------------- */ /* NO INTERPOLATION */ /* ----------------------------------------------------------------------- */ #define RENDER_8BIT_SMP \ fSample = *smpPtr * (1.0f / 128.0f); \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + MIX_SAMPLE #define RENDER_16BIT_SMP \ fSample = *smpPtr * (1.0f / 32768.0f); \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + MIX_SAMPLE /* ----------------------------------------------------------------------- */ /* 2-POINT LINEAR INTERPOLATION */ /* ----------------------------------------------------------------------- */ -#define LINEAR_INTERPOLATION(s, f, scale) \ +#define LINEAR_INTERPOLATION(s, f, smpBits) \ { \ const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \ - const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ - \ - const float s1 = s[0]; \ - const float s2 = s[1]; \ + const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float p1 = s[0], p2 = s[1]; \ \ - fSample = (s1 + ((s2 - s1) * t)) * (1.0f / scale); \ + fSample = (p1 + ((p2 - p1) * x)) * (1.0f / (1 << (smpBits-1))); \ } #define RENDER_8BIT_SMP_LINTRP \ - LINEAR_INTERPOLATION(smpPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + LINEAR_INTERPOLATION(smpPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_LINTRP \ - LINEAR_INTERPOLATION(smpPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + LINEAR_INTERPOLATION(smpPtr, positionFrac, 16) \ + MIX_SAMPLE /* ----------------------------------------------------------------------- */ /* 3-POINT QUADRATIC SPLINE INTERPOLATION */ /* ----------------------------------------------------------------------- */ -#define QUADRATIC_SPLINE_INTERPOLATION(s, f, scale) \ +#define QUADRATIC_SPLINE_INTERPOLATION(s, f, smpBits) \ { \ const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \ - const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ - \ - const float s1 = s[-1]; \ - const float s2 = s[0]; \ - const float s3 = s[1]; \ + const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float p1 = s[-1], p2 = s[0], p3 = s[1]; \ \ - const float a = ((s1 + s3) * 0.5f) - s2; \ - const float b = (s3 - s1) * 0.5f; \ + const float a = ((p1 + p3) * 0.5f) - p2; \ + const float b = (p3 - p1) * 0.5f; \ + const float c = p2; \ \ - fSample = ((a * t + b) * t + s2) * (1.0f / scale); \ + fSample = ((a * x + b) * x + c) * (float)(1.0 / (1 << (smpBits-1))); \ } #define RENDER_8BIT_SMP_QINTRP \ - QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_QINTRP \ - QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; - -/* The TAP_FIX macros are for special left-edge cases get proper tap data after one loop cycle. -** These are only used on looped samples. -*/ + QUADRATIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 16) \ + MIX_SAMPLE #define RENDER_8BIT_SMP_QINTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \ - QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_QINTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \ - QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + QUADRATIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 16) \ + MIX_SAMPLE /* ----------------------------------------------------------------------- */ -/* 4-POINT CUBIC SPLINE INTERPOLATION */ +/* 4-POINT CUBIC SPLINE ("Catmull-Rom") INTERPOLATION */ /* ----------------------------------------------------------------------- */ -// Catmull-Rom algorithm -#define CUBIC_SPLINE_INTERPOLATION(s, f, scale) \ +#define CUBIC_SPLINE_INTERPOLATION(s, f, smpBits) \ { \ const int32_t frac31 = (uint32_t)f >> (MIXER_FRAC_BITS-31); \ - const float t = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float p1 = s[-1], p2 = s[0], p3 = s[1], p4 = s[2]; \ \ - const float s1 = s[-1]; \ - const float s2 = s[0]; \ - const float s3 = s[1]; \ - const float s4 = s[2]; \ - \ - const float a = ((s4 - s1) * 0.5f) + ((s2 - s3) * 1.5f); \ - const float b = ((s1 - (s2 * 2.5f)) + (s3 * 2.0f)) - (s4 * 0.5f); \ - const float c = (s3 - s1) * 0.5f; \ + const float a = ((p4 - p1) * 0.5f) + ((p2 - p3) * 1.5f); \ + const float b = ((p1 - (p2 * 2.5f)) + (p3 * 2.0f)) - (p4 * 0.5f); \ + const float c = (p3 - p1) * 0.5f; \ + const float d = p2; \ \ - fSample = (((a * t + b) * t + c) * t + s2) * (1.0f / scale); \ + fSample = (((a * x + b) * x + c) * x + d) * (float)(1.0 / (1 << (smpBits-1))); \ } #define RENDER_8BIT_SMP_CINTRP \ - CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_CINTRP \ - CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + CUBIC_SPLINE_INTERPOLATION(smpPtr, positionFrac, 16) \ + MIX_SAMPLE #define RENDER_8BIT_SMP_CINTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \ - CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_CINTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \ - CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + CUBIC_SPLINE_INTERPOLATION(smpTapPtr, positionFrac, 16) \ + MIX_SAMPLE /* ----------------------------------------------------------------------- */ -/* 8-POINT WINDOWED-SINC INTERPOLATION */ +/* WINDOWED-SINC INTERPOLATION */ /* ----------------------------------------------------------------------- */ - -/* Uses linear interpolation between the phases in the kernels to achieve -** very good precision at a low pre-computed phase count. -** -** It may look like we go out of bounds for fSinc[] and s[], but we have -** extra data at the correct places to account for this. +/* Note: +** Uses linear interpolation between the phases in the kernels to achieve +** very good precision at a low pre-computed phase count (256). */ -#define WINDOWED_SINC8_INTERPOLATION(s, f, scale) \ +#define WSINC_INTRP(NUM_TAPS, NUM_TAPS_BITS, s, f, smpBits) \ { \ const uint32_t frac32 = (uint32_t)f; \ const uint32_t phaseInt = frac32 >> SINC_PHASE_SHIFT; \ const float fPhaseFrac = (int32_t)(frac32 & SINC_PHASE_MASK) * (1.0f / SINC_PHASE_SCALE); \ \ - const float *fSinc = v->fSincLUT + (phaseInt << SINC8_TAPS_BITS); \ + const float *fSinc = v->fSincLUT + (phaseInt << NUM_TAPS_BITS); \ \ float fSum = 0.0f; \ - for (int32_t tap = 0; tap < SINC8_TAPS; tap++) \ + for (int32_t tap = 0; tap < NUM_TAPS; tap++) \ { \ const float fY1 = fSinc[tap]; \ - const float fY2 = fSinc[SINC8_TAPS+tap]; /* next phase */ \ + const float fY2 = fSinc[NUM_TAPS+tap]; /* next phase */ \ \ /* do linear interpolation between phases */ \ - fSum += s[tap-SINC8_CENTER_TAP] * (fY1 + ((fY2 - fY1) * fPhaseFrac)); \ + fSum += s[tap-((NUM_TAPS/2)-1)] * (fY1 + ((fY2 - fY1) * fPhaseFrac)); \ } \ \ - fSample = fSum * (1.0f / scale); \ + fSample = fSum * (float)(1.0 / (1 << (smpBits-1))); \ } +#define WSINC8_INTERPOLATION(s, f, smpBits) WSINC_INTRP(SINC8_TAPS, SINC8_TAPS_BITS, s, f, smpBits) +#define WSINC16_INTERPOLATION(s, f, smpBits) WSINC_INTRP(SINC16_TAPS, SINC16_TAPS_BITS, s, f, smpBits) + #define RENDER_8BIT_SMP_S8INTRP \ - WINDOWED_SINC8_INTERPOLATION(smpPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC8_INTERPOLATION(smpPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_S8INTRP \ - WINDOWED_SINC8_INTERPOLATION(smpPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC8_INTERPOLATION(smpPtr, positionFrac, 16) \ + MIX_SAMPLE #define RENDER_8BIT_SMP_S8INTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \ - WINDOWED_SINC8_INTERPOLATION(smpTapPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC8_INTERPOLATION(smpTapPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_S8INTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \ - WINDOWED_SINC8_INTERPOLATION(smpTapPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; - - -/* ----------------------------------------------------------------------- */ -/* 16-POINT WINDOWED-SINC INTERPOLATION */ -/* ----------------------------------------------------------------------- */ - -#define WINDOWED_SINC16_INTERPOLATION(s, f, scale) \ -{ \ - const uint32_t frac32 = (uint32_t)f; \ - const uint32_t phaseInt = frac32 >> SINC_PHASE_SHIFT; \ - const float fPhaseFrac = (int32_t)(frac32 & SINC_PHASE_MASK) * (1.0f / SINC_PHASE_SCALE); \ - \ - const float *fSinc = v->fSincLUT + (phaseInt << SINC16_TAPS_BITS); \ - \ - float fSum = 0.0f; \ - for (int32_t tap = 0; tap < SINC16_TAPS; tap++) \ - { \ - const float fY1 = fSinc[tap]; \ - const float fY2 = fSinc[SINC16_TAPS+tap]; /* next phase */ \ - \ - /* do linear interpolation between phases */ \ - fSum += s[tap-SINC16_CENTER_TAP] * (fY1 + ((fY2 - fY1) * fPhaseFrac)); \ - } \ - \ - fSample = fSum * (1.0f / scale); \ -} + WSINC8_INTERPOLATION(smpTapPtr, positionFrac, 16) \ + MIX_SAMPLE #define RENDER_8BIT_SMP_S16INTRP \ - WINDOWED_SINC16_INTERPOLATION(smpPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC16_INTERPOLATION(smpPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_S16INTRP \ - WINDOWED_SINC16_INTERPOLATION(smpPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC16_INTERPOLATION(smpPtr, positionFrac, 16) \ + MIX_SAMPLE #define RENDER_8BIT_SMP_S16INTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int8_t *)&v->leftEdgeTaps8[(int32_t)(smpPtr-loopStartPtr)] : (int8_t *)smpPtr; \ - WINDOWED_SINC16_INTERPOLATION(smpTapPtr, positionFrac, 128) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC16_INTERPOLATION(smpTapPtr, positionFrac, 8) \ + MIX_SAMPLE #define RENDER_16BIT_SMP_S16INTRP_TAP_FIX \ smpTapPtr = (smpPtr <= leftEdgePtr) ? (int16_t *)&v->leftEdgeTaps16[(int32_t)(smpPtr-loopStartPtr)] : (int16_t *)smpPtr; \ - WINDOWED_SINC16_INTERPOLATION(smpTapPtr, positionFrac, 32768) \ - *fMixBufferL++ += fSample * fVolumeL; \ - *fMixBufferR++ += fSample * fVolumeR; + WSINC16_INTERPOLATION(smpTapPtr, positionFrac, 16) \ + MIX_SAMPLE /* ----------------------------------------------------------------------- */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scope_macros.h new/ft2-clone-2.28/src/scopes/ft2_scope_macros.h --- old/ft2-clone-2.27/src/scopes/ft2_scope_macros.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/scopes/ft2_scope_macros.h 2026-10-29 18:44:55.000000000 +0100 @@ -6,18 +6,20 @@ #define SCOPE_INIT \ const uint32_t color = video.palette[PAL_PATTEXT]; \ - uint32_t width = x + w; \ - int32_t sample; \ - int32_t position = s->position; \ - uint64_t positionFrac = s->positionFrac; + uint32_t width = sx + w; \ + int32_t sample, position = s->position; \ + uint64_t positionFrac = s->positionFrac; \ + float fSample; \ + const float fVolume = (float)s->volume * (float)((SCOPE_HEIGHT / 2.0) / 32768.0); #define SCOPE_INIT_PINGPONG \ const uint32_t color = video.palette[PAL_PATTEXT]; \ - uint32_t width = x + w; \ - int32_t sample; \ - int32_t actualPos, position = s->position; \ + uint32_t width = sx + w; \ + int32_t sample, actualPos, position = s->position; \ uint64_t positionFrac = s->positionFrac; \ - bool samplingBackwards = s->samplingBackwards; + bool samplingBackwards = s->samplingBackwards; \ + float fSample; \ + const float fVolume = (float)s->volume * (float)((SCOPE_HEIGHT / 2.0) / 32768.0); #define LINED_SCOPE_INIT \ SCOPE_INIT \ @@ -33,129 +35,127 @@ ** so that out-of-bounds reads get the correct interpolation tap data. */ -#define NO_INTERPOLATION8 \ -{ \ - sample = s8[0] << 8; \ -} - -#define NO_INTERPOLATION16 \ -{ \ - sample = s16[0]; \ -} +#define NO_INTERPOLATION8 fSample = s8[0] * (1.0f / 128.0f); +#define NO_INTERPOLATION16 fSample = s16[0] * (1.0f / 32768.0f); -// linear interpolation +// 2-point linear interpolation -#define LINEAR_INTERPOLATION(smp1, smp2, frac) \ +#define LINEAR_INTERPOLATION(s, f, smpBits) \ { \ - const int32_t frac15 = (uint32_t)(frac) >> (SCOPE_FRAC_BITS-15); \ - const int32_t s1 = smp1, s2 = smp2; \ + const int32_t frac31 = (uint32_t)(f) >> (SCOPE_FRAC_BITS-31); \ + const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float p1 = s[0], p2 = s[1]; \ \ - sample = s1 + (((s2 - s1) * frac15) >> 15); \ + fSample = (p1 + ((p2 - p1) * x)) * (float)(1.0 / (1 << (smpBits-1))); \ } -#define LINEAR_INTERPOLATION8(frac) LINEAR_INTERPOLATION(s8[0] << 8, s8[1] << 8, frac) -#define LINEAR_INTERPOLATION16(frac) LINEAR_INTERPOLATION(s16[0], s16[1], frac) +#define LINEAR_INTERPOLATION8(f) LINEAR_INTERPOLATION(s8, f, 8) +#define LINEAR_INTERPOLATION16(f) LINEAR_INTERPOLATION(s16, f, 16) -/* 4-point cubic B-spline interpolation (32 phases with interpolation between them). -** The LUT has an extra inverted phase at the end for interpolation wrap-around. -*/ +// 4-point cubic B-spline interpolation -#define CUBIC_BSPLINE_INTERPOLATION(data, shift, frac) \ +#define CUBIC_BSPLINE_INTERPOLATION(s, f, smpBits) \ { \ - const uint32_t fracReduced = (uint32_t)(frac) >> (SCOPE_FRAC_BITS-INTRP_BITS); \ - const uint32_t phaseInt5 = fracReduced >> INTRP_PHASE_SHIFT; \ - const int32_t phaseFrac15 = fracReduced & INTRP_PHASE_MASK; \ - const int16_t *t = scopeIntrpLUT + (phaseInt5 << SCOPE_INTRP_WIDTH_BITS); \ - \ - const int32_t s1 = ((data[-1] * t[0]) + \ - ( data[0] * t[1]) + \ - ( data[1] * t[2]) + \ - ( data[2] * t[3])) >> (shift); \ + const int32_t frac31 = (uint32_t)(f) >> (SCOPE_FRAC_BITS-31); \ + const float x = (float)frac31 * (float)(1.0 / (INT32_MAX+1.0)); \ + const float p1 = s[-1], p2 = s[0], p3 = s[1], p4 = s[2]; \ \ - const int32_t s2 = ((data[-1] * t[SCOPE_INTRP_WIDTH+0]) + \ - ( data[0] * t[SCOPE_INTRP_WIDTH+1]) + \ - ( data[1] * t[SCOPE_INTRP_WIDTH+2]) + \ - ( data[2] * t[SCOPE_INTRP_WIDTH+3])) >> (shift); \ + const float a = ((p4 - p1) * (1.0f / 6.0f)) + ((p2 - p3) * (3.0f / 6.0f)); \ + const float b = ((p1 + p3) * (3.0f / 6.0f)) - p2; \ + const float c = (p3 - p1) * (3.0f / 6.0f); \ + const float d = ((p1 + p3) * (1.0f / 6.0f)) + (p2 * (4.0f / 6.0f)); \ \ - sample = s1 + (((s2 - s1) * phaseFrac15) >> INTRP_PHASE_SHIFT); \ + fSample = (((a * x + b) * x + c) * x + d) * (float)(1.0 / (1 << (smpBits-1))); \ } -#define CUBIC_BSPLINE_INTERPOLATION8(frac) CUBIC_BSPLINE_INTERPOLATION(s8, SCOPE_INTRP_SCALE_BITS-8, frac) -#define CUBIC_BSPLINE_INTERPOLATION16(frac) CUBIC_BSPLINE_INTERPOLATION(s16, SCOPE_INTRP_SCALE_BITS, frac) +#define CUBIC_BSPLINE_INTERPOLATION8(f) CUBIC_BSPLINE_INTERPOLATION(s8, f, 8) +#define CUBIC_BSPLINE_INTERPOLATION16(f) CUBIC_BSPLINE_INTERPOLATION(s16, f, 16) -#define CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, frac) \ -{ \ +#define CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, f) \ if (s->hasLooped && pos <= s->loopStart+MAX_LEFT_TAPS) \ s8 = s->leftEdgeTaps8 + (pos - s->loopStart); \ \ - CUBIC_BSPLINE_INTERPOLATION(s8, SCOPE_INTRP_SCALE_BITS-8, frac) \ -} \ + CUBIC_BSPLINE_INTERPOLATION(s8, f, 8) \ -#define CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, frac) \ -{ \ +#define CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, f) \ if (s->hasLooped && pos <= s->loopStart+MAX_LEFT_TAPS) \ s16 = s->leftEdgeTaps16 + (pos - s->loopStart); \ \ - CUBIC_BSPLINE_INTERPOLATION(s16, SCOPE_INTRP_SCALE_BITS, frac) \ -} \ + CUBIC_BSPLINE_INTERPOLATION(s16, f, 16) \ + +/* Note: +** floorf() is needed for proper negative rounding, or else +** the scopes will not look correct. +*/ -#define INTERPOLATE_SMP8(pos, frac) \ +#define INTERPOLATE_SMP8(pos, f) \ const int8_t *s8 = s->base8 + pos; \ if (config.interpolation == INTERPOLATION_DISABLED) \ NO_INTERPOLATION8 \ else if (config.interpolation == INTERPOLATION_LINEAR) \ - LINEAR_INTERPOLATION8(frac) \ + LINEAR_INTERPOLATION8(f) \ else \ - CUBIC_BSPLINE_INTERPOLATION8(frac) \ - sample = (sample * s->volume) >> (16+9); + CUBIC_BSPLINE_INTERPOLATION8(f) \ + sample = (int32_t)floorf(fSample * fVolume); -#define INTERPOLATE_SMP16(pos, frac) \ +#define INTERPOLATE_SMP16(pos, f) \ const int16_t *s16 = s->base16 + pos; \ if (config.interpolation == INTERPOLATION_DISABLED) \ NO_INTERPOLATION16 \ else if (config.interpolation == INTERPOLATION_LINEAR) \ - LINEAR_INTERPOLATION16(frac) \ + LINEAR_INTERPOLATION16(f) \ else \ - CUBIC_BSPLINE_INTERPOLATION16(frac) \ - sample = (sample * s->volume) >> (16+9); + CUBIC_BSPLINE_INTERPOLATION16(f) \ + sample = (int32_t)floorf(fSample * fVolume); -#define INTERPOLATE_SMP8_LOOP(pos, frac) \ +#define INTERPOLATE_SMP8_LOOP(pos, f) \ const int8_t *s8 = s->base8 + pos; \ if (config.interpolation == INTERPOLATION_DISABLED) \ NO_INTERPOLATION8 \ else if (config.interpolation == INTERPOLATION_LINEAR) \ - LINEAR_INTERPOLATION8(frac) \ + LINEAR_INTERPOLATION8(f) \ else \ - CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, frac) \ - sample = (sample * s->volume) >> (16+9); + CUBIC_BSPLINE_INTERPOLATION8_LOOP(pos, f) \ + sample = (int32_t)floorf(fSample * fVolume); -#define INTERPOLATE_SMP16_LOOP(pos, frac) \ +#define INTERPOLATE_SMP16_LOOP(pos, f) \ const int16_t *s16 = s->base16 + pos; \ if (config.interpolation == INTERPOLATION_DISABLED) \ NO_INTERPOLATION16 \ else if (config.interpolation == INTERPOLATION_LINEAR) \ - LINEAR_INTERPOLATION16(frac) \ + LINEAR_INTERPOLATION16(f) \ else \ - CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, frac) \ - sample = (sample * s->volume) >> (16+9); + CUBIC_BSPLINE_INTERPOLATION16_LOOP(pos, f) \ + sample = (int32_t)floorf(fSample * fVolume); #define SCOPE_GET_SMP8 \ if (s->active) \ - sample = (s->base8[position] * s->volume) >> (8+9); \ + { \ + fSample = s->base8[position] * (1.0f / 128.0f); \ + sample = (int32_t)floorf(fSample * fVolume); \ + } \ else \ - sample = 0; + { \ + sample = 0; \ + } #define SCOPE_GET_SMP16 \ if (s->active) \ - sample = (s->base16[position] * s->volume) >> (16+9); \ + { \ + fSample = s->base16[position] * (1.0f / 32768.0f); \ + sample = (int32_t)floorf(fSample * fVolume); \ + } \ else \ - sample = 0; + { \ + sample = 0; \ + } #define SCOPE_GET_SMP8_PINGPONG \ if (s->active) \ { \ GET_PINGPONG_POSITION \ - sample = (s->base8[actualPos] * s->volume) >> (8+9); \ + fSample = s->base8[actualPos] * (1.0f / 128.0f); \ + sample = (int32_t)floorf(fSample * fVolume); \ } \ else \ { \ @@ -166,7 +166,8 @@ if (s->active) \ { \ GET_PINGPONG_POSITION \ - sample = (s->base16[actualPos] * s->volume) >> (16+9); \ + fSample = s->base16[actualPos] * (1.0f / 32768.0f); \ + sample = (int32_t)floorf(fSample * fVolume); \ } \ else \ { \ @@ -247,7 +248,7 @@ positionFrac &= SCOPE_FRAC_MASK; #define SCOPE_DRAW_SMP \ - video.frameBuffer[((lineY - sample) * SCREEN_W) + x] = color; + video.frameBuffer[((lineY - sample) * SCREEN_W) + sx] = color; #define LINED_SCOPE_PREPARE_SMP8 \ SCOPE_GET_INTERPOLATED_SMP8 \ @@ -281,7 +282,7 @@ #define LINED_SCOPE_DRAW_SMP \ smpY2 = lineY - sample; \ - scopeLine(x, smpY1, smpY2, color); \ + scopeLine(sx, smpY1, smpY2, color); \ smpY1 = smpY2; #define SCOPE_HANDLE_POS_NO_LOOP \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scopedraw.c new/ft2-clone-2.28/src/scopes/ft2_scopedraw.c --- old/ft2-clone-2.27/src/scopes/ft2_scopedraw.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/scopes/ft2_scopedraw.c 2026-10-29 18:44:55.000000000 +0100 @@ -8,74 +8,17 @@ #include "ft2_scopedraw.h" #include "ft2_scope_macros.h" -/* 4-point cubic B-spline (no overshoot) interpolation LUT (32 phases). -** Used on the scopes when using quadratic/cubic/sinc mixing interpolation, -** together with linear interpolation between the phases in the LUT. -** -** ----------------- C code for making LUT (has unity gain) ---------------- -** #define SCALE 32768 -** #define PHASES 32 -** for (int32_t i = 0; i < PHASES; i++) -** { -** double t1 = i / (double)PHASES, t2 = t1 * t1, t3 = t2 * t1; -** double a = SCALE * ((1.0 - 3.0*t1 + 3.0*t2 - t3) / 6.0); -** double b = SCALE * ((4.0 - 6.0*t2 + 3.0*t3) / 6.0); -** double c = SCALE * ((1.0 + 3.0*t1 + 3.0*t2 - 3.0*t3) / 6.0); -** double d = SCALE * (t3 / 6.0); -** printf("%d, %d, %d, %d,\n", (int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d); -** } -** printf("%d, %d, %d, %d // inverted copy of first phase (for interpolation)\n", -** 0, (int32_t)(SCALE * (1.0 / 6.0)), (int32_t)(SCALE * (4.0 / 6.0)), -** (int32_t)(SCALE * (1.0 / 6.0))); -** ------------------------------------------------------------------------- */ -static const int16_t scopeIntrpLUT[SCOPE_INTRP_WIDTH * (SCOPE_INTRP_PHASES+1)] = -{ - 5461, 21845, 5461, 0, - 4965, 21813, 5988, 0, - 4500, 21721, 6545, 1, - 4064, 21570, 7127, 4, - 3658, 21365, 7733, 10, - 3280, 21107, 8358, 20, - 2929, 20801, 9001, 36, - 2604, 20448, 9657, 57, - 2304, 20053, 10325, 85, - 2027, 19617, 11000, 121, - 1774, 19145, 11681, 166, - 1543, 18638, 12363, 221, - 1333, 18101, 13045, 288, - 1143, 17535, 13722, 366, - 972, 16945, 14393, 457, - 818, 16332, 15053, 562, - 682, 15701, 15701, 682, - 562, 15053, 16332, 818, - 457, 14393, 16945, 972, - 366, 13722, 17535, 1143, - 288, 13045, 18101, 1333, - 221, 12363, 18638, 1543, - 166, 11681, 19145, 1774, - 121, 11000, 19617, 2027, - 85, 10325, 20053, 2304, - 57, 9657, 20448, 2604, - 36, 9001, 20801, 2929, - 20, 8358, 21107, 3280, - 10, 7733, 21365, 3658, - 4, 7127, 21570, 4064, - 1, 6545, 21721, 4500, - 0, 5988, 21813, 4965, - 0, 5461, 21845, 5461 // inverted copy of first phase (for interpolation) -}; - static void scopeLine(int32_t x1, int32_t y1, int32_t y2, const uint32_t color); /* ----------------------------------------------------------------------- */ /* NON-LINED SCOPE DRAWING ROUTINES */ /* ----------------------------------------------------------------------- */ -static void scopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawNoLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP8 SCOPE_DRAW_SMP @@ -84,11 +27,11 @@ } } -static void scopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP8 SCOPE_DRAW_SMP @@ -97,11 +40,11 @@ } } -static void scopeDrawPingpongLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawPingpongLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT_PINGPONG - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP8_PINGPONG SCOPE_DRAW_SMP @@ -110,11 +53,11 @@ } } -static void scopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawNoLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP16 SCOPE_DRAW_SMP @@ -123,11 +66,11 @@ } } -static void scopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP16 SCOPE_DRAW_SMP @@ -136,11 +79,11 @@ } } -static void scopeDrawPingpongLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void scopeDrawPingpongLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { SCOPE_INIT_PINGPONG - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_SMP16_PINGPONG SCOPE_DRAW_SMP @@ -153,13 +96,13 @@ /* LINED SCOPE DRAWING ROUTINES */ /* ----------------------------------------------------------------------- */ -static void linedScopeDrawNoLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawNoLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT LINED_SCOPE_PREPARE_SMP8 SCOPE_HANDLE_POS_NO_LOOP - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP8 LINED_SCOPE_DRAW_SMP @@ -168,13 +111,13 @@ } } -static void linedScopeDrawLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT LINED_SCOPE_PREPARE_SMP8_LOOP SCOPE_HANDLE_POS_LOOP - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP8_LOOP LINED_SCOPE_DRAW_SMP @@ -183,13 +126,13 @@ } } -static void linedScopeDrawPingpongLoop_8bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawPingpongLoop_8bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT_PINGPONG LINED_SCOPE_PREPARE_SMP8_PINGPONG SCOPE_HANDLE_POS_PINGPONG - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP8_PINGPONG LINED_SCOPE_DRAW_SMP @@ -198,13 +141,13 @@ } } -static void linedScopeDrawNoLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawNoLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT LINED_SCOPE_PREPARE_SMP16 SCOPE_HANDLE_POS_NO_LOOP - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP16 LINED_SCOPE_DRAW_SMP @@ -213,13 +156,13 @@ } } -static void linedScopeDrawLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT LINED_SCOPE_PREPARE_SMP16_LOOP SCOPE_HANDLE_POS_LOOP - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP16_LOOP LINED_SCOPE_DRAW_SMP @@ -228,13 +171,13 @@ } } -static void linedScopeDrawPingpongLoop_16bit(scope_t *s, uint32_t x, uint32_t lineY, uint32_t w) +static void linedScopeDrawPingpongLoop_16bit(scope_t *s, uint32_t sx, uint32_t lineY, uint32_t w) { LINED_SCOPE_INIT_PINGPONG LINED_SCOPE_PREPARE_SMP16_PINGPONG SCOPE_HANDLE_POS_PINGPONG - for (; x < width; x++) + for (; sx < width; sx++) { SCOPE_GET_INTERPOLATED_SMP16_PINGPONG LINED_SCOPE_DRAW_SMP diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/scopes/ft2_scopes.h new/ft2-clone-2.28/src/scopes/ft2_scopes.h --- old/ft2-clone-2.27/src/scopes/ft2_scopes.h 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/scopes/ft2_scopes.h 2026-10-29 18:44:55.000000000 +0100 @@ -17,16 +17,6 @@ #define SCOPE_FRAC_SCALE ((int64_t)1 << SCOPE_FRAC_BITS) #define SCOPE_FRAC_MASK (SCOPE_FRAC_SCALE-1) -#define SCOPE_INTRP_WIDTH 4 -#define SCOPE_INTRP_WIDTH_BITS 2 /* log2(SCOPE_INTRP_WIDTH) */ -#define SCOPE_INTRP_SCALE_BITS 15 -#define SCOPE_INTRP_PHASES 32 /* good enough */ -#define SCOPE_INTRP_PHASES_BITS 5 /* log2(SCOPE_INTRP_PHASES) */ - -#define INTRP_BITS (15+SCOPE_INTRP_PHASES_BITS) -#define INTRP_PHASE_SHIFT (INTRP_BITS-SCOPE_INTRP_PHASES_BITS) -#define INTRP_PHASE_MASK ((1 << INTRP_PHASE_SHIFT)-1) - int32_t getSamplePositionFromScopes(uint8_t ch); void stopAllScopes(void); void refreshScopes(void); @@ -43,8 +33,7 @@ const int16_t *base16; bool wasCleared, sample16Bit, samplingBackwards, hasLooped; uint8_t loopType; - int16_t volume; - int32_t loopStart, loopLength, loopEnd, sampleEnd, position; + int32_t volume, loopStart, loopLength, loopEnd, sampleEnd, position; uint64_t drawDelta; uint64_t delta, positionFrac; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_aiff.c new/ft2-clone-2.28/src/smploaders/ft2_load_aiff.c --- old/ft2-clone-2.27/src/smploaders/ft2_load_aiff.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/smploaders/ft2_load_aiff.c 2026-10-29 18:44:55.000000000 +0100 @@ -155,10 +155,7 @@ int16_t stereoAction = -1; if (aiffIsStereo(f)) - { stereoAction = loaderSysReq(4, "System request", "This is a stereo sample. Which channel do you want to read?", NULL); - setMouseBusy(true); // kludge - } // read sample data diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_flac.c new/ft2-clone-2.28/src/smploaders/ft2_load_flac.c --- old/ft2-clone-2.27/src/smploaders/ft2_load_flac.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/smploaders/ft2_load_flac.c 2026-10-29 18:44:55.000000000 +0100 @@ -191,10 +191,7 @@ stereoAction = -1; if (numChannels == 2) - { stereoAction = loaderSysReq(4, "System request", "This is a stereo sample. Which channel do you want to read?", NULL); - setMouseBusy(true); // kludge - } bool sample16Bit = (bitDepth >= 16); if (sample16Bit) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_mp3.c new/ft2-clone-2.28/src/smploaders/ft2_load_mp3.c --- old/ft2-clone-2.27/src/smploaders/ft2_load_mp3.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/smploaders/ft2_load_mp3.c 2026-10-29 18:44:55.000000000 +0100 @@ -103,10 +103,7 @@ int16_t stereoAction = -1; if (mp3IsStereo) - { stereoAction = loaderSysReq(4, "System request", "This is a stereo sample. Which channel do you want to read?", NULL); - setMouseBusy(true); // kludge - } if (fread(buf, 1, filesize, f) != filesize) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_ogg.c new/ft2-clone-2.28/src/smploaders/ft2_load_ogg.c --- old/ft2-clone-2.27/src/smploaders/ft2_load_ogg.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/smploaders/ft2_load_ogg.c 2026-10-29 18:44:55.000000000 +0100 @@ -106,10 +106,7 @@ int16_t stereoAction = -1; if (numChannels == 2) - { stereoAction = loaderSysReq(4, "System request", "This is a stereo sample. Which channel do you want to read?", NULL); - setMouseBusy(true); // kludge - } const int32_t shift = (numChannels == 2) ? 2 : 1; const int32_t bufferSamples = SAMPLE_BUFFER_SIZE >> shift; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ft2-clone-2.27/src/smploaders/ft2_load_wav.c new/ft2-clone-2.28/src/smploaders/ft2_load_wav.c --- old/ft2-clone-2.27/src/smploaders/ft2_load_wav.c 2026-10-25 15:23:06.000000000 +0100 +++ new/ft2-clone-2.28/src/smploaders/ft2_load_wav.c 2026-10-29 18:44:55.000000000 +0100 @@ -193,10 +193,7 @@ int16_t stereoAction = -1; if (wavIsStereo(f)) - { stereoAction = loaderSysReq(4, "System request", "This is a stereo sample. Which channel do you want to read?", NULL); - setMouseBusy(true); // kludge - } if (bitsPerSample == 8) // 8-BIT INTEGER SAMPLE {
