From df3ae122781de9f5d4bfd4767fb7ca20d4de24bc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 17 Jan 2022 21:08:14 -0500 Subject: [PATCH] fix furnace for 32-bit --- .gitignore | 1 + CMakeLists.txt | 3 +- demos/README.md | 5 ++++ scripts/release-win32.sh | 31 ++++++++++++++++++++ scripts/{release-win.sh => release-win64.sh} | 0 src/engine/playback.cpp | 14 +++++---- src/gui/gui.cpp | 3 +- src/main.cpp | 3 +- 8 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 demos/README.md create mode 100755 scripts/release-win32.sh rename scripts/{release-win.sh => release-win64.sh} (100%) diff --git a/.gitignore b/.gitignore index b007b848..d5c51858 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build/ release/ t/ winbuild/ +win32build/ macbuild/ linuxbuild/ *.swp diff --git a/CMakeLists.txt b/CMakeLists.txt index dfa12325..80026f41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,10 +27,11 @@ include_directories(extern/zlib ${CMAKE_CURRENT_BINARY_DIR}/extern/zlib) if (WIN32) set(SDL_SHARED OFF) + set(SDL_STATIC ON) add_subdirectory(extern/SDL) set(HAVE_SDL2 SDL2-static) set(HAVE_Z zlibstatic) - include_directories(extern/imgui extern/IconFontCppHeaders extern/imgui/backends extern/igfd extern/fmt/include) + include_directories(extern/SDL/include extern/imgui extern/IconFontCppHeaders extern/imgui/backends extern/igfd extern/fmt/include) else() if (BUILD_GUI) set(SDL_SHARED ON) diff --git a/demos/README.md b/demos/README.md new file mode 100644 index 00000000..325e6d00 --- /dev/null +++ b/demos/README.md @@ -0,0 +1,5 @@ +# demos + +demo songs for Furnace. + +these demo songs are not under the GPL. in the case of covers, all rights are reserved to the original author. diff --git a/scripts/release-win32.sh b/scripts/release-win32.sh new file mode 100755 index 00000000..b37b9e59 --- /dev/null +++ b/scripts/release-win32.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# make Windows release +# this script shall be run from Linux with MinGW installed! + +if [ ! -e /tmp/furnace ]; then + ln -s "$PWD" /tmp/furnace || exit 1 +fi + +cd /tmp/furnace + +if [ ! -e win32build ]; then + mkdir win32build || exit 1 +fi + +cd win32build + +i686-w64-mingw32-cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-O2" -DCMAKE_CXX_FLAGS="-O2 -Wall -Wextra -Wno-unused-parameter -Werror" -DBUILD_SHARED_LIBS=OFF .. || exit 1 +make -j8 || exit 1 +i686-w64-mingw32-strip -s furnace.exe || exit 1 + +cd .. + +mkdir -p release/win32 || exit 1 +cd release/win32 + +cp ../../LICENSE LICENSE.txt || exit 1 +cp ../../win32build/furnace.exe . || exit 1 +cp ../../README.md README.txt || exit 1 +cp -r ../../papers papers || exit 1 + +zip -r furnace.zip LICENSE.txt furnace.exe README.txt papers diff --git a/scripts/release-win.sh b/scripts/release-win64.sh similarity index 100% rename from scripts/release-win.sh rename to scripts/release-win64.sh diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 40559370..b89e60b3 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -5,6 +5,8 @@ #include #include +constexpr int MASTER_CLOCK_PREC=(sizeof(void*)==8)?8:0; + void DivEngine::nextOrder() { curRow=0; if (repeatPattern) return; @@ -557,7 +559,7 @@ void DivEngine::processRow(int i, bool afterDelay) { case 0xc0: case 0xc1: case 0xc2: case 0xc3: // set Hz divider=((effect&0x3)<<8)|effectVal; if (divider<10) divider=10; - cycles=((int)(got.rate)<<8)/divider; + cycles=((int)(got.rate)<=divider) { clockDrift-=divider; cycles++; @@ -941,7 +943,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi memset(metroTick,0,size); int attempts=0; - int runLeftG=size<<8; + int runLeftG=size<>8); + unsigned int realPos=size-(runLeftG>>MASTER_CLOCK_PREC); if (realPos>=size) realPos=size-1; if (song.hilightA>0) { if ((curRow%song.hilightA)==0 && ticks==1) metroTick[realPos]=1; @@ -967,7 +969,7 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi // 3. tick the clock and fill buffers as needed if (cycles #include #include #include @@ -2900,7 +2901,7 @@ int FurnaceGUI::load(String path) { return 1; } ssize_t len=ftell(f); - if (len==0x7fffffffffffffff) { + if (len==(SIZE_MAX>>1)) { perror("could not get file length"); lastError=fmt::sprintf("on pre tell: %s",strerror(errno)); fclose(f); diff --git a/src/main.cpp b/src/main.cpp index 1dcaea78..58a039fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "ta-log.h" #include "engine/engine.h" @@ -259,7 +260,7 @@ int main(int argc, char** argv) { return 1; } ssize_t len=ftell(f); - if (len==0x7fffffffffffffff) { + if (len==(SIZE_MAX>>1)) { perror("could not get file length"); fclose(f); return 1;