diff -Nru fasttracker2-0.1+b168/debian/changelog fasttracker2-1.00/debian/changelog --- fasttracker2-0.1+b168/debian/changelog 2019-09-06 09:44:12.000000000 +0000 +++ fasttracker2-1.00/debian/changelog 2019-10-01 07:32:45.000000000 +0000 @@ -1,3 +1,9 @@ +fasttracker2 (1.00-1) unstable; urgency=medium + + * New upstream version. (Closes: #922026) + + -- Gürkan Myczko Tue, 01 Oct 2019 09:32:45 +0200 + fasttracker2 (0.1+b168-1) unstable; urgency=medium * New upstream version. diff -Nru fasttracker2-0.1+b168/HOW-TO-COMPILE.txt fasttracker2-1.00/HOW-TO-COMPILE.txt --- fasttracker2-0.1+b168/HOW-TO-COMPILE.txt 2019-08-25 21:34:42.000000000 +0000 +++ fasttracker2-1.00/HOW-TO-COMPILE.txt 2019-09-25 17:43:52.000000000 +0000 @@ -45,5 +45,5 @@ https://www.libsdl.org/release/SDL2-2.0.10.dmg 3. Inside the package, copy SDL2.framework to /Library/Frameworks/ 4. Compile the FT2 clone: (folder: "ft2-clone-code"): - chmod +x make-os-x.sh (only needed once) - ./make-os-x.sh + chmod +x make-macos.sh (only needed once) + ./make-macos.sh diff -Nru fasttracker2-0.1+b168/make-macos.sh fasttracker2-1.00/make-macos.sh --- fasttracker2-0.1+b168/make-macos.sh 1970-01-01 00:00:00.000000000 +0000 +++ fasttracker2-1.00/make-macos.sh 2019-09-25 17:43:40.000000000 +0000 @@ -0,0 +1,17 @@ +#!/bin/bash + +arch=$(arch) +if [ $arch == "ppc" ]; then + echo Sorry, PowerPC \(PPC\) is not supported... +else + echo Compiling 64-bit binary, please wait patiently... + + rm release/macos/ft2-clone-macos.app/Contents/MacOS/ft2-clone-macos &> /dev/null + + clang -mmacosx-version-min=10.7 -arch x86_64 -mmmx -mfpmath=sse -msse2 -I/Library/Frameworks/SDL2.framework/Headers -F/Library/Frameworks -D__MACOSX_CORE__ -stdlib=libc++ src/rtmidi/*.cpp src/gfxdata/*.c src/*.c -O3 /usr/lib/libiconv.dylib -lm -Winit-self -Wno-deprecated -Wextra -Wunused -mno-ms-bitfields -Wno-missing-field-initializers -Wswitch-default -framework SDL2 -framework CoreMidi -framework CoreAudio -framework Cocoa -lpthread -lm -lstdc++ -o release/macos/ft2-clone-macos.app/Contents/MacOS/ft2-clone-macos + strip release/macos/ft2-clone-macos.app/Contents/MacOS/ft2-clone-macos + install_name_tool -change @rpath/SDL2.framework/Versions/A/SDL2 @executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2 release/macos/ft2-clone-macos.app/Contents/MacOS/ft2-clone-macos + + rm src/rtmidi/*.o src/gfxdata/*.o src/*.o &> /dev/null + echo Done! The executable is in the folder named \'release/macos\'. +fi diff -Nru fasttracker2-0.1+b168/make-os-x.sh fasttracker2-1.00/make-os-x.sh --- fasttracker2-0.1+b168/make-os-x.sh 2018-12-09 20:27:00.000000000 +0000 +++ fasttracker2-1.00/make-os-x.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -#!/bin/bash - -arch=$(arch) -if [ $arch == "ppc" ]; then - echo Sorry, PowerPC \(PPC\) is not supported... -else - echo Compiling 64-bit binary, please wait patiently... - - rm release/macos/ft2-clone.app/Contents/MacOS/ft2-osx &> /dev/null - - clang -mmacosx-version-min=10.7 -arch x86_64 -mmmx -mfpmath=sse -msse2 -I/Library/Frameworks/SDL2.framework/Headers -F/Library/Frameworks -D__MACOSX_CORE__ -stdlib=libc++ src/rtmidi/*.cpp src/gfxdata/*.c src/*.c -O3 /usr/lib/libiconv.dylib -lm -Winit-self -Wno-deprecated -Wextra -Wunused -mno-ms-bitfields -Wno-missing-field-initializers -Wswitch-default -framework SDL2 -framework CoreMidi -framework CoreAudio -framework Cocoa -lpthread -lm -lstdc++ -o release/macos/ft2-osx.app/Contents/MacOS/ft2-osx - strip release/macos/ft2-osx.app/Contents/MacOS/ft2-osx - install_name_tool -change @rpath/SDL2.framework/Versions/A/SDL2 @executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2 release/macos/ft2-osx.app/Contents/MacOS/ft2-osx - - rm src/rtmidi/*.o src/gfxdata/*.o src/*.o &> /dev/null - echo Done! The executable is in the folder named \'release/macos\'. -fi diff -Nru fasttracker2-0.1+b168/src/ft2_about.c fasttracker2-1.00/src/ft2_about.c --- fasttracker2-0.1+b168/src/ft2_about.c 2019-07-12 09:28:32.000000000 +0000 +++ fasttracker2-1.00/src/ft2_about.c 2019-09-25 13:43:04.000000000 +0000 @@ -46,7 +46,7 @@ randSeed = newseed; } -static inline int32_t random32(int32_t l) +static inline int32_t random32(int32_t l) /* Turbo Pascal Random() implementation */ { int32_t r; @@ -61,19 +61,23 @@ { int16_t sa, sb, sc, ca, cb, cc; - sa = sin32767[a.x >> 6]; sb = sin32767[a.y >> 6]; sc = sin32767[a.z >> 6]; - ca = cos32767[a.x >> 6]; cb = cos32767[a.y >> 6]; cc = cos32767[a.z >> 6]; + sa = sin32767[a.x >> 6]; + ca = cos32767[a.x >> 6]; + sb = sin32767[a.y >> 6]; + cb = cos32767[a.y >> 6]; + sc = sin32767[a.z >> 6]; + cc = cos32767[a.z >> 6]; mat->x.x = ((ca * cc) >> 16) + (((sc * ((sa * sb) >> 16)) >> 16) << 1); - mat->y.x = (sa * cb) >> 16; + mat->y.x = (sa * cb) >> 16; mat->z.x = (((cc * ((sa * sb) >> 16)) >> 16) << 1) - ((ca * sc) >> 16); mat->x.y = (((sc * ((ca * sb) >> 16)) >> 16) << 1) - ((sa * cc) >> 16); - mat->y.y = (ca * cb) >> 16; + mat->y.y = (ca * cb) >> 16; mat->z.y = ((sa * sc) >> 16) + (((cc * ((ca * sb) >> 16)) >> 16) << 1); mat->x.z = (cb * sc) >> 16; - mat->y.z = 0 - (sb >> 1); + mat->y.z = 0 - (sb >> 1); mat->z.z = (cb * cc) >> 16; } @@ -188,12 +192,12 @@ y = ((xy * star->x) >> 16) + ((yy * star->y) >> 16) + ((zy * star->z) >> 16); y = (int16_t)((y << 7) / z) + 84; - if ((uint16_t)y >= (173 - 6)) + if ((uint16_t)y >= 173-6) continue; x = ((xx * star->x) >> 16) + ((yx * star->y) >> 16) + ((zx * star->z) >> 16); - x = (int16_t)((((x >> 2) + x) << 7) / z) + (320 - 8); - if ((uint16_t)x >= (640 - 16)) + x = (int16_t)((((x >> 2) + x) << 7) / z) + (320-8); + if ((uint16_t)x >= 640-16) continue; // render star pixel if the pixel under it is the background @@ -212,19 +216,18 @@ void aboutFrame(void) { - star_a.x += (3 * 64); - star_a.y += (2 * 64); - star_a.z -= (1 * 64); + star_a.x += 3*64; + star_a.y += 2*64; + star_a.z -= 1*64; fixaMatris(star_a, &starmat); - realStars(); } void showAboutScreen(void) // called once when About screen is opened { const char *infoString = "Clone by Olav \"8bitbubsy\" S\025rensen - https://16-bits.org"; - char betaText[32]; + char verText[32]; uint16_t x, y; if (editor.ui.extended) @@ -241,13 +244,13 @@ blit(146, 113, aboutText, ABOUT_TEXT_W, ABOUT_TEXT_H); x = 5 + (SCREEN_W - textWidth(infoString)) / 2; - y = 151; + y = 147; textOut(x, y, PAL_FORGRND, infoString); - sprintf(betaText, "beta v.%d", BETA_VERSION); - x = (3 + ABOUT_SCREEN_W) - (textWidth(betaText) + 3); - y = (3 + ABOUT_SCREEN_H) - ((FONT1_CHAR_H - 2) + 2); - textOut(x, y, PAL_FORGRND, betaText); + sprintf(verText, "v%s (compiled on %s)", PROG_VER_STR, __DATE__); + x = ((3 + ABOUT_SCREEN_W) - textWidth(verText)) / 2; + y = (3 + ABOUT_SCREEN_H) - ((FONT1_CHAR_H - 2) + 3); + textOut(x, y, PAL_FORGRND, verText); aboutInit(); diff -Nru fasttracker2-0.1+b168/src/ft2_audio.c fasttracker2-1.00/src/ft2_audio.c --- fasttracker2-0.1+b168/src/ft2_audio.c 2019-08-01 10:09:38.000000000 +0000 +++ fasttracker2-1.00/src/ft2_audio.c 2019-09-25 14:42:54.000000000 +0000 @@ -1335,73 +1335,6 @@ freeAudioBuffers(); } -/* -void benchmarkAudioChannelMixer(void) // for development testing -{ -#define TICKS_TO_MIX 50000 - -#ifdef _WIN32 -#define DEBUG_MOD_FILENAME L"C:\\programming\\debug.xm" -#elif __APPLE__ -#define DEBUG_MOD_FILENAME "/users/olav/debug.xm" -#else -#define DEBUG_MOD_FILENAME "/home/olav/debug.xm" -#endif - - char str[128]; - uint8_t result, *buffer; - uint32_t maxSamplesPerTick, start, end; - - maxSamplesPerTick = ((config.audioFreq * 5) / 2) / MIN_BPM; - - buffer = (uint8_t *)malloc(maxSamplesPerTick * (2 * sizeof (int32_t))); - if (buffer == NULL) - { - editor.programRunning = false; - showErrorMsgBox("Out of memory!\n"); - return; - } - - result = loadMusicUnthreaded(DEBUG_MOD_FILENAME); - if (!result) - { - editor.programRunning = false; - showErrorMsgBox("Couldn't load debug module for mixer benchmarking!\n"); - return; - } - - pauseAudio(); - editor.wavIsRendering = true; - - setPos(0, 0); - playMode = PLAYMODE_SONG; - songPlaying = true; - - resetChannels(); - setNewAudioFreq(config.audioFreq); - setAudioAmp(config.boostLevel, config.masterVol, false); - - stopVoices(); - song.globVol = 64; - setSpeed(song.speed); - - start = SDL_GetTicks(); - for (uint32_t i = 0; i < TICKS_TO_MIX; i++) - dump_RenderTick(buffer); - end = SDL_GetTicks(); - - stopPlaying(); - resumeAudio(); - - free(buffer); - - sprintf(str, "It took approximately %dms to mix %d ticks.\nRun this test again to confirm.", end - start, TICKS_TO_MIX); - SDL_ShowSimpleMessageBox(0, "Channel mixer benchmark result", str, video.window); - - editor.programRunning = false; -} -*/ - const uint32_t panningTab[257] = // panning table from FT2 code { 0, 4096, 5793, 7094, 8192, 9159,10033,10837,11585,12288,12953,13585,14189,14768,15326,15864, diff -Nru fasttracker2-0.1+b168/src/ft2_audio.h fasttracker2-1.00/src/ft2_audio.h --- fasttracker2-0.1+b168/src/ft2_audio.h 2019-06-21 16:03:20.000000000 +0000 +++ fasttracker2-1.00/src/ft2_audio.h 2019-09-25 14:42:54.000000000 +0000 @@ -106,7 +106,6 @@ void mix_SaveIPVolumes(void); void mix_UpdateChannelVolPanFrq(void); uint32_t mixReplayerTickToBuffer(uint8_t *stream, uint8_t bitDepth); -//void benchmarkAudioChannelMixer(void); // for development testing extern pattSyncData_t *pattSyncEntry; extern chSyncData_t *chSyncEntry; diff -Nru fasttracker2-0.1+b168/src/ft2-clone.rc fasttracker2-1.00/src/ft2-clone.rc --- fasttracker2-0.1+b168/src/ft2-clone.rc 2019-03-16 21:34:26.000000000 +0000 +++ fasttracker2-1.00/src/ft2-clone.rc 2019-09-25 13:48:00.000000000 +0000 @@ -1,8 +1,8 @@ #include +#include "ft2_header.h" // PROG_VER_STR VS_VERSION_INFO VERSIONINFO -FILEVERSION 0,1,0,0 -PRODUCTVERSION 0,1,0,0 +FILEVERSION 1,0,0,0 FILETYPE VFT_APP BEGIN @@ -12,7 +12,7 @@ BEGIN VALUE "FileDescription", "Fasttracker II clone for Windows" VALUE "ProductName", "Fasttracker II clone" - VALUE "ProductVersion", "Beta" + VALUE "ProductVersion", PROG_VER_STR #ifdef _WIN64 VALUE "InternalName", "ft2-win64" VALUE "OriginalFilename", "ft2-win64.exe" diff -Nru fasttracker2-0.1+b168/src/ft2_header.h fasttracker2-1.00/src/ft2_header.h --- fasttracker2-0.1+b168/src/ft2_header.h 2019-09-04 13:03:38.000000000 +0000 +++ fasttracker2-1.00/src/ft2_header.h 2019-09-25 13:45:28.000000000 +0000 @@ -7,13 +7,12 @@ #ifdef _WIN32 #define WIN32_MEAN_AND_LEAN #include -#include // for intrinsics #else #include // PATH_MAX #endif #include "ft2_replayer.h" -#define BETA_VERSION 168 +#define PROG_VER_STR "1.00" // do NOT change these! It will only mess things up... diff -Nru fasttracker2-0.1+b168/src/ft2_keyboard.c fasttracker2-1.00/src/ft2_keyboard.c --- fasttracker2-0.1+b168/src/ft2_keyboard.c 2019-07-29 14:48:50.000000000 +0000 +++ fasttracker2-1.00/src/ft2_keyboard.c 2019-09-25 15:38:24.000000000 +0000 @@ -841,13 +841,21 @@ break; case SDLK_f: +#ifdef __APPLE__ + if (keyb.leftCommandPressed && keyb.leftCtrlPressed) + { + toggleFullScreen(); + return true; + } + else +#endif if (keyb.leftShiftPressed && keyb.leftCtrlPressed) { resetFPSCounter(); video.showFPSCounter ^= 1; if (!video.showFPSCounter) { - if (editor.ui.extended) // kludge, my best friend + if (editor.ui.extended) // Mr. Kludge, my only friend exitPatternEditorExtended(); showTopScreen(false); diff -Nru fasttracker2-0.1+b168/src/ft2_main.c fasttracker2-1.00/src/ft2_main.c --- fasttracker2-0.1+b168/src/ft2_main.c 2019-08-09 21:03:16.000000000 +0000 +++ fasttracker2-1.00/src/ft2_main.c 2019-09-25 17:12:00.000000000 +0000 @@ -118,6 +118,7 @@ showErrorMsgBox("Couldn't initialize SDL:\n%s", SDL_GetError()); return 1; } + SDL_EventState(SDL_DROPFILE, SDL_ENABLE); createSDL2Cursors(); @@ -188,15 +189,15 @@ resumeAudio(); rescanAudioDevices(); +#ifdef _WIN32 // on Windows we show the window at this point SDL_ShowWindow(video.window); +#endif if (config.windowFlags & START_IN_FULLSCR) { video.fullscreen = true; enterFullscreen(); } - //benchmarkAudioChannelMixer(); // for development testing - // 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) @@ -207,10 +208,9 @@ } SDL_DetachThread(initMidiThread); // don't wait for this thread, let it clean up when done - SDL_EventState(SDL_DROPFILE, SDL_ENABLE); - setupWaitVBL(); handleModuleLoadFromArg(argc, argv); + while (editor.programRunning) { beginFPSCounter(); diff -Nru fasttracker2-0.1+b168/src/ft2_module_loader.c fasttracker2-1.00/src/ft2_module_loader.c --- fasttracker2-0.1+b168/src/ft2_module_loader.c 2019-08-03 13:36:28.000000000 +0000 +++ fasttracker2-1.00/src/ft2_module_loader.c 2019-09-25 15:05:00.000000000 +0000 @@ -1013,7 +1013,7 @@ if (songTmp.songTab[i] != 254) songTmp.songTab[j++] = songTmp.songTab[i]; else - ++k; + k++; } if (k <= songTmp.len) @@ -1846,31 +1846,6 @@ SDL_DetachThread(thread); } -/* -bool loadMusicUnthreaded(UNICHAR *filenameU) // for development testing -{ - if (editor.tmpFilenameU == NULL) - return false; - - // clear deprecated pointers from possible last loading session (super important) - memset(pattTmp, 0, sizeof (pattTmp)); - memset(instrTmp, 0, sizeof (instrTmp)); - - UNICHAR_STRCPY(editor.tmpFilenameU, filenameU); - - loadMusicThread(NULL); - editor.loadMusicEvent = EVENT_NONE; - - if (moduleLoaded) - { - setupLoadedModule(); - return true; - } - - return false; -} -*/ - static void freeTmpModule(void) { uint16_t i; diff -Nru fasttracker2-0.1+b168/src/ft2_module_loader.h fasttracker2-1.00/src/ft2_module_loader.h --- fasttracker2-0.1+b168/src/ft2_module_loader.h 2019-06-21 16:03:20.000000000 +0000 +++ fasttracker2-1.00/src/ft2_module_loader.h 2019-09-25 14:42:54.000000000 +0000 @@ -5,7 +5,6 @@ #include "ft2_unicode.h" void loadMusic(UNICHAR *filenameU); -//bool loadMusicUnthreaded(UNICHAR *filenameU); // for development testing bool handleModuleLoadFromArg(int argc, char **argv); void loadDroppedFile(char *fullPathUTF8, bool songModifiedCheck); void handleLoadMusicEvents(void); diff -Nru fasttracker2-0.1+b168/src/ft2_scopes.c fasttracker2-1.00/src/ft2_scopes.c --- fasttracker2-0.1+b168/src/ft2_scopes.c 2019-08-01 10:53:50.000000000 +0000 +++ fasttracker2-1.00/src/ft2_scopes.c 2019-09-25 12:42:24.000000000 +0000 @@ -208,9 +208,8 @@ static void redrawScope(int16_t ch) { uint8_t chansPerRow; - int16_t i, chanLookup, scopeLen, muteGfxLen, muteGfxX; const uint16_t *scopeLens; - uint16_t x, y; + uint16_t x, y, i, chanLookup, scopeLen, muteGfxLen, muteGfxX; chansPerRow = song.antChn / 2; chanLookup = chansPerRow - 1; @@ -455,59 +454,48 @@ // scope position update tempState.SPosDec += tempState.SFrq; - if (tempState.SPosDec >= 65536) - { - tempState.SPos += ((tempState.SPosDec >> 16) ^ tempState.posXOR); - tempState.SPosDec &= 0xFFFF; + tempState.SPos += ((tempState.SPosDec >> 16) ^ tempState.posXOR); + tempState.SPosDec &= 0xFFFF; - // handle loop wrapping or sample end + // handle loop wrapping or sample end - if (tempState.posXOR == 0xFFFFFFFF) // sampling backwards (definitely pingpong loop) - { - if (tempState.SPos < tempState.SRepS) - { - tempState.posXOR = 0; // change direction to forwards + if (tempState.posXOR == 0xFFFFFFFF && tempState.SPos < tempState.SRepS) // sampling backwards (definitely pingpong loop) + { + tempState.posXOR = 0; // change direction to forwards - if (tempState.SRepL < 2) - tempState.SPos = tempState.SRepS; - else - tempState.SPos = tempState.SRepS + ((tempState.SRepS - tempState.SPos - 1) % tempState.SRepL); + if (tempState.SRepL < 2) + tempState.SPos = tempState.SRepS; + else + tempState.SPos = tempState.SRepS + ((tempState.SRepS - tempState.SPos - 1) % tempState.SRepL); - assert(tempState.SPos >= tempState.SRepS && tempState.SPos < tempState.SLen); - } + assert(tempState.SPos >= tempState.SRepS && tempState.SPos < tempState.SLen); + } + else if (tempState.SPos >= tempState.SLen) + { + if (tempState.SRepL < 2) + loopOverflowVal = 0; + else + loopOverflowVal = (tempState.SPos - tempState.SLen) % tempState.SRepL; + + if (tempState.loopType == LOOP_NONE) + { + tempState.active = false; } - else if (tempState.loopType == LOOP_NONE) // no loop + else if (tempState.loopType == LOOP_FORWARD) { - if (tempState.SPos >= tempState.SLen) - { - tempState.SPos = tempState.SLen - 1; - tempState.active = false; - } + tempState.SPos = tempState.SRepS + loopOverflowVal; + assert(tempState.SPos >= tempState.SRepS && tempState.SPos < tempState.SLen); } - else if (tempState.SPos >= tempState.SLen) // forward or pingpong loop + else // pingpong loop { - if (tempState.SRepL < 2) - loopOverflowVal = 0; - else - loopOverflowVal = (tempState.SPos - tempState.SLen) % tempState.SRepL; - - if (tempState.loopType == LOOP_PINGPONG) - { - tempState.posXOR = 0xFFFFFFFF; // change direction to backwards - tempState.SPos = (tempState.SLen - 1) - loopOverflowVal; - } - else // forward loop - { - tempState.SPos = tempState.SRepS + loopOverflowVal; - } - + tempState.posXOR = 0xFFFFFFFF; // change direction to backwards + tempState.SPos = (tempState.SLen - 1) - loopOverflowVal; assert(tempState.SPos >= tempState.SRepS && tempState.SPos < tempState.SLen); } - - assert(tempState.SPos >= 0 && tempState.SPos < tempState.SLen); - - *sc = tempState; // update it } + assert(tempState.SPos >= 0); + + *sc = tempState; // update scope state } scopesUpdatingFlag = false; } @@ -575,52 +563,47 @@ return (int8_t)((sc->sampleData16[drawPos] * sc->SVol) >> 16); } -#define SCOPE_UPDATE_POS \ +#define SCOPE_UPDATE_DRAWPOS \ scopeDrawFrac += s.SFrq >> 6; \ - if (scopeDrawFrac >= 65536) \ + scopeDrawPos += ((scopeDrawFrac >> 16) ^ drawPosXOR); \ + scopeDrawFrac &= 0xFFFF; \ + \ + if (drawPosXOR == 0xFFFFFFFF && scopeDrawPos < s.SRepS) /* sampling backwards (definitely pingpong loop) */ \ { \ - scopeDrawPos += (int32_t)((scopeDrawFrac >> 16) ^ drawPosXOR); \ - scopeDrawFrac &= 0xFFFF; \ + drawPosXOR = 0; /* change direction to forwards */ \ + \ + if (s.SRepL < 2) \ + scopeDrawPos = s.SRepS; \ + else \ + scopeDrawPos = s.SRepS + ((s.SRepS - scopeDrawPos - 1) % s.SRepL); \ + \ + assert(scopeDrawPos >= s.SRepS && scopeDrawPos < s.SLen); \ + } \ + else if (scopeDrawPos >= s.SLen) \ + { \ + if (s.SRepL < 2) \ + loopOverflowVal = 0; \ + else \ + loopOverflowVal = (scopeDrawPos - s.SLen) % s.SRepL; \ \ if (s.loopType == LOOP_NONE) \ { \ - if (scopeDrawPos >= s.SLen) \ - s.active = false; \ + s.active = false; \ } \ - else if (drawPosXOR == 0xFFFFFFFF) /* sampling backwards (definitely pingpong loop) */ \ + else if (s.loopType == LOOP_FORWARD) \ { \ - if (scopeDrawPos < s.SRepS) \ - { \ - drawPosXOR = 0; /* change direction to forwards */ \ - \ - if (s.SRepL < 2) \ - scopeDrawPos = s.SRepS; \ - else \ - scopeDrawPos = s.SRepS + ((s.SRepS - scopeDrawPos - 1) % s.SRepL); \ - \ - assert(scopeDrawPos >= s.SRepS && scopeDrawPos < s.SLen); \ - } \ + scopeDrawPos = s.SRepS + loopOverflowVal; \ + assert(scopeDrawPos >= s.SRepS && scopeDrawPos < s.SLen); \ } \ - else if (scopeDrawPos >= s.SLen) /* forward or pingpong loop */ \ + else /* pingpong loop */ \ { \ - if (s.SRepL < 2) \ - loopOverflowVal = 0; \ - else \ - loopOverflowVal = (scopeDrawPos - s.SLen) % s.SRepL; \ - \ - if (s.loopType == LOOP_PINGPONG) \ - { \ - drawPosXOR = 0xFFFFFFFF; /* change direction to backwards */ \ - scopeDrawPos = (s.SLen - 1) - loopOverflowVal; \ - } \ - else /* forward loop */ \ - { \ - scopeDrawPos = s.SRepS + loopOverflowVal; \ - } \ - \ + drawPosXOR = 0xFFFFFFFF; /* change direction to backwards */ \ + scopeDrawPos = (s.SLen - 1) - loopOverflowVal; \ assert(scopeDrawPos >= s.SRepS && scopeDrawPos < s.SLen); \ } \ + \ } \ + assert(scopeDrawPos >= 0); \ void drawScopes(void) { @@ -642,7 +625,7 @@ for (int16_t i = 0; i < song.antChn; i++) { - // if we reached the last channel on the row, go to bottom left + // if we reached the last scope on the row, go to first scope on the next row if (i == chansPerRow) { scopeXOffs = 3; @@ -652,122 +635,123 @@ scopeDrawLen = scopeLens[i]; - if (editor.chnMode[i]) + if (!editor.chnMode[i]) // scope muted (mute graphics blit()'ed elsewhere) { - s = scope[i]; // cache scope to lower thread race condition issues + scopeXOffs += scopeDrawLen + 3; // align x to next scope + continue; + } - if (s.active && s.SVol > 0 && !audio.locked) - { - // scope is active + s = scope[i]; // cache scope to lower thread race condition issues + if (s.active && s.SVol > 0 && !audio.locked) + { + // scope is active - scope[i].wasCleared = false; + scope[i].wasCleared = false; - // clear scope background - clearRect(scopeXOffs, scopeYOffs, scopeDrawLen, SCOPE_DATA_HEIGHT); - - scopeDrawPos = s.SPos; - scopeDrawFrac = 0; - drawPosXOR = s.posXOR; + // clear scope background + clearRect(scopeXOffs, scopeYOffs, scopeDrawLen, SCOPE_DATA_HEIGHT); - // draw current scope - if (config.specialFlags & LINED_SCOPES) - { - // LINE SCOPE + scopeDrawPos = s.SPos; + scopeDrawFrac = 0; + drawPosXOR = s.posXOR; - if (s.sample16Bit) - { - y1 = scopeLineY - getScaledScopeSample16(&s, scopeDrawPos); - SCOPE_UPDATE_POS + // draw current scope + if (config.specialFlags & LINED_SCOPES) + { + // LINE SCOPE - x16 = scopeXOffs; - len = scopeXOffs + (scopeDrawLen - 1); + if (s.sample16Bit) + { + y1 = scopeLineY - getScaledScopeSample16(&s, scopeDrawPos); + SCOPE_UPDATE_DRAWPOS - for (; x16 < len; x16++) - { - y2 = scopeLineY - getScaledScopeSample16(&s, scopeDrawPos); - scopeLine(x16, y1, y2); - y1 = y2; + x16 = scopeXOffs; + len = scopeXOffs + (scopeDrawLen - 1); - SCOPE_UPDATE_POS - } - } - else + for (; x16 < len; x16++) { - y1 = scopeLineY - getScaledScopeSample8(&s, scopeDrawPos); - SCOPE_UPDATE_POS - - x16 = scopeXOffs; - len = scopeXOffs + (scopeDrawLen - 1); - - for (; x16 < len; x16++) - { - y2 = scopeLineY - getScaledScopeSample8(&s, scopeDrawPos); - scopeLine(x16, y1, y2); - y1 = y2; + y2 = scopeLineY - getScaledScopeSample16(&s, scopeDrawPos); + scopeLine(x16, y1, y2); + y1 = y2; - SCOPE_UPDATE_POS - } + SCOPE_UPDATE_DRAWPOS } } else { - // PIXEL SCOPE + y1 = scopeLineY - getScaledScopeSample8(&s, scopeDrawPos); + SCOPE_UPDATE_DRAWPOS - scopePixelColor = video.palette[PAL_PATTEXT]; + x16 = scopeXOffs; + len = scopeXOffs + (scopeDrawLen - 1); - x = scopeXOffs; - len = scopeXOffs + scopeDrawLen; - - if (s.sample16Bit) - { - for (; x < len; x++) - { - sample = getScaledScopeSample16(&s, scopeDrawPos); - video.frameBuffer[((scopeLineY - sample) * SCREEN_W) + x] = scopePixelColor; - - SCOPE_UPDATE_POS - } - } - else + for (; x16 < len; x16++) { - for (; x < len; x++) - { - sample = getScaledScopeSample8(&s, scopeDrawPos); - video.frameBuffer[((scopeLineY - sample) * SCREEN_W) + x] = scopePixelColor; + y2 = scopeLineY - getScaledScopeSample8(&s, scopeDrawPos); + scopeLine(x16, y1, y2); + y1 = y2; - SCOPE_UPDATE_POS - } + SCOPE_UPDATE_DRAWPOS } } } else { - // scope is inactive + // PIXEL SCOPE - sc = &scope[i]; - if (!sc->wasCleared) + scopePixelColor = video.palette[PAL_PATTEXT]; + + x = scopeXOffs; + len = scopeXOffs + scopeDrawLen; + + if (s.sample16Bit) { - // clear scope background - clearRect(scopeXOffs, scopeYOffs, scopeDrawLen, SCOPE_DATA_HEIGHT); + for (; x < len; x++) + { + sample = getScaledScopeSample16(&s, scopeDrawPos); + video.frameBuffer[((scopeLineY - sample) * SCREEN_W) + x] = scopePixelColor; - // draw empty line - hLine(scopeXOffs, scopeLineY, scopeDrawLen, PAL_PATTEXT); + SCOPE_UPDATE_DRAWPOS + } + } + else + { + for (; x < len; x++) + { + sample = getScaledScopeSample8(&s, scopeDrawPos); + video.frameBuffer[((scopeLineY - sample) * SCREEN_W) + x] = scopePixelColor; - sc->wasCleared = true; + SCOPE_UPDATE_DRAWPOS + } } } + } + else + { + // scope is inactive - // draw channel numbering (if enabled) - if (config.ptnChnNumbers) - drawScopeNumber(scopeXOffs, scopeYOffs, (uint8_t)i, false); + sc = &scope[i]; + if (!sc->wasCleared) + { + // clear scope background + clearRect(scopeXOffs, scopeYOffs, scopeDrawLen, SCOPE_DATA_HEIGHT); + + // draw empty line + hLine(scopeXOffs, scopeLineY, scopeDrawLen, PAL_PATTEXT); - // draw rec. symbol (if enabled) - if (config.multiRecChn[i]) - blit(scopeXOffs, scopeYOffs + 31, scopeRecBMP, 13, 4); + sc->wasCleared = true; + } } - // align x to next scope - scopeXOffs += scopeDrawLen + 3; + // draw channel numbering (if enabled) + if (config.ptnChnNumbers) + drawScopeNumber(scopeXOffs, scopeYOffs, (uint8_t)i, false); + + // draw rec. symbol (if enabled) + if (config.multiRecChn[i]) + blit(scopeXOffs, scopeYOffs + 31, scopeRecBMP, 13, 4); + + scopeXOffs += scopeDrawLen + 3; // align x to next scope } scopesDisplayingFlag = false; diff -Nru fasttracker2-0.1+b168/src/ft2_video.c fasttracker2-1.00/src/ft2_video.c --- fasttracker2-0.1+b168/src/ft2_video.c 2019-08-05 12:43:14.000000000 +0000 +++ fasttracker2-1.00/src/ft2_video.c 2019-09-25 17:12:26.000000000 +0000 @@ -819,16 +819,16 @@ if (songTitle != NULL) { if (song.isModified) - sprintf(wndTitle, "Fasttracker II clone (beta #%d) - \"%s\" (unsaved)", BETA_VERSION, songTitle); + sprintf(wndTitle, "Fasttracker II clone v%s - \"%s\" (unsaved)", PROG_VER_STR, songTitle); else - sprintf(wndTitle, "Fasttracker II clone (beta #%d) - \"%s\"", BETA_VERSION, songTitle); + sprintf(wndTitle, "Fasttracker II clone v%s - \"%s\"", PROG_VER_STR, songTitle); } else { if (song.isModified) - sprintf(wndTitle, "Fasttracker II clone (beta #%d) - \"untitled\" (unsaved)", BETA_VERSION); + sprintf(wndTitle, "Fasttracker II clone v%s - \"untitled\" (unsaved)", PROG_VER_STR); else - sprintf(wndTitle, "Fasttracker II clone (beta #%d) - \"untitled\"", BETA_VERSION); + sprintf(wndTitle, "Fasttracker II clone v%s - \"untitled\"", PROG_VER_STR); } SDL_SetWindowTitle(video.window, wndTitle); @@ -865,7 +865,11 @@ SDL_DisplayMode dm; video.vsync60HzPresent = false; - windowFlags = SDL_WINDOW_HIDDEN | SDL_WINDOW_ALLOW_HIGHDPI; + + windowFlags = SDL_WINDOW_ALLOW_HIGHDPI; +#if defined (__APPLE__) || defined (_WIN32) // yet another quirk! + windowFlags |= SDL_WINDOW_HIDDEN; +#endif setWindowSizeFromConfig(false); @@ -892,8 +896,12 @@ return false; } - updateWindowTitle(true); +#ifdef __APPLE__ // for macOS we need to do this here for reasons I can't be bothered to explain + SDL_PumpEvents(); + SDL_ShowWindow(video.window); +#endif + updateWindowTitle(true); return true; }