Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fluidsynth for openSUSE:Factory checked in at 2026-02-27 17:02:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fluidsynth (Old) and /work/SRC/openSUSE:Factory/.fluidsynth.new.29461 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fluidsynth" Fri Feb 27 17:02:29 2026 rev:87 rq:1335003 version:2.5.3 Changes: -------- --- /work/SRC/openSUSE:Factory/fluidsynth/fluidsynth.changes 2026-02-07 15:33:42.210063606 +0100 +++ /work/SRC/openSUSE:Factory/.fluidsynth.new.29461/fluidsynth.changes 2026-02-27 17:04:40.687112132 +0100 @@ -1,0 +2,9 @@ +Tue Feb 24 19:14:21 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 2.5.3 + * Several minor fixes for the CMake buildsystem (#1742). + * Several documentation updates (#1745, #1736). + * Fix a build issue when fluidsynth is consumed as part of a + bigger CMake project (#1752). + +------------------------------------------------------------------- Old: ---- fluidsynth-2.5.2.tar.gz New: ---- fluidsynth-2.5.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fluidsynth.spec ++++++ --- /var/tmp/diff_new_pack.L0Il3g/_old 2026-02-27 17:04:41.295137290 +0100 +++ /var/tmp/diff_new_pack.L0Il3g/_new 2026-02-27 17:04:41.295137290 +0100 @@ -20,7 +20,7 @@ %define sover 3 Name: fluidsynth -Version: 2.5.2 +Version: 2.5.3 Release: 0 Summary: A Real-Time Software Synthesizer That Uses Soundfont(tm) License: LGPL-2.1-or-later ++++++ fluidsynth-2.5.2.tar.gz -> fluidsynth-2.5.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.azure/azure-pipelines-alpine.yml new/fluidsynth-2.5.3/.azure/azure-pipelines-alpine.yml --- old/fluidsynth-2.5.2/.azure/azure-pipelines-alpine.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.azure/azure-pipelines-alpine.yml 2026-02-21 12:49:48.000000000 +0100 @@ -10,8 +10,7 @@ - '.azure/azure-pipelines-vcpkg.yml' - '.azure/azure-pipelines-win.yml' - '.circleci/config.yml' - - '.github/workflows/linux.yml' - - '.github/workflows/sonarcloud.yml' + - '.github/workflows/*' - '.cirrus.yml' - 'README.md' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.azure/azure-pipelines-android.yml new/fluidsynth-2.5.3/.azure/azure-pipelines-android.yml --- old/fluidsynth-2.5.2/.azure/azure-pipelines-android.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.azure/azure-pipelines-android.yml 2026-02-21 12:49:48.000000000 +0100 @@ -10,8 +10,7 @@ - '.azure/azure-pipelines-win.yml' - '.azure/Dockerfile.azure-alpine' - '.circleci/config.yml' - - '.github/workflows/linux.yml' - - '.github/workflows/sonarcloud.yml' + - '.github/workflows/*' - '.cirrus.yml' - 'README.md' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.azure/azure-pipelines-mac.yml new/fluidsynth-2.5.3/.azure/azure-pipelines-mac.yml --- old/fluidsynth-2.5.2/.azure/azure-pipelines-mac.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.azure/azure-pipelines-mac.yml 2026-02-21 12:49:48.000000000 +0100 @@ -11,8 +11,7 @@ - '.azure/azure-pipelines-win.yml' - '.azure/Dockerfile.azure-alpine' - '.circleci/config.yml' - - '.github/workflows/linux.yml' - - '.github/workflows/sonarcloud.yml' + - '.github/workflows/*' - '.cirrus.yml' - 'README.md' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.azure/azure-pipelines-vcpkg.yml new/fluidsynth-2.5.3/.azure/azure-pipelines-vcpkg.yml --- old/fluidsynth-2.5.2/.azure/azure-pipelines-vcpkg.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.azure/azure-pipelines-vcpkg.yml 2026-02-21 12:49:48.000000000 +0100 @@ -11,8 +11,7 @@ - '.azure/azure-pipelines-win.yml' - '.azure/Dockerfile.azure-alpine' - '.circleci/config.yml' - - '.github/workflows/linux.yml' - - '.github/workflows/sonarcloud.yml' + - '.github/workflows/*' - '.cirrus.yml' - 'README.md' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.gitattributes new/fluidsynth-2.5.3/.gitattributes --- old/fluidsynth-2.5.2/.gitattributes 1970-01-01 01:00:00.000000000 +0100 +++ new/fluidsynth-2.5.3/.gitattributes 2026-02-21 12:49:48.000000000 +0100 @@ -0,0 +1,7 @@ +# Ensure binary files are not modified by line ending conversion +*.sf2 binary +*.sf3 binary +*.dls binary +*.mid binary +*.midi binary +*.wav binary diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.github/workflows/solaris.yml new/fluidsynth-2.5.3/.github/workflows/solaris.yml --- old/fluidsynth-2.5.2/.github/workflows/solaris.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.github/workflows/solaris.yml 2026-02-21 12:49:48.000000000 +0100 @@ -34,7 +34,7 @@ submodules: true - name: Build & test - uses: vmactions/[email protected] + uses: vmactions/[email protected] with: envs: 'CFLAGS_SOLARIS_CC' usesh: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.github/workflows/sonarcloud.yml new/fluidsynth-2.5.3/.github/workflows/sonarcloud.yml --- old/fluidsynth-2.5.2/.github/workflows/sonarcloud.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.github/workflows/sonarcloud.yml 2026-02-21 12:49:48.000000000 +0100 @@ -4,6 +4,7 @@ push: branches: - master + - release/** paths-ignore: - '.azure/**' - '.circleci/**' @@ -25,7 +26,7 @@ name: SonarCloud Workflow jobs: sonarcloud: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 with: @@ -33,11 +34,6 @@ fetch-depth: 0 submodules: recursive - - - name: Add apt-get repositories - run: | - sudo add-apt-repository ppa:ubuntu-toolchain-r/test - - name: Update apt run: sudo apt-get update -y @@ -51,24 +47,14 @@ cmake -E make_directory ${{github.workspace}}/build echo $PATH - - name: Get Sonar Build Wrapper - shell: bash - working-directory: ${{github.workspace}}/build - run: | - set -ex - wget https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip - unzip build-wrapper-linux-x86.zip - mv build-wrapper-linux-x86/* . - + - name: Install Build Wrapper + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v7 + - name: Configure CMake # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash - working-directory: ${{github.workspace}}/build - run: cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -Werror=dev -Denable-portaudio=1 -Denable-ladspa=1 -Denable-coverage=1 -DNO_GUI=1 $GITHUB_WORKSPACE - - - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v2 + run: cmake -S . -B build -DCMAKE_BUILD_TYPE=$BUILD_TYPE -Werror=dev -Denable-portaudio=1 -Denable-ladspa=1 -Denable-coverage=1 -DNO_GUI=1 $GITHUB_WORKSPACE - name: Build working-directory: ${{github.workspace}}/build @@ -89,16 +75,12 @@ run: | rm -rf ${{ github.workspace }}/sf2 gcovr --version - gcovr --help - ls -la ${{ github.workspace }} - ls -la ${{ github.workspace }}/build - ls -la ${{ github.workspace }}/build/coverage - - name: Run sonar-scanner + - name: SonarQube Scan + uses: SonarSource/sonarqube-scan-action@v7 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: | - sonar-scanner \ - -Dsonar.cfamily.build-wrapper-output="${{github.workspace}}/build/${{ env.BUILD_WRAPPER_OUT_DIR }}" \ + with: + args: > + -Dsonar.cfamily.build-wrapper-output=build/${{ env.BUILD_WRAPPER_OUT_DIR }} -Dsonar.coverageReportPaths=${{github.workspace}}/build/coverage/sonarqube.report diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/.github/workflows/windows.yml new/fluidsynth-2.5.3/.github/workflows/windows.yml --- old/fluidsynth-2.5.2/.github/workflows/windows.yml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/.github/workflows/windows.yml 2026-02-21 12:49:48.000000000 +0100 @@ -24,6 +24,7 @@ LIBSNDFILE_URL_X86: 'https://github.com/libsndfile/libsndfile/releases/download/1.2.2/libsndfile-1.2.2-win32.zip' LIBSNDFILE_URL_X64: 'https://github.com/libsndfile/libsndfile/releases/download/1.2.2/libsndfile-1.2.2-win64.zip' MINGW_URL_X64: 'https://sourceforge.net/projects/mingw-w64/files/Toolchains%%20targetting%%20Win64/Personal%%20Builds/mingw-builds/8.1.0/threads-win32/sjlj/x86_64-8.1.0-release-win32-sjlj-rt_v6-rev0.7z' + MINGW_URL_X86: 'https://sourceforge.net/projects/mingw-w64/files/Toolchains%%20targetting%%20Win32/Personal%%20Builds/mingw-builds/8.1.0/threads-win32/sjlj/i686-8.1.0-release-win32-sjlj-rt_v6-rev0.7z' SDL3_URL: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-VC.zip' jobs: @@ -118,7 +119,7 @@ mkdir build && cd build || exit /b 1 cmake -Werror=dev -A ${{ matrix.platform }} -T v143 ^ -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\${{ env.INSTALL_LOCATION }} ^ - -Denable-readline=0 -Denable-floats=1 -Denable-jack=0 -Denable-sdl2=0 ^ + -Denable-readline=0 -Denable-floats=1 -Denable-jack=0 -Denable-sdl3=0 ^ -Dosal=${{ matrix.osal }} -Denable-libinstpatch=0 -Denable-dls=1 ^ ${{ matrix.CMAKEFLAGS }} -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^ @@ -269,7 +270,7 @@ -DCMAKE_VERBOSE_MAKEFILE=1 ${{ matrix.CMAKE_FLAGS }} ^ -DNO_GUI=1 -Dwindows-version=0x0A00 -Denable-jack=0 ^ -Denable-pulseaudio=0 -Denable-ladspa=0 -Denable-dbus=0 ^ - -Denable-readline=0 -Denable-sdl2=0 -Denable-libinstpatch=0 .. || exit /b 1 + -Denable-readline=0 -Denable-sdl3=0 -Denable-libinstpatch=0 .. || exit /b 1 - name: Build shell: cmd @@ -302,12 +303,32 @@ fail-fast: false matrix: include: - - CMAKE_FLAGS: "" + - CMAKE_FLAGS: '-Denable-sdl3=0 -Denable-openmp=0 -Denable-libsndfile=0' + artifactPrefix: "fluidsynth-mingw1" + platform: x86 + sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' + sdl3-subdir: 'i686-w64-mingw32' + - CMAKE_FLAGS: '-Denable-sdl3=0 -Denable-openmp=0 -Denable-libsndfile=0 -DCMAKE_C_FLAGS="-mfpmath=387" -DCMAKE_CXX_FLAGS="-mfpmath=387"' + artifactPrefix: "fluidsynth-mingw2" + platform: x86 + sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' + sdl3-subdir: 'i686-w64-mingw32' + - CMAKE_FLAGS: '-Denable-sdl3=0 -Denable-openmp=0 -Denable-libsndfile=0 -DCMAKE_RC_FLAGS="-F pe-i386" -DCMAKE_C_FLAGS="-m32 -mfpmath=387" -DCMAKE_CXX_FLAGS="-m32 -mfpmath=387"' + artifactPrefix: "fluidsynth-mingw" + platform: x86 + sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' + sdl3-subdir: 'i686-w64-mingw32' + - CMAKE_FLAGS: '-Denable-sdl3=0 -Denable-openmp=0 -Denable-libsndfile=0 -DCMAKE_RC_FLAGS="-F pe-i386" -DCMAKE_C_FLAGS="-m32 -mfpmath=387 -ffloat-store" -DCMAKE_CXX_FLAGS="-m32 -mfpmath=387 -ffloat-store"' + artifactPrefix: "fluidsynth-mingw-ffloat-store" + platform: x86 + sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' + sdl3-subdir: 'i686-w64-mingw32' + - CMAKE_FLAGS: "-Denable-openmp=0" artifactPrefix: "fluidsynth-mingw" platform: x64 sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' sdl3-subdir: 'x86_64-w64-mingw32' - - CMAKE_FLAGS: '-DBUILD_SHARED_LIBS=0' + - CMAKE_FLAGS: '-DBUILD_SHARED_LIBS=0 -Denable-openmp=0' artifactPrefix: "fluidsynth-mingw-static" platform: x64 sdl3-url: 'https://github.com/libsdl-org/SDL/releases/download/release-3.2.10/SDL3-devel-3.2.10-mingw.tar.gz' @@ -327,16 +348,25 @@ @ECHO ON mkdir d:\deps || exit /b 1 cd d:\deps || exit /b 1 - if not "${{ env.GTK_BUNDLE_X64 }}"=="" ( - curl -LfsS -o gtk-bundle-dev.zip "${{ env.GTK_BUNDLE_X64 }}" || exit /b 1 + if "${{ matrix.platform }}"=="x86" ( + set GTK_URL=${{ env.GTK_BUNDLE_X86 }} + set LIBSNDFILE_URL=${{ env.LIBSNDFILE_URL_X86 }} + set MINGW_URL=${{ env.MINGW_URL_X86 }} + ) else ( + set GTK_URL=${{ env.GTK_BUNDLE_X64 }} + set LIBSNDFILE_URL=${{ env.LIBSNDFILE_URL_X64 }} + set MINGW_URL=${{ env.MINGW_URL_X64 }} + ) + if not "%GTK_URL%"=="" ( + curl -LfsS -o gtk-bundle-dev.zip "%GTK_URL%" || exit /b 1 7z x -aos -- gtk-bundle-dev.zip > NUL || exit /b 1 ) - if not "${{ env.LIBSNDFILE_URL_X64 }}"=="" ( - curl -LfsS -o libsndfile-dev.zip "${{ env.LIBSNDFILE_URL_X64 }}" || exit /b 1 + if not "%LIBSNDFILE_URL%"=="" ( + curl -LfsS -o libsndfile-dev.zip "%LIBSNDFILE_URL%" || exit /b 1 7z x -aos -- libsndfile-dev.zip > NUL || exit /b 1 ) - if not "${{ env.MINGW_URL_X64 }}"=="" ( - curl -LfsS -o mingw.zip "${{ env.MINGW_URL_X64 }}" || exit /b 1 + if not "%MINGW_URL%"=="" ( + curl -LfsS -o mingw.zip "%MINGW_URL%" || exit /b 1 7z x -aos -- mingw.zip > NUL || exit /b 1 ) curl -LfsS -o sdl3.tar.gz "${{ matrix.sdl3-url }}" || exit /b 1 @@ -376,7 +406,7 @@ -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\${{ env.INSTALL_LOCATION }} ^ ${{ matrix.CMAKE_FLAGS }} -Denable-readline=0 -Denable-floats=1 ^ -Denable-jack=0 -Denable-pulseaudio=0 -Denable-ladspa=0 ^ - -Denable-dbus=0 -Denable-sdl2=0 -DCMAKE_BUILD_TYPE=Release ^ + -Denable-dbus=0 -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_VERBOSE_MAKEFILE=1 -DNO_GUI=1 .. || exit /b 1 - name: Build diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/CMakeLists.txt new/fluidsynth-2.5.3/CMakeLists.txt --- old/fluidsynth-2.5.2/CMakeLists.txt 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/CMakeLists.txt 2026-02-21 12:49:48.000000000 +0100 @@ -1,6 +1,6 @@ # FluidSynth - A Software Synthesizer # -# Copyright (C) 2003-2025 Peter Hanappe and others. +# Copyright (C) 2003-2026 Peter Hanappe and others. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License @@ -47,7 +47,7 @@ # FluidSynth package version set ( FLUIDSYNTH_VERSION_MAJOR 2 ) set ( FLUIDSYNTH_VERSION_MINOR 5 ) -set ( FLUIDSYNTH_VERSION_MICRO 2 ) +set ( FLUIDSYNTH_VERSION_MICRO 3 ) set ( VERSION "${FLUIDSYNTH_VERSION_MAJOR}.${FLUIDSYNTH_VERSION_MINOR}.${FLUIDSYNTH_VERSION_MICRO}" ) set ( FLUIDSYNTH_VERSION ${VERSION} ) @@ -62,7 +62,7 @@ # This is not exactly the same algorithm as the libtool one, but the results are the same. set ( LIB_VERSION_CURRENT 3 ) set ( LIB_VERSION_AGE 5 ) -set ( LIB_VERSION_REVISION 1 ) +set ( LIB_VERSION_REVISION 2 ) set ( LIB_VERSION_INFO "${LIB_VERSION_CURRENT}.${LIB_VERSION_AGE}.${LIB_VERSION_REVISION}" ) @@ -80,7 +80,7 @@ option ( enable-aufile "compile support for sound file output" on ) option ( BUILD_SHARED_LIBS "Build a shared object or DLL" on ) option ( enable-dbus "compile DBUS support (if it is available)" on ) -option ( enable-ipv6 "enable IPv6 support at the cost of disabling IPv4" on ) +option ( enable-ipv6 "enable IPv6 support" on ) option ( enable-jack "compile JACK support (if it is available)" on ) option ( enable-ladspa "enable LADSPA effect units" on ) option ( enable-libinstpatch "use libinstpatch (if available) to load DLS and GIG files" on ) @@ -113,9 +113,12 @@ if ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS" ) option ( enable-coreaudio "compile CoreAudio support (if it is available)" on ) option ( enable-coremidi "compile CoreMIDI support (if it is available)" on ) - option ( enable-framework "create a Mac OSX style FluidSynth.framework" on ) endif ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS" ) +if ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS" ) + option ( enable-framework "create a Mac OSX style FluidSynth.framework" on ) +endif ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS" ) + if ( CMAKE_SYSTEM MATCHES "OS2" ) option ( enable-dart "compile DART support (if it is available)" on ) option ( enable-kai "compile KAI support (if it is available)" on ) @@ -203,7 +206,7 @@ if ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "Intel" ) # If we ever bump to CMake 3.29+, replace this with CMAKE_LANG_COMPILER_LINKER_ID - if (NOT (CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|OS2|Emscripten|SunOS") ) + if (NOT (CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|OS2|Emscripten|SunOS") ) set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed" ) set ( CMAKE_SHARED_LINKER_FLAGS @@ -284,17 +287,17 @@ # windows-version is supposed to be non-official variable that can be used to tweak the Windows target version. # Its value defaults to the Windows Version we are compiling for. if ( NOT windows-version ) - if(CMAKE_SYSTEM_VERSION EQUAL 10) # Windows 10 + if(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 10) # Windows 10 set ( windows-version "0x0A00" ) - elseif(CMAKE_SYSTEM_VERSION EQUAL 6.3) # Windows 8.1 + elseif(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 6.3) # Windows 8.1 set ( windows-version "0x0603" ) - elseif(CMAKE_SYSTEM_VERSION EQUAL 6.2) # Windows 8 + elseif(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 6.2) # Windows 8 set ( windows-version "0x0602" ) - elseif(CMAKE_SYSTEM_VERSION EQUAL 6.1) # Windows 7 + elseif(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 6.1) # Windows 7 set ( windows-version "0x0601" ) - elseif(CMAKE_SYSTEM_VERSION EQUAL 6.0) # Windows Vista + elseif(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 6.0) # Windows Vista set ( windows-version "0x0600" ) - elseif(CMAKE_SYSTEM_VERSION EQUAL 5.1) # Windows XP + elseif(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 5.1) # Windows XP set ( windows-version "0x0501" ) else() set ( windows-version "0x0400" ) @@ -366,6 +369,11 @@ find_package ( GCEM REQUIRED ) +find_library ( HAS_LIBM NAMES "m" ) +if ( HAS_LIBM ) + set ( MATH_LIBRARY "m" ) +endif ( HAS_LIBM ) + set ( LIBFLUID_LIBS ${MATH_LIBRARY} ) if (NOT ((CMAKE_SYSTEM_NAME MATCHES "SunOS") OR (osal STREQUAL "embedded"))) # Check for threads and math @@ -373,11 +381,6 @@ list ( APPEND LIBFLUID_LIBS "Threads::Threads" ) endif () -find_library ( HAS_LIBM NAMES "m" ) -if ( HAS_LIBM ) - set ( MATH_LIBRARY "m" ) -endif ( HAS_LIBM ) - # IBM OS/2 unset ( DART_SUPPORT CACHE ) unset ( DART_LIBS CACHE ) @@ -416,7 +419,7 @@ unset ( COREMIDI_LIBS CACHE ) unset ( DARWIN CACHE ) unset ( MACOSX_FRAMEWORK CACHE ) -if ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS" ) +if ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS" ) set ( DARWIN 1 ) set ( CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR} ) if ( enable-coreaudio ) @@ -441,7 +444,7 @@ if ( enable-framework ) set ( MACOSX_FRAMEWORK 1 ) endif ( enable-framework ) -endif ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS" ) +endif ( CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS" ) # Android if ( ANDROID_ABI ) @@ -544,7 +547,7 @@ # Set the minimum version desired for libraries set ( ALSA_MINIMUM_VERSION 0.9.1 ) set ( DBUS_MINIMUM_VERSION 1.11.12 ) -set ( GLIB2_MINUMUM_VERSION 2.6.5 ) +set ( GLIB2_MINIMUM_VERSION 2.6.5 ) set ( LIBINSTPATCH_MINIMUM_VERSION 1.1.0 ) set ( LIBSNDFILE_MINIMUM_VERSION 1.0.0 ) set ( PIPEWIRE_MINIMUM_VERSION 0.3 ) @@ -561,7 +564,7 @@ unset ( GLIB_SUPPORT CACHE ) if ( osal STREQUAL "glib" ) # Mandatory libraries: glib and gthread - find_package ( GLib2 ${GLIB2_MINUMUM_VERSION} REQUIRED ) + find_package ( GLib2 ${GLIB2_MINIMUM_VERSION} REQUIRED ) list( APPEND PC_REQUIRES_PRIV "glib-2.0" "gthread-2.0") set ( GLIB_SUPPORT 1 ) @@ -597,12 +600,12 @@ set ( LIBSNDFILE_SUPPORT 1 ) message ( STATUS "Found libSndFile: ${SndFile_VERSION}" ) #cmake_print_properties(TARGETS SndFile::sndfile PROPERTIES LOCATION INTERFACE_INCLUDE_DIRECTORIES IMPORTED_CONFIGURATIONS) - cmake_print_variables(SndFile_WITH_EXTERNAL_LIBS SndFile_WITH_MPEG) + #cmake_print_variables(SndFile_WITH_EXTERNAL_LIBS SndFile_WITH_MPEG) list( APPEND PC_REQUIRES_PRIV "sndfile") if ( SndFile_WITH_EXTERNAL_LIBS ) set ( LIBSNDFILE_HASVORBIS 1 ) else (SndFile_WITH_EXTERNAL_LIBS) - message ( NOTICE "Seems like libsndfile was compiled without OGG/Vorbis support." ) + message ( "Seems like libsndfile was compiled without OGG/Vorbis support." ) endif (SndFile_WITH_EXTERNAL_LIBS) else ( SndFile_FOUND ) message( STATUS "Could NOT find SndFile (Set SndFile_DIR to the directory containing its CMake config) (Required is at least version ${LIBSNDFILE_MINIMUM_VERSION})" ) @@ -710,7 +713,10 @@ if ( enable-oboe ) find_package ( oboe ) if ( oboe_FOUND ) - set(CMAKE_CXX_STANDARD 14) + if(CMAKE_CXX_STANDARD VERSION_LESS 14) + message ( STATUS "Setting C++ standard to C++14 for Oboe support" ) + set(CMAKE_CXX_STANDARD 14) + endif() set(CMAKE_CXX_STANDARD_REQUIRED ON) set ( OBOE_SUPPORT 1 ) list( APPEND PC_REQUIRES_PRIV "oboe-1.0") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/FluidSynthConfig.cmake.in new/fluidsynth-2.5.3/FluidSynthConfig.cmake.in --- old/fluidsynth-2.5.2/FluidSynthConfig.cmake.in 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/FluidSynthConfig.cmake.in 2026-02-21 12:49:48.000000000 +0100 @@ -75,7 +75,7 @@ endif() if(FLUIDSYNTH_SUPPORT_GLIB AND (NOT TARGET GLib2::glib-2 OR NOT TARGET GLib2::gthread-2)) - find_dependency(GLib2 @GLIB2_MINUMUM_VERSION@) + find_dependency(GLib2 @GLIB2_MINIMUM_VERSION@) endif() if(FLUIDSYNTH_SUPPORT_ALSA AND NOT TARGET ALSA::ALSA) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/cmake_admin/FindGCEM.cmake new/fluidsynth-2.5.3/cmake_admin/FindGCEM.cmake --- old/fluidsynth-2.5.2/cmake_admin/FindGCEM.cmake 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/cmake_admin/FindGCEM.cmake 2026-02-21 12:49:48.000000000 +0100 @@ -23,7 +23,7 @@ #]=======================================================================] # Find the headers and library -find_path(GCEM_INCLUDE_DIR NAMES "gcem.hpp" PATHS "${CMAKE_SOURCE_DIR}/gcem/include") +find_path(GCEM_INCLUDE_DIR NAMES "gcem.hpp" PATHS "${CMAKE_CURRENT_SOURCE_DIR}/gcem/include") include(FindPackageHandleStandardArgs) @@ -39,9 +39,9 @@ "and extract its contents into the 'gcem' directory in the repository root." ) else() - message(NOTICE "The 'gcem' submodule directory seems to be empty or incomplete. Attempting to download gcem from Github.") - set(GCEM_ZIP_FILE "${CMAKE_BINARY_DIR}/gcem.zip") - set(GCEM_EXTRACT_DIR "${CMAKE_BINARY_DIR}/gcem-extracted") + message("The 'gcem' submodule directory seems to be empty or incomplete. Attempting to download gcem from Github.") + set(GCEM_ZIP_FILE "${CMAKE_CURRENT_BINARY_DIR}/gcem.zip") + set(GCEM_EXTRACT_DIR "${CMAKE_CURRENT_BINARY_DIR}/gcem-extracted") file(DOWNLOAD "${GCEM_ZIP_URL}" "${GCEM_ZIP_FILE}" SHOW_PROGRESS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/cmake_admin/VersionResource.rc.in new/fluidsynth-2.5.3/cmake_admin/VersionResource.rc.in --- old/fluidsynth-2.5.2/cmake_admin/VersionResource.rc.in 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/cmake_admin/VersionResource.rc.in 2026-02-21 12:49:48.000000000 +0100 @@ -22,7 +22,7 @@ VALUE "Full Version", "@FLUIDSYNTH_VERSION_MAJOR@.@FLUIDSYNTH_VERSION_MINOR@.@[email protected]" VALUE "InternalName", "FluidSynth" VALUE "ProductName", "@PRODUCT_NAME@" - VALUE "LegalCopyright", "Copyright (C) 2003-2025 Peter Hanappe and others. Licensed under the terms of the LGPL v2.1" + VALUE "LegalCopyright", "Copyright (C) 2003-2026 Peter Hanappe and others. Licensed under the terms of the LGPL v2.1" VALUE "OriginalFilename", "@TARGET_FILENAME@" VALUE "ProductVersion", "@FLUIDSYNTH_VERSION_MAJOR@.@FLUIDSYNTH_VERSION_MINOR@.@FLUIDSYNTH_VERSION_MICRO@" END diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/doc/fluidsettings.xml new/fluidsynth-2.5.3/doc/fluidsettings.xml --- old/fluidsynth-2.5.2/doc/fluidsettings.xml 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/doc/fluidsettings.xml 2026-02-21 12:49:48.000000000 +0100 @@ -385,10 +385,23 @@ <def>44100.0</def> <min>8000.0</min> <max>96000.0</max> - <desc> - The sample rate of the audio generated by the synthesizer. For optimal performance, make sure this value equals the native output rate of the audio driver (in case you are using any of fluidsynth's audio drivers). Some drivers, such as Oboe, will interpolate sample-rates, whereas others, such as Jack, will override this setting, if a mismatch with the native output rate is detected. - </desc> - </setting> + <desc> + The sample rate of the audio generated by the synthesizer. For optimal performance, + make sure this value equals the native output rate of the audio driver (in case you + are using any of FluidSynth's audio drivers). Some drivers, such as Oboe, will + interpolate sample rates, whereas others, such as JACK, will override this setting + if a mismatch with the native output rate is detected. + <br /><br /> + Important: This setting should not be changed during runtime of the synthesizer. + <br /><br /> + The sample rate is applied when the synthesizer is created and controls the + rate at which samples are synthesized. Changing this value after creating the + synthesizer does not affect the synthesizer. Audio drivers created later may use + the updated setting value and cause the audio to play out of tune. If you need to + change the sample rate, recreate both the synthesizer and the audio driver using + settings with the new sample rate. + </desc> + </setting> <setting> <name>threadsafe-api</name> <type>bool</type> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/doc/fluidsynth-v20-devdoc.txt new/fluidsynth-2.5.3/doc/fluidsynth-v20-devdoc.txt --- old/fluidsynth-2.5.2/doc/fluidsynth-v20-devdoc.txt 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/doc/fluidsynth-v20-devdoc.txt 2026-02-21 12:49:48.000000000 +0100 @@ -7,9 +7,9 @@ \author Josh Green \author David Henningsson \author Tom Moebert -\author Copyright © 2003-2025 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert -\version Revision 2.5.2 -\date 2025-12-23 +\author Copyright © 2003-2026 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert +\version Revision 2.5.3 +\date 2026-02-21 All the source code examples in this document are in the public domain; you can use them as you please. This document is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/3.0/ . The FluidSynth library is distributed under the GNU Lesser General Public License. A copy of the GNU Lesser General Public License is contained in the FluidSynth package; if not, visit https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/doc/fluidsynth.1 new/fluidsynth-2.5.3/doc/fluidsynth.1 --- old/fluidsynth-2.5.2/doc/fluidsynth.1 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/doc/fluidsynth.1 2026-02-21 12:49:48.000000000 +0100 @@ -13,7 +13,7 @@ .\" along with this program; see the file LICENSE. If not, write to .\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. .\" -.TH FluidSynth 1 "Feb 2, 2025" +.TH FluidSynth 1 "Feb 21, 2026" .\" Please update the above date whenever this man page is modified. .\" .\" Some roff macros, for reference: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/doc/usage/audio_driver.txt new/fluidsynth-2.5.3/doc/usage/audio_driver.txt --- old/fluidsynth-2.5.2/doc/usage/audio_driver.txt 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/doc/usage/audio_driver.txt 2026-02-21 12:49:48.000000000 +0100 @@ -20,18 +20,19 @@ - pulseaudio: PulseAudio (Linux, Mac OS X, Windows) - coreaudio: Apple CoreAudio (Mac OS X) - dsound: Microsoft DirectSound (Windows) +- wasapi: Windows Audio Session API (Windows Vista and later) +- waveout: Microsoft WaveOut, alternative to DirectSound (Windows CE x86, + Windows Mobile 2003 for ARMv5, Windows 98 SE, Windows NT 4.0, Windows XP + and later) - portaudio: PortAudio Library (Mac OS 9 & X, Windows, Linux) - sndman: Apple SoundManager (Mac OS Classic) - dart: DART sound driver (OS/2) - opensles: OpenSL ES (Android) - oboe: Oboe (Android) -- waveout: Microsoft WaveOut, alternative to DirectSound (Windows CE x86, - Windows Mobile 2003 for ARMv5, Windows 98 SE, Windows NT 4.0, Windows XP - and later) -- file: Driver to output audio to a file - sdl3*: Simple DirectMedia Layer (Linux, Windows, Mac OS X, iOS, Android, FreeBSD, Haiku, etc.) - pipewire**: PipeWire (Linux) +- file: Driver to output audio to a file The default audio driver depends on the settings with which FluidSynth was compiled. You can get the default driver with @@ -40,11 +41,21 @@ with fluid_settings_setstr(). In most cases, the default driver should work out of the box. -Additional options that define the audio quality and latency are +Additional audio driver options that define the audio quality and latency include \setting{audio_sample-format}, \setting{audio_period-size}, and -\setting{audio_periods}. The details are described later. +\setting{audio_periods}. The synthesizer's \setting{synth.sample-rate} is also +involved. The details are described later. + +Important: Configure the synthesizer before creating the audio driver. +In particular, set \setting{synth.sample-rate} before instantiating the synth +with new_fluid_synth(). After the synth has been created, changing +\setting{synth.sample-rate} in the settings object may not change the sample +rate used by the synthesizer, while audio drivers created later may +use the updated setting value and cause the audio to be played out of tune. +If you need to change the sample rate, recreate both the synthesizer and the +audio driver using settings with the new sample rate. -You create the audio driver with the new_fluid_audio_driver() function. This +You can create the audio driver with the new_fluid_audio_driver() function. This function takes the settings and synthesizer object as arguments. For example: \code @@ -64,8 +75,9 @@ \endcode As soon as the audio driver is created, it will start playing. The audio -driver creates a separate thread that uses the synthesizer object to generate -the audio. +driver creates a separate thread that receives audio samples from the +synthesizer object and transfers them to an audio endpoint to generate +sound. There are a number of general audio driver settings. The audio.driver settings define the audio subsystem that will be used. The \setting{audio_periods} and diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/include/fluidsynth/audio.h new/fluidsynth-2.5.3/include/fluidsynth/audio.h --- old/fluidsynth-2.5.2/include/fluidsynth/audio.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/include/fluidsynth/audio.h 2026-02-21 12:49:48.000000000 +0100 @@ -32,7 +32,7 @@ * The file renderer is used for fast rendering of MIDI files to * audio files. The audio drivers are a high-level interface to * connect the synthesizer with external audio sinks or to render - * real-time audio to files. + * realtime audio to files. */ /** @@ -131,7 +131,7 @@ * as possible. Please see \ref FileRenderer for a full example. * * If you are looking for a way to write audio generated - * from real-time events (for example from an external sequencer or a MIDI controller) to a file, + * from realtime events (for example from an external sequencer or a MIDI controller) to a file, * please have a look at the \c file \ref audio_driver instead. * * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/include/fluidsynth/synth.h new/fluidsynth-2.5.3/include/fluidsynth/synth.h --- old/fluidsynth-2.5.2/include/fluidsynth/synth.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/include/fluidsynth/synth.h 2026-02-21 12:49:48.000000000 +0100 @@ -334,7 +334,7 @@ * but can also be used manually for custom processing of the rendered audio. * * @note Please note that all following functions block during rendering. If your goal is to - * render real-time audio, ensure that you call these functions from a high-priority + * render realtime audio, ensure that you call these functions from a high-priority * thread with little to no other duties other than calling the rendering functions. * * @warning @@ -344,7 +344,7 @@ * synth with every call (cf. fluid_synth_get_internal_bufsize()), it will become evident when requesting larger sample chunks: * With larger sample chunks it will get harder for the synth to react on those spontaneously occurring events in time * (like events received from a MIDI driver, or directly made synth API calls). - * In those real-time scenarios, prefer requesting smaller + * In those realtime scenarios, prefer requesting smaller * sample chunks from the synth with each call, to avoid poor quantization of your events in the synthesized audio. * This issue is not applicable when using the MIDI player or sequencer for event dispatching. Also * refer to the documentation of \setting{audio_period-size}. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/sonar-project.properties new/fluidsynth-2.5.3/sonar-project.properties --- old/fluidsynth-2.5.2/sonar-project.properties 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/sonar-project.properties 2026-02-21 12:49:48.000000000 +0100 @@ -1,6 +1,6 @@ sonar.projectKey=FluidSynth_fluidsynth sonar.organization=fluidsynth - +sonar.sourceEncoding=UTF-8 sonar.cfamily.threads=2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/CMakeLists.txt new/fluidsynth-2.5.3/src/CMakeLists.txt --- old/fluidsynth-2.5.2/src/CMakeLists.txt 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/CMakeLists.txt 2026-02-21 12:49:48.000000000 +0100 @@ -1,6 +1,6 @@ # FluidSynth - A Software Synthesizer # -# Copyright (C) 2003-2025 Peter Hanappe and others. +# Copyright (C) 2003-2026 Peter Hanappe and others. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public License diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/bindings/fluid_cmd.c new/fluidsynth-2.5.3/src/bindings/fluid_cmd.c --- old/fluidsynth-2.5.2/src/bindings/fluid_cmd.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/bindings/fluid_cmd.c 2026-02-21 12:49:48.000000000 +0100 @@ -231,7 +231,7 @@ /* settings commands */ { "set", "settings", fluid_handle_set, - "set name value Set the value of a setting (must be a real-time setting to take effect immediately)" + "set name value Set the value of a setting (must be a realtime setting to take effect immediately)" }, { "get", "settings", fluid_handle_get, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/drivers/fluid_adriver.c new/fluidsynth-2.5.3/src/drivers/fluid_adriver.c --- old/fluidsynth-2.5.2/src/drivers/fluid_adriver.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/drivers/fluid_adriver.c 2026-02-21 12:49:48.000000000 +0100 @@ -333,7 +333,9 @@ * completed before calling this function. * Thus, of all object types in use (synth, midi player, sequencer, etc.) the audio * driver should always be the last one to be created and the first one to be deleted! - * Also refer to the order of object creation in the code examples. + * Also refer to the order of object creation in the code examples. Deleting and re-creating + * the audio driver is supported. However, only settings marked as realtime can reconfigure + * an already created \p synth. */ fluid_audio_driver_t * new_fluid_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/drivers/fluid_aufile.c new/fluidsynth-2.5.3/src/drivers/fluid_aufile.c --- old/fluidsynth-2.5.2/src/drivers/fluid_aufile.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/drivers/fluid_aufile.c 2026-02-21 12:49:48.000000000 +0100 @@ -19,7 +19,7 @@ /* fluid_aufile.c * - * Audio driver, outputs the audio to a file (non real-time) + * Audio driver, outputs the audio to a file (non realtime) * */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/fluidsynth.c new/fluidsynth-2.5.3/src/fluidsynth.c --- old/fluidsynth-2.5.2/src/fluidsynth.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/fluidsynth.c 2026-02-21 12:49:48.000000000 +0100 @@ -1201,7 +1201,7 @@ print_welcome(void) { printf("FluidSynth runtime version %s\n" - "Copyright (C) 2000-2025 Peter Hanappe and others.\n" + "Copyright (C) 2000-2026 Peter Hanappe and others.\n" "Distributed under the LGPL license.\n" "SoundFont(R) is a registered trademark of Creative Technology Ltd.\n\n", fluid_version_str()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/midi/fluid_midi.c new/fluidsynth-2.5.3/src/midi/fluid_midi.c --- old/fluidsynth-2.5.2/src/midi/fluid_midi.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/midi/fluid_midi.c 2026-02-21 12:49:48.000000000 +0100 @@ -165,7 +165,7 @@ size_t n; /* Work out the length of the file in advance */ - if(FLUID_FSEEK(fp, 0, SEEK_END) != 0) + if(fluid_file_seek(fp, 0, SEEK_END) != 0) { FLUID_LOG(FLUID_ERR, "File load: Could not seek within file"); return NULL; @@ -173,7 +173,7 @@ buflen = ftell(fp); - if(FLUID_FSEEK(fp, 0, SEEK_SET) != 0) + if(fluid_file_seek(fp, 0, SEEK_SET) != 0) { FLUID_LOG(FLUID_ERR, "File load: Could not seek within file"); return NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/midi/fluid_midi.h new/fluidsynth-2.5.3/src/midi/fluid_midi.h --- old/fluidsynth-2.5.2/src/midi/fluid_midi.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/midi/fluid_midi.h 2026-02-21 12:49:48.000000000 +0100 @@ -62,7 +62,7 @@ MIDI_SONG_SELECT = 0xf3, MIDI_TUNE_REQUEST = 0xf6, MIDI_EOX = 0xf7, - /* system real-time - never in midi files */ + /* system realtime - never in midi files */ MIDI_SYNC = 0xf8, MIDI_TICK = 0xf9, MIDI_START = 0xfa, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/rvoice/fluid_iir_filter_impl.cpp new/fluidsynth-2.5.3/src/rvoice/fluid_iir_filter_impl.cpp --- old/fluidsynth-2.5.2/src/rvoice/fluid_iir_filter_impl.cpp 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/rvoice/fluid_iir_filter_impl.cpp 2026-02-21 12:49:48.000000000 +0100 @@ -25,7 +25,7 @@ #include <cmath> -// Calculating the sine and cosine coefficients for every possible cutoff frequency is too CPU expensive and can harm real-time playback. +// Calculating the sine and cosine coefficients for every possible cutoff frequency is too CPU expensive and can harm realtime playback. // Therefore, we precalculate the coefficients with a precision of CENTS_STEP and store them in a table. extern "C" void fluid_iir_filter_init_table(fluid_iir_sincos_t *sincos_table, fluid_real_t sample_rate) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/rvoice/fluid_rvoice.h new/fluidsynth-2.5.3/src/rvoice/fluid_rvoice.h --- old/fluidsynth-2.5.2/src/rvoice/fluid_rvoice.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/rvoice/fluid_rvoice.h 2026-02-21 12:49:48.000000000 +0100 @@ -155,7 +155,7 @@ /* - * Hard real-time parameters needed to synthesize a voice + * Hard realtime parameters needed to synthesize a voice */ struct _fluid_rvoice_t { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/rvoice/fluid_rvoice_mixer.c new/fluidsynth-2.5.3/src/rvoice/fluid_rvoice_mixer.c --- old/fluidsynth-2.5.2/src/rvoice/fluid_rvoice_mixer.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/rvoice/fluid_rvoice_mixer.c 2026-02-21 12:49:48.000000000 +0100 @@ -613,7 +613,7 @@ } /** - * Update polyphony - max number of voices (NOTE: not hard real-time capable) + * Update polyphony - max number of voices (NOTE: not hard realtime capable) * @return FLUID_OK or FLUID_FAILED */ DECLARE_FLUID_RVOICE_FUNCTION(fluid_rvoice_mixer_set_polyphony) @@ -757,7 +757,7 @@ } /** - * Note: Not hard real-time capable (calls malloc) + * Note: Not hard realtime capable (calls malloc) */ DECLARE_FLUID_RVOICE_FUNCTION(fluid_rvoice_mixer_set_samplerate) { @@ -1629,7 +1629,7 @@ /** * Update amount of extra mixer threads. * @param thread_count Number of extra mixer threads for multi-core rendering - * @param prio_level real-time prio level for the extra mixer threads + * @param prio_level realtime prio level for the extra mixer threads */ static int fluid_rvoice_mixer_set_threads(fluid_rvoice_mixer_t *mixer, int thread_count, int prio_level) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/sfloader/fluid_sffile.c new/fluidsynth-2.5.3/src/sfloader/fluid_sffile.c --- old/fluidsynth-2.5.2/src/sfloader/fluid_sffile.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/sfloader/fluid_sffile.c 2026-02-21 12:49:48.000000000 +0100 @@ -158,9 +158,11 @@ #define READCHUNK(sf, var) \ do \ { \ - if (sf->fcbs->fread(var, 8, sf->sffd) == FLUID_FAILED) \ + if (sf->fcbs->fread(&(var)->id, 4, sf->sffd) == FLUID_FAILED) \ return FALSE; \ - ((SFChunk *)(var))->size = FLUID_LE32TOH(((SFChunk *)(var))->size); \ + if (sf->fcbs->fread(&(var)->size, 4, sf->sffd) == FLUID_FAILED) \ + return FALSE; \ + (var)->size = FLUID_LE32TOH((var)->size); \ } while (0) #define READD(sf, var) \ @@ -291,7 +293,7 @@ break; } - if(FLUID_FSEEK(fp, 4, SEEK_CUR)) + if(fluid_file_seek(fp, 4, SEEK_CUR)) { FLUID_LOG(FLUID_ERR, "fluid_is_soundfont(): cannot seek +4 bytes."); break; @@ -663,7 +665,8 @@ if(chunk->id != LIST_FCC) /* error if ! list chunk */ { - FLUID_LOG(FLUID_ERR, "Invalid chunk id in level 0 parse"); + unsigned char *p = (unsigned char *)&chunk->id; + FLUID_LOG(FLUID_ERR, "Invalid chunk id '0x%X 0x%X 0x%X 0x%X' (%d bytes) in level 0 parse", (int)p[0], (int)p[1], (int)p[2], (int)p[3], chunk->size); return FALSE; } @@ -2447,8 +2450,6 @@ goto error_exit_unlock; } - FLUID_LOG(FLUID_DBG, "ftell(): %llu, fread(): %ld bytes", sf->fcbs->ftell(sf->sffd), num_samples * sizeof(short)); - if(sf->fcbs->fread(loaded_data, num_samples * sizeof(short), sf->sffd) == FLUID_FAILED) { FLUID_LOG(FLUID_ERR, "Failed to read sample data"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/sfloader/fluid_sfont.c new/fluidsynth-2.5.3/src/sfloader/fluid_sfont.c --- old/fluidsynth-2.5.2/src/sfloader/fluid_sfont.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/sfloader/fluid_sfont.c 2026-02-21 12:49:48.000000000 +0100 @@ -45,44 +45,16 @@ return FLUID_FTELL((FILE *)handle); } -#ifdef _WIN32 -#define FLUID_PRIi64 "I64d" -#else -#define FLUID_PRIi64 "lld" -#endif - -int safe_fread(void *buf, fluid_long_long_t count, void *fd) +int safe_fread(void *buf, fluid_long_long_t count, void *handle) { - if(FLUID_FREAD(buf, (size_t)count, 1, (FILE *)fd) != 1) - { - if(feof((FILE *)fd)) - { - FLUID_LOG(FLUID_ERR, "EOF while attempting to read %" FLUID_PRIi64 " bytes", count); - } - else - { - FLUID_LOG(FLUID_ERR, "File read failed"); - } - - return FLUID_FAILED; - } - - return FLUID_OK; + return fluid_file_read(buf, count, handle); } -int safe_fseek(void *fd, fluid_long_long_t ofs, int whence) +int safe_fseek(void *handle, fluid_long_long_t ofs, int whence) { - if(FLUID_FSEEK((FILE *)fd, ofs, whence) != 0) - { - FLUID_LOG(FLUID_ERR, "File seek failed with offset = %" FLUID_PRIi64 " and whence = %d", ofs, whence); - return FLUID_FAILED; - } - - return FLUID_OK; + return fluid_file_seek(handle, ofs, whence); } -#undef FLUID_PRIi64 - /** * Creates a new SoundFont loader. * @@ -325,7 +297,7 @@ * @param mod_out A reference to a fluid_mod_t array. The provided pointer variable will be populated by fluidsynth to point to an array. The caller is responsible for freeing the array with fluid_free(). * @return #FLUID_FAILED on error (e.g. out of memory). Otherwise it contains the number of modulators saved into the buffer. The caller must always free the buffer, even if the return value is zero! * @since 2.5.0 - * @note This function involves memory allocation and is therefore not real-time safe! + * @note This function involves memory allocation and is therefore not realtime safe! * @warning This function is not thread-safe. So only call this function when no synthesis thread is concurrently using this @p sfont instance! */ int fluid_sfont_get_default_mod(fluid_sfont_t *sfont, fluid_mod_t **mod_out) @@ -370,7 +342,7 @@ * SoundFont will be unset, causing the synth's default modulators to be added to voices again. * The behavior is undefined if the array @p mods contains multiple identical modulators * (i.e. fluid_mod_test_identity() evaluates to true). - * Further note that this function involves memory allocation and is therefore not real-time safe! + * Further note that this function involves memory allocation and is therefore not realtime safe! * * @warning This function is not thread-safe. So only call this function when no synthesis thread is concurrently using this @p sfont instance! * @since 2.5.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/synth/fluid_synth.c new/fluidsynth-2.5.3/src/synth/fluid_synth.c --- old/fluidsynth-2.5.2/src/synth/fluid_synth.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/synth/fluid_synth.c 2026-02-21 12:49:48.000000000 +0100 @@ -134,7 +134,7 @@ static int fluid_parse_portamento_time_str(const char* value); -/* Callback handlers for real-time settings */ +/* Callback handlers for realtime settings */ static void fluid_synth_handle_gain(void *data, const char *name, double value); static void fluid_synth_handle_polyphony(void *data, const char *name, int value); static void fluid_synth_handle_device_id(void *data, const char *name, int value); @@ -660,8 +660,8 @@ * @note The @p settings parameter is used directly, but the synth does not take ownership of it. * Hence, the caller is responsible for freeing it, when no longer needed. * Further note that you may modify FluidSettings of the - * @p settings instance. However, only those FluidSettings marked as 'realtime' will - * affect the synth immediately. See the \ref fluidsettings for more details. + * @p settings instance. However, only synth settings marked as realtime in \ref fluidsettings will + * affect the synth at runtime. fluid_settings_is_realtime() can be used to check this. * * @warning The @p settings object should only be used by a single synth at a time. I.e. creating * multiple synth instances with a single @p settings object causes undefined behavior. Once the @@ -1116,7 +1116,7 @@ fluid_profiling_print(); - /* unregister all real-time settings callback, to avoid a use-after-free when changing those settings after + /* unregister all realtime settings callback, to avoid a use-after-free when changing those settings after * this synth has been deleted*/ fluid_settings_callback_num(synth->settings, "synth.gain", @@ -3684,7 +3684,7 @@ * Set up an event to change the sample-rate of the synth during the next rendering call. * @warning This function is broken-by-design! Don't use it! Starting with fluidsynth 2.4.4 it's a no-op. Instead, specify the sample-rate when creating the synth. * @deprecated As of fluidsynth 2.1.0 this function has been deprecated. - * Changing the sample-rate is generally not considered to be a real-time use-case, as it always produces some audible artifact ("click", "pop") on the dry sound and effects (because LFOs for chorus and reverb need to be reinitialized). + * Changing the sample-rate is generally not considered to be a realtime use-case, as it always produces some audible artifact ("click", "pop") on the dry sound and effects (because LFOs for chorus and reverb need to be reinitialized). * The sample-rate change may also require memory allocation deep down in the effect units. * However, this memory allocation may fail and there is no way for the caller to know that, because the actual change of the sample-rate is executed during rendering. * This function cannot (must not) do the sample-rate change itself, otherwise the synth needs to be locked down, causing rendering to block. @@ -7747,7 +7747,7 @@ /** * Apply an offset to a SoundFont generator on a MIDI channel. * - * This function allows to set an offset for the specified destination generator in real-time. + * This function allows to set an offset for the specified destination generator in realtime. * The offset will be applied immediately to all voices that are currently and subsequently playing * on the given MIDI channel. This functionality works equivalent to using NRPN MIDI messages to * manipulate synthesis parameters. See SoundFont spec, paragraph 8.1.3, for details on SoundFont diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/synth/fluid_voice.c new/fluidsynth-2.5.3/src/synth/fluid_voice.c --- old/fluidsynth-2.5.2/src/synth/fluid_voice.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/synth/fluid_voice.c 2026-02-21 12:49:48.000000000 +0100 @@ -738,7 +738,7 @@ * fluid_voice_update_param can be called during the setup of the * voice (to calculate the initial value for a voice parameter), or * during its operation (a generator has been changed due to - * real-time parameter modifications like pitch-bend). + * realtime parameter modifications like pitch-bend). * * Note: The generator holds three values: The base value .val, an * offset caused by modulators .mod, and an offset caused by the @@ -1566,7 +1566,7 @@ * @return Note on unique ID * * A SoundFont loader may store pointers to voices it has created for - * real-time control during the operation of a voice (for example: parameter + * realtime control during the operation of a voice (for example: parameter * changes in SoundFont editor). The synth uses a pool of voices internally which are * 'recycled' and never deallocated. * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/utils/fluid_settings.c new/fluidsynth-2.5.3/src/utils/fluid_settings.c --- old/fluidsynth-2.5.2/src/utils/fluid_settings.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/utils/fluid_settings.c 2026-02-21 12:49:48.000000000 +0100 @@ -904,11 +904,11 @@ } /** - * Ask whether the setting is changeable in real-time. + * Ask whether the setting is changeable in realtime. * * @param settings a settings object * @param name a setting's name - * @return TRUE if the setting is changeable in real-time, FALSE otherwise + * @return TRUE if the setting is changeable in realtime, FALSE otherwise * * @note Before using this function, make sure the @p settings object has already been used to create * a synthesizer, a MIDI driver, an audio driver, a MIDI player, or a command handler (depending on diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/utils/fluid_sys.c new/fluidsynth-2.5.3/src/utils/fluid_sys.c --- old/fluidsynth-2.5.2/src/utils/fluid_sys.c 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/utils/fluid_sys.c 2026-02-21 12:49:48.000000000 +0100 @@ -1641,6 +1641,64 @@ #endif } +#ifdef _WIN32 +#define FLUID_PRIi64 "I64d" +#else +#define FLUID_PRIi64 "lld" +#endif + +int fluid_file_read(void *buf, fluid_long_long_t count, FILE *fd) +{ + if(FLUID_FREAD(buf, (size_t)count, 1, (FILE *)fd) != 1) + { + if(feof((FILE *)fd)) + { + FLUID_LOG(FLUID_ERR, "EOF while attempting to read %" FLUID_PRIi64 " bytes", count); + } + else + { + FLUID_LOG(FLUID_ERR, "File read failed"); + } + + return FLUID_FAILED; + } + + return FLUID_OK; +} + +int fluid_file_seek(FILE *fd, fluid_long_long_t ofs, int whence) +{ +#if defined(__MINGW32__) && defined(__i386__) + // Some older versions of MinGW i686 report incorrect values for _ftelli64(). This is problematic, + // because _fseeki64() below would use these incorrect values when seeking with SEEK_CUR, + // resulting in incorrect file positions. So we need to work around this by doing the SEEK_CUR + // calculation ourselves. + // See https://sourceforge.net/p/mingw-w64/bugs/864/ for more details. + if(whence == SEEK_CUR) + { + whence = SEEK_SET; + ofs += fluid_file_tell((FILE *)fd); + } +#endif + +#ifdef _WIN32 +#define FLUID_FSEEK(_f,_n,_set) _fseeki64(_f,_n,_set) +#else +#define FLUID_FSEEK(_f,_n,_set) fseek(_f,_n,_set) +#endif + + if(FLUID_FSEEK((FILE *)fd, ofs, whence) != 0) + { + FLUID_LOG(FLUID_ERR, "File seek failed with offset = %" FLUID_PRIi64 " and whence = %d", ofs, whence); + return FLUID_FAILED; + } +#undef FLUID_FSEEK + + return FLUID_OK; +} + +#undef FLUID_PRIi64 + #if defined(_WIN32) || defined(__CYGWIN__) // not thread-safe! #define FLUID_WINDOWS_MEX_ERROR_LEN 1024 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/utils/fluid_sys.h new/fluidsynth-2.5.3/src/utils/fluid_sys.h --- old/fluidsynth-2.5.2/src/utils/fluid_sys.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/utils/fluid_sys.h 2026-02-21 12:49:48.000000000 +0100 @@ -309,6 +309,8 @@ /* File access */ FILE* fluid_file_open(const char* filename, const char** errMsg); fluid_long_long_t fluid_file_tell(FILE* f); +int fluid_file_read(void *buf, fluid_long_long_t count, FILE *fd); +int fluid_file_seek(FILE *fd, fluid_long_long_t ofs, int whence); /* Profiling */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/src/utils/fluidsynth_priv.h new/fluidsynth-2.5.3/src/utils/fluidsynth_priv.h --- old/fluidsynth-2.5.2/src/utils/fluidsynth_priv.h 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/src/utils/fluidsynth_priv.h 2026-02-21 12:49:48.000000000 +0100 @@ -210,12 +210,6 @@ FILE *fluid_fopen(const char *filename, const char *mode); -#ifdef _WIN32 -#define FLUID_FSEEK(_f,_n,_set) _fseeki64(_f,_n,_set) -#else -#define FLUID_FSEEK(_f,_n,_set) fseek(_f,_n,_set) -#endif - #define FLUID_FTELL(_f) fluid_file_tell(_f) /* Memory functions */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/test/CMakeLists.txt new/fluidsynth-2.5.3/test/CMakeLists.txt --- old/fluidsynth-2.5.2/test/CMakeLists.txt 2025-12-23 20:39:40.000000000 +0100 +++ new/fluidsynth-2.5.3/test/CMakeLists.txt 2026-02-21 12:49:48.000000000 +0100 @@ -33,6 +33,8 @@ ADD_FLUID_TEST(test_portamento_time) ADD_FLUID_TEST(test_modulator) ADD_FLUID_TEST(test_default_mod) +ADD_FLUID_TEST(test_ABI) +ADD_FLUID_TEST(test_file_seek_tell) if ( GLIB_SUPPORT AND GLib2_VERSION VERSION_GREATER_EQUAL 2.33.12 ) # Earlier versions of GLib had broken comment handling and should not be compared to diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/test/test_ABI.cpp new/fluidsynth-2.5.3/test/test_ABI.cpp --- old/fluidsynth-2.5.2/test/test_ABI.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/fluidsynth-2.5.3/test/test_ABI.cpp 2026-02-21 12:49:48.000000000 +0100 @@ -0,0 +1,110 @@ +/* + Prints sizeof(...) and alignof(...) for common fundamental/intrinsic types. + + Build: + c++ -std=c++11 -Wall -Wextra -pedantic -O2 print_type_sizes_align.cpp -o print_type_sizes_align + + Run: + ./print_type_sizes_align +*/ + +#include "test.h" +#include "fluidsynth.h" +#include "fluid_sffile.h" + +#include <iostream> +#include <iomanip> +#include <type_traits> +#include <cstddef> +#include <cstdint> +#include <cwchar> + +template <typename T> +void print_type(const char* name) { + std::cout << std::left << std::setw(28) << name + << " sizeof=" << std::setw(2) << sizeof(T) + << " alignof=" << std::setw(2) << alignof(T) + << "\n"; +} + +int main() { + std::cout << "sizeof(...) and alignof(...) in bytes on this platform:\n\n"; + + // Fundamental character / boolean types + print_type<char>("char"); + print_type<signed char>("signed char"); + print_type<unsigned char>("unsigned char"); + print_type<wchar_t>("wchar_t"); + print_type<bool>("bool"); + + // C++11 Unicode character types + print_type<char16_t>("char16_t"); + print_type<char32_t>("char32_t"); + + // Integers + print_type<short>("short"); + print_type<unsigned short>("unsigned short"); + print_type<int>("int"); + print_type<unsigned int>("unsigned int"); + print_type<long>("long"); + print_type<unsigned long>("unsigned long"); + print_type<long long>("long long"); + print_type<unsigned long long>("unsigned long long"); + + // Floating point + print_type<float>("float"); + print_type<double>("double"); + print_type<long double>("long double"); + + // Pointers / size-related + print_type<void*>("void*"); + print_type<char*>("char*"); + print_type<std::size_t>("std::size_t"); + print_type<std::ptrdiff_t>("std::ptrdiff_t"); + + std::cout << "\n<stdint> fixed-width integer types:\n\n"; + print_type<std::int8_t>("std::int8_t"); + print_type<std::uint8_t>("std::uint8_t"); + print_type<std::int16_t>("std::int16_t"); + print_type<std::uint16_t>("std::uint16_t"); + print_type<std::int32_t>("std::int32_t"); + print_type<std::uint32_t>("std::uint32_t"); + print_type<std::int64_t>("std::int64_t"); + print_type<std::uint64_t>("std::uint64_t"); + + std::cout << "\n<stdint> least / fast / pointer integer types:\n\n"; + print_type<std::int_least8_t>("std::int_least8_t"); + print_type<std::uint_least8_t>("std::uint_least8_t"); + print_type<std::int_fast8_t>("std::int_fast8_t"); + print_type<std::uint_fast8_t>("std::uint_fast8_t"); + + print_type<std::int_least16_t>("std::int_least16_t"); + print_type<std::uint_least16_t>("std::uint_least16_t"); + print_type<std::int_fast16_t>("std::int_fast16_t"); + print_type<std::uint_fast16_t>("std::uint_fast16_t"); + + print_type<std::int_least32_t>("std::int_least32_t"); + print_type<std::uint_least32_t>("std::uint_least32_t"); + print_type<std::int_fast32_t>("std::int_fast32_t"); + print_type<std::uint_fast32_t>("std::uint_fast32_t"); + + print_type<std::int_least64_t>("std::int_least64_t"); + print_type<std::uint_least64_t>("std::uint_least64_t"); + print_type<std::int_fast64_t>("std::int_fast64_t"); + print_type<std::uint_fast64_t>("std::uint_fast64_t"); + + print_type<std::intptr_t>("std::intptr_t"); + print_type<std::uintptr_t>("std::uintptr_t"); + + // (Optional) show max alignment type + std::cout << "\nMax fundamental alignment-related type:\n\n"; + print_type<std::max_align_t>("std::max_align_t"); + + std::cout << "\nCustom FluidSynth types:\n\n"; + print_type<fluid_long_long_t>("fluid_long_long_t"); + TEST_ASSERT(sizeof(fluid_long_long_t) == 8); + print_type<SFChunk>("SFChunk"); + TEST_ASSERT(sizeof(SFChunk) == 8); + + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.5.2/test/test_file_seek_tell.c new/fluidsynth-2.5.3/test/test_file_seek_tell.c --- old/fluidsynth-2.5.2/test/test_file_seek_tell.c 1970-01-01 01:00:00.000000000 +0100 +++ new/fluidsynth-2.5.3/test/test_file_seek_tell.c 2026-02-21 12:49:48.000000000 +0100 @@ -0,0 +1,243 @@ +#include "test.h" +#include "fluidsynth.h" +#include "sfloader/fluid_sfont.h" +#include "sfloader/fluid_defsfont.h" +#include "utils/fluid_sys.h" + +void noop(void) +{ + // do nothing +} + +// A unit test that fails when compiled with MinGW32 8.1.0, due to inconsistencies when using fseek(SEEK_CUR). +// Mimic the simple behavior of the sfont loader to test seek and tell are working as expected. +int main(void) +{ + fluid_long_long_t pos, size; + fluid_sfloader_t* loader = new_fluid_sfloader((fluid_sfloader_load_t)noop, (fluid_sfloader_free_t)noop); + + fluid_file_callbacks_t* fcbs = &loader->file_callbacks; + + void * file = fcbs->fopen(TEST_SOUNDFONT); + TEST_ASSERT(file != NULL); + + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 0); + + TEST_ASSERT(fcbs->fseek(file, 0, SEEK_END) == FLUID_OK); + size = fcbs->ftell(file); + TEST_ASSERT(size == 314640); + + TEST_ASSERT(fcbs->fseek(file, 0, SEEK_SET) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 0); + + { + unsigned char buf[1024]; + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 4); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 8); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 12); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 16); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 20); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 24); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 28); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 32); + + TEST_ASSERT(fcbs->fread(buf, 2, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 34); + + TEST_ASSERT(fcbs->fread(buf, 2, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 36); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 40); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 44); + + TEST_ASSERT(fcbs->fread(buf, 28, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 72); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 76); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 80); + + TEST_ASSERT(fcbs->fread(buf, 8, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 88); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 92); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 96); + + TEST_ASSERT(fcbs->fread(buf, 6, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 102); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 106); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 110); + + TEST_ASSERT(fcbs->fread(buf, 2, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 112); + + TEST_ASSERT(fcbs->fread(buf, 2, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 114); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 118); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 122); + + TEST_ASSERT(fcbs->fread(buf, 8, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 130); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 134); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 138); + + TEST_ASSERT(fcbs->fread(buf, 12, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 150); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 154); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 158); + + TEST_ASSERT(fcbs->fread(buf, 24, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 182); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 186); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 190); + + TEST_ASSERT(fcbs->fread(buf, 14, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 204); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 208); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 212); + + TEST_ASSERT(fcbs->fread(buf, 184, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 396); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 400); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 404); + + TEST_ASSERT(fcbs->fread(buf, 40, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 444); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 448); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 452); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 456); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 460); + + TEST_ASSERT(fcbs->fread(buf, 4, file) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 464); + } + + TEST_ASSERT(fcbs->fseek(file, 252534, SEEK_CUR) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 252534 + 464); + + TEST_ASSERT(fcbs->fseek(file, 0, SEEK_CUR) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 252534 + 464); + + TEST_ASSERT(fcbs->fseek(file, -252534, SEEK_CUR) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 464); + + TEST_ASSERT(fcbs->fseek(file, 0, SEEK_SET) == FLUID_OK); + pos = fcbs->ftell(file); + TEST_ASSERT(pos == 0); + + TEST_ASSERT(fcbs->fclose(file) == FLUID_OK); + delete_fluid_sfloader(loader); + + return EXIT_SUCCESS; +}
