320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			320 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | NOTICE: THIS IS A MODIFIED VERSION OF LIBSNDFILE WHICH FIXES COMPILATION WHEN USING CMAKE 4.0. | ||
|  | 
 | ||
|  | --- | ||
|  | 
 | ||
|  | # libsndfile
 | ||
|  | 
 | ||
|  |  | ||
|  | 
 | ||
|  | libsndfile is a C library for reading and writing files containing sampled audio | ||
|  | data. | ||
|  | 
 | ||
|  | ## Authors
 | ||
|  | 
 | ||
|  | The libsndfile project was originally developed and maintained by | ||
|  | Erik de Castro Lopo <erikd@mega-nerd.com> aka @erikd. The project was developed | ||
|  | on Github at <https://github.com/erikd/libsndfile>. | ||
|  | 
 | ||
|  | After the release of version 1.0.30, @erikd transferred the project to | ||
|  | [the libsndfile team](https://github.com/libsndfile), see [AUTHORS](AUTHORS) | ||
|  | for details. | ||
|  | 
 | ||
|  | ## Hacking
 | ||
|  | 
 | ||
|  | The canonical source code repository for libsndfile is at | ||
|  | <https://github.com/libsndfile/libsndfile>. | ||
|  | 
 | ||
|  | You can grab the source code using: | ||
|  | 
 | ||
|  |     git clone https://github.com/libsndfile/libsndfile.git | ||
|  | 
 | ||
|  | For building for Android see [BuildingForAndroid][BuildingForAndroid]. | ||
|  | 
 | ||
|  | There are currently two build systems: the traditional GNU autotool based one and | ||
|  | modern CMake based build system. Use of the CMake build system is documented | ||
|  | below. | ||
|  | 
 | ||
|  | Setting up a build environment for libsndfile on Debian or Ubuntu is as simple as: | ||
|  | 
 | ||
|  |     sudo apt install autoconf autogen automake build-essential libasound2-dev \ | ||
|  |       libflac-dev libogg-dev libtool libvorbis-dev libopus-dev libmp3lame-dev \ | ||
|  |       libmpg123-dev pkg-config python | ||
|  | 
 | ||
|  | For other Linux distributions or any of the *BSDs, the setup should be similar | ||
|  | although the package install tools and package names may be slightly different. | ||
|  | 
 | ||
|  | Similarly on Mac OS X, assuming [brew] is already installed: | ||
|  | 
 | ||
|  |     brew install autoconf autogen automake flac libogg libtool libvorbis opus mpg123 pkg-config | ||
|  | 
 | ||
|  | Once the build environment has been set up, building and testing libsndfile is | ||
|  | as simple as: | ||
|  | 
 | ||
|  |     autoreconf -vif | ||
|  |     ./configure --enable-werror | ||
|  |     make | ||
|  |     make check | ||
|  | 
 | ||
|  | ## The CMake build system
 | ||
|  | 
 | ||
|  | Although Autotools is the primary and recommended build toolchain, CMake meta | ||
|  | build generator is also available. The build process with CMake takes | ||
|  | place in two stages. First, standard build files are created from configuration | ||
|  | scripts. Then the platform's native build tools are used for the actual | ||
|  | building. CMake can produce Microsoft Visual Studio project and solution files, | ||
|  | Unix Makefiles, Xcode projects and [many more](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html). | ||
|  | 
 | ||
|  | Some IDE support CMake natively or with plugins, check you IDE documentation | ||
|  |  for details. | ||
|  | 
 | ||
|  | ### Requirements
 | ||
|  | 
 | ||
|  | 1. C99-compliant compiler toolchain (tested with GCC, Clang and Visual | ||
|  |    Studio 2015) | ||
|  | 2. CMake 3.1.3 or newer | ||
|  | 
 | ||
|  | There are some recommended packages to enable all features of libsndfile: | ||
|  | 
 | ||
|  | 1. Ogg, Vorbis and FLAC libraries and headers to enable these formats support | ||
|  | 2. ALSA development package under Linux to build sndfile-play utility | ||
|  | 3. Sndio development package under BSD to build sndfile-play utility | ||
|  | 
 | ||
|  | ### Building from command line
 | ||
|  | 
 | ||
|  | CMake can handle out-of-place builds, enabling several builds from | ||
|  | the same source tree, and cross-compilation. The ability to build a directory | ||
|  | tree outside the source tree is a key feature, ensuring that if a build | ||
|  | directory is removed, the source files remain unaffected. | ||
|  | 
 | ||
|  |     mkdir CMakeBuild | ||
|  |     cd CMakeBuild | ||
|  | 
 | ||
|  | Then run `cmake` command with directory where CMakeLists.txt script is located | ||
|  | as argument (relative paths are supported): | ||
|  | 
 | ||
|  |     cmake .. | ||
|  | 
 | ||
|  | This command will configure and write build script or solution to CMakeBuild | ||
|  | directory. CMake is smart enough to create Unix makefiles under Linux or Visual | ||
|  | Studio solution if you have Visual Studio installed, but you can configure | ||
|  | [generator](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html) | ||
|  | with `-G` command line parameter: | ||
|  | 
 | ||
|  |     cmake .. -G"Unix Makefiles" | ||
|  | 
 | ||
|  | The build procedure depends on the selected generator. With "Unix Makefiles" you | ||
|  | can type: | ||
|  | 
 | ||
|  |     make & make install | ||
|  | 
 | ||
|  | With "Visual Studio" and some other generators you can open solution or project | ||
|  | from `CMakeBuild` directory and build using IDE. | ||
|  | 
 | ||
|  | Finally, you can use unified command: | ||
|  | 
 | ||
|  |     cmake --build . | ||
|  | 
 | ||
|  | CMake also provides Qt-based cross platform GUI, cmake-gui. Using it is trivial | ||
|  | and does not require detailed explanations. | ||
|  | 
 | ||
|  | ### Configuring CMake
 | ||
|  | 
 | ||
|  | You can pass additional options with `/D<parameter>=<value>` when you run | ||
|  | `cmake` command. Some useful system options: | ||
|  | 
 | ||
|  | * `CMAKE_C_FLAGS` - additional C compiler flags | ||
|  | * `CMAKE_BUILD_TYPE` - configuration type, `DEBUG`, `RELEASE`, `RELWITHDEBINFO` | ||
|  |   or `MINSIZEREL`. `DEBUG` is default | ||
|  | * `CMAKE_INSTALL_PREFIX` - build install location, the same as `--prefix` option | ||
|  |   of `configure` script | ||
|  | 
 | ||
|  |  Useful libsndfile options: | ||
|  | 
 | ||
|  | * `BUILD_SHARED_LIBS` - build shared library (DLL under Windows) when `ON`, | ||
|  |   build static library othervise. This option is `OFF` by default. | ||
|  | * `BUILD_PROGRAMS` - build libsndfile's utilities from `programs/` directory, | ||
|  |   `ON` by default. | ||
|  | * `BUILD_EXAMPLES` - build examples, `ON` by default. | ||
|  | * `BUILD_TESTING` - build tests. Then you can run tests with `ctest` command, | ||
|  |   `ON` by default. Setting `BUILD_SHARED_LIBS` to `ON` disables this option. | ||
|  | * `ENABLE_EXTERNAL_LIBS` - enable Ogg, Vorbis, FLAC and Opus support. This | ||
|  |   option is available and set to `ON` if all dependency libraries were found. | ||
|  | * `ENABLE_MPEG` - MP3 support. This option is available and set to `ON` if all | ||
|  |   dependency libraries were found. | ||
|  | * `ENABLE_CPU_CLIP` - enable tricky cpu specific clipper. Enabled and set to | ||
|  |   `ON` when CPU clips negative\positive. Don't touch it if you are not sure | ||
|  | * `ENABLE_BOW_DOCS` - enable black-on-white documentation theme, `OFF` by | ||
|  |   default. | ||
|  | * `ENABLE_EXPERIMENTAL` - enable experimental code. Don't use it if you are | ||
|  |   not sure. This option is `OFF` by default. | ||
|  | * `ENABLE_CPACK` - enable [CPack](https://cmake.org/cmake/help/latest/module/CPack.html) support. | ||
|  |   This option is `ON` by default. | ||
|  | * `ENABLE_PACKAGE_CONFIG` - generate and install [package config file](https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#config-file-packages). | ||
|  | * `INSTALL_PKGCONFIG_MODULE` - generate and install [pkg-config module](https://people.freedesktop.org/~dbn/pkg-config-guide.html). | ||
|  | * `INSTALL_MANPAGES` - install [man pages](https://en.wikipedia.org/wiki/Man_page) for programs. This option is `ON` by  default | ||
|  | * `ENABLE_STATIC_RUNTIME` - enable static runtime on Windows platform (MSVC and | ||
|  |   MinGW), `OFF` by default. | ||
|  | 
 | ||
|  |   **Note**: For MSVC compiler this option is deprecated for CMake >= 3.15, see | ||
|  |   policy [CMP0091](https://cmake.org/cmake/help/latest/policy/CMP0091.html). | ||
|  |   Use `CMAKE_MSVC_RUNTIME_LIBRARY` option instead. | ||
|  | 
 | ||
|  |   **Note**: For MinGW toolchain this option is experimental. If you enabled it | ||
|  |   and then disabled again, you need to clear CMake cache (delete CMakeCache.txt). | ||
|  | * `ENABLE_COMPATIBLE_LIBSNDFILE_NAME` - set DLL name to `libsndfile-1.dll` | ||
|  |   (canonical name) on Windows platform, `sndfile.dll` otherwise, `OFF` by | ||
|  |   default. Library name can be different depending on platform. The well known | ||
|  |   DLL name on Windows platform is `libsndfile-1.dll`, because the only way to | ||
|  |   build Windows library before was MinGW toolchain with Autotools. This name | ||
|  |   is native for MinGW ecosystem, Autotools constructs it using MinGW platform | ||
|  |   rules from `sndfile` target. But when you build with CMake using native | ||
|  |   Windows compiler, the name is `sndfile.dll`. This is name for native Windows | ||
|  |   platform, because Windows has no library naming rules. It is preffered | ||
|  |   because you can search library using package manager or CMake's | ||
|  |   `find_library` command on any platform using the same `sndfile` name. | ||
|  | 
 | ||
|  | * `ENABLE_SSE2` - add compiler flag to enable SSE2 if required, `ON` by default. | ||
|  | 
 | ||
|  |   This option is for X86 and GCC compatible compilers configurations only. | ||
|  | 
 | ||
|  |   If you compile for other SIMD set, e.g. AVX2, you may want to set | ||
|  |   `ENABLE_SSE2` to `OFF`. | ||
|  | 
 | ||
|  |   **Note**: This option is not active for X64 configuration, because SSE2 is | ||
|  |   always available in this mode and all optimizations are enabled by default. | ||
|  | 
 | ||
|  | Deprecated options: | ||
|  | 
 | ||
|  | * `DISABLE_EXTERNAL_LIBS` - disable Ogg, Vorbis and FLAC support. Replaced by | ||
|  |   `ENABLE_EXTERNAL_LIBS` | ||
|  | * `DISABLE_CPU_CLIP` - disable tricky cpu specific clipper. Replaced by | ||
|  |   `ENABLE_CPU_CLIP` | ||
|  | * `BUILD_STATIC_LIBS` - build static library. Use `BUILD_SHARED_LIBS` instead | ||
|  | 
 | ||
|  | ### Linking from CMake projects
 | ||
|  | 
 | ||
|  | First you need to add `FindOgg.cmake`, `FindVorbis.cmake`, `FindFLAC.cmake` and | ||
|  | `FindOpus.cmake` files to some directory inside your CMake project (usually | ||
|  | `cmake`) and add it to `CMAKE_MODULE_PATH`: | ||
|  | 
 | ||
|  |     project(SomeApplication) | ||
|  |      | ||
|  |     list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | ||
|  | 
 | ||
|  | Now you can search `libsndfile` library from your `CMakeLists.txt` | ||
|  |  with this command: | ||
|  | 
 | ||
|  |     find_package(SndFile) | ||
|  | 
 | ||
|  | `SndFile_FOUND` is set to `ON` when library is found. | ||
|  | 
 | ||
|  | If `libsndfile` dependency is critical, you can add `REQUIRED` to | ||
|  |  `find_package`: | ||
|  | 
 | ||
|  |     find_package(SndFile REQUIRED) | ||
|  | 
 | ||
|  | With with option `find_package` will terminate configuration process | ||
|  |  if `libsndfile` is not found. | ||
|  | 
 | ||
|  | You can also add version check: | ||
|  | 
 | ||
|  |     find_package(SndFile 1.0.29) | ||
|  | 
 | ||
|  | `find_package` will report error, if `libsndfile` version is < 1.0.29. | ||
|  | 
 | ||
|  | You can combine `REQUIRED` and version if you need. | ||
|  | 
 | ||
|  | To link `libsndfile` library use: | ||
|  | 
 | ||
|  |     target_link_libraries(my_application PRIVATE SndFile::sndfile) | ||
|  | 
 | ||
|  | ### Notes for Windows users
 | ||
|  | 
 | ||
|  | #### System CRT library
 | ||
|  | 
 | ||
|  | First advice about Visual Studio [system CRT libraries](https://docs.microsoft.com/en-us/cpp/c-runtime-library/c-run-time-library-reference?view=vs-2019), | ||
|  | it is system code linked as static or dynamic library to every C application. | ||
|  | 
 | ||
|  | You can find related option in Visual Studio project properties: | ||
|  | 
 | ||
|  |     C/C++ -> Code Generation -> Runtime Library | ||
|  | 
 | ||
|  | Dynamic version of system CRT library is default and it means that end user needs | ||
|  | to have the same runtime library installed on his system. Most likely it is so, | ||
|  | but if it is not, the user will see this error message using libsndfile DLL: | ||
|  | 
 | ||
|  |     "The program can't start because <crt-dll-name>.dll is missing from your computer. Try reinstalling the program to fix this problem. " | ||
|  | 
 | ||
|  | To avoid this, you may want to enable static CRT library linking. In this case | ||
|  | the size of your DLL will increase slightly the size will increase slightly, but | ||
|  | you can redistribute the libsndfile DLL without having to install the correct | ||
|  | version of the system CRT library. | ||
|  | 
 | ||
|  | CMake project will use dynamic system CRT libraries by default, just like | ||
|  | Visual Studio does. But you can change it using `ENABLE_STATIC_RUNTIME` or | ||
|  | `CMAKE_MSVC_RUNTIME_LIBRARY` options. | ||
|  | 
 | ||
|  | **Note**: You cannot use both options at the same time, it will lead to a | ||
|  | configuration error. | ||
|  | 
 | ||
|  | If you have CMake >= 3.15 you should use | ||
|  | [`CMAKE_MSVC_RUNTIME_LIBRARY`](https://cmake.org/cmake/help/v3.15/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html) option. | ||
|  | 
 | ||
|  | This will enable static linking: | ||
|  | 
 | ||
|  |     cmake .. -D"MultiThreaded$<$<CONFIG:Debug>:Debug>" | ||
|  | 
 | ||
|  | You can use libsndfile `ENABLE_STATIC_RUNTIME` option to to control CRT library | ||
|  | linking for CMake project: `OFF` or unset (default) for dynamic, and `ON` for | ||
|  | static linking: | ||
|  | 
 | ||
|  |     cmake .. -DENABLE_STATIC_RUNTIME=ON | ||
|  | 
 | ||
|  | **Note**: This option is deprecated and may be removed in far future because we | ||
|  | have standard option `CMAKE_MSVC_RUNTIME_LIBRARY` now. | ||
|  | 
 | ||
|  | #### Using Vcpkg package manager
 | ||
|  | 
 | ||
|  | Second advice is about Ogg, Vorbis FLAC and Opus support. Searching external | ||
|  | libraries under Windows is a little bit tricky. The best way is to use | ||
|  | [Vcpkg](https://github.com/Microsoft/vcpkg). | ||
|  | 
 | ||
|  | Install Vcpkg and then add this parameter to cmake command line: | ||
|  | 
 | ||
|  |     -DCMAKE_TOOLCHAIN_FILE=<path-to-vcpkg>/scripts/buildsystems/vcpkg.cmake | ||
|  | 
 | ||
|  | You also need to set `VCPKG_TARGET_TRIPLET` if you want to use static libraries: | ||
|  | 
 | ||
|  |     -DVCPKG_TARGET_TRIPLET=x64-windows-static | ||
|  | 
 | ||
|  | Then you need to install static libogg, libvorbis, libflac, libopus, mpg123 and | ||
|  | mp3lame Vcpkg packages. | ||
|  | 
 | ||
|  | After 1.1.0beta2 you don't need to install dependencies manually. Libsndfile | ||
|  | now supports [Vcpkg manifest mode](https://vcpkg.readthedocs.io/en/latest/users/manifests/) | ||
|  | and all dependencies are installed automatically. | ||
|  | 
 | ||
|  | However, you can turn off the manifest mode and return to the classic mode using | ||
|  | the `VCPKG_MANIFEST_MODE` parameter from the command line: | ||
|  | 
 | ||
|  |     -DVCPKG_MANIFEST_MODE=OFF | ||
|  | 
 | ||
|  | In classic mode, you need to install the required libraries manually: | ||
|  | 
 | ||
|  |     vcpkg install libvorbis:x64-windows-static libflac:x64-windows-static | ||
|  |     opus:x64-windows-static mp3lame:x86-windows-static mpg123:x86-windows-static | ||
|  |     libvorbis:x86-windows-static libflac:x86-windows-static | ||
|  |     opus:x86-windows-static mp3lame:x86-windows-static mpg123:x86-windows-static | ||
|  | 
 | ||
|  | **Note**: Use must use the same CRT library for external libraries and the | ||
|  | libsndfile library itself. For `*-static` triplets Vcpkg uses | ||
|  | [static CRT](https://vcpkg.readthedocs.io/en/latest/users/triplets/). | ||
|  | 
 | ||
|  | ## Submitting Patches
 | ||
|  | 
 | ||
|  | See [CONTRIBUTING.md](CONTRIBUTING.md) for details. | ||
|  | 
 | ||
|  | [brew]: http://brew.sh/ | ||
|  | [github]: http://libsndfile.github.io/libsndfile/ | ||
|  | [BuildingForAndroid]: https://github.com/libsndfile/libsndfile/blob/master/Building-for-Android.md |