|
|
# CMake Project for FAudio
|
|
|
# Written by @NeroBurner
|
|
|
cmake_minimum_required(VERSION 2.8.12)
|
|
|
project(FAudio)
|
|
|
|
|
|
# Options
|
|
|
option(FFMPEG "Enable FFmpeg support (WMA, XMA)" OFF)
|
|
|
option(BUILD_UTILS "Build utils/ folder" OFF)
|
|
|
option(BUILD_TESTS "Build tests/ folder for unit tests to be executed on the host against FAudio" OFF)
|
|
|
if(WIN32)
|
|
|
option(BUILD_CPP "Build cpp/ folder (COM wrapper for XAudio2)" OFF)
|
|
|
endif()
|
|
|
option(XNASONG "Build with XNA_Song.c" ON)
|
|
|
option(LOG_ASSERTIONS "Bind FAudio_assert to log, instead of platform's assert" OFF)
|
|
|
option(FORCE_ENABLE_DEBUGCONFIGURATION "Enable DebugConfiguration in all build types" OFF)
|
|
|
option(DUMP_VOICES "Dump voices to RIFF WAVE files" OFF)
|
|
|
option(BUILD_SHARED_LIBS "Build shared library" ON)
|
|
|
if(WIN32)
|
|
|
option(INSTALL_MINGW_DEPENDENCIES "Add dependent libraries to MinGW install target" OFF)
|
|
|
endif()
|
|
|
|
|
|
# C99 Requirement
|
|
|
if(${CMAKE_VERSION} VERSION_LESS "3.1.3")
|
|
|
message(WARNING "Your CMake version is too old, set -std=c99 yourself!")
|
|
|
else()
|
|
|
set(CMAKE_C_STANDARD 99)
|
|
|
set(CMAKE_C_EXTENSIONS OFF)
|
|
|
endif()
|
|
|
|
|
|
# Version
|
|
|
SET(LIB_MAJOR_VERSION "0")
|
|
|
SET(LIB_MINOR_VERSION "20")
|
|
|
SET(LIB_REVISION "06")
|
|
|
SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
|
|
|
|
|
|
# Build Type
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
|
# By default, we use Release
|
|
|
message(STATUS "Setting build type to 'Release' as none was specified.")
|
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE
|
|
|
STRING "Choose the type of build." FORCE
|
|
|
)
|
|
|
|
|
|
# Set the possible values of build type for cmake-gui
|
|
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
|
|
|
STRINGS "Debug" "Release" "RelWithDebInfo"
|
|
|
)
|
|
|
endif()
|
|
|
|
|
|
# Add our repository's module path to CMake's module path list
|
|
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
|
|
|
|
|
|
# Platform Flags
|
|
|
if(APPLE)
|
|
|
set(CMAKE_MACOSX_RPATH ON)
|
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
|
|
|
elseif(WIN32)
|
|
|
# "FAudio.dll", not "libFAudio.dll"
|
|
|
set(CMAKE_SHARED_LIBRARY_PREFIX "")
|
|
|
endif()
|
|
|
|
|
|
# Helper function for finding/installing MinGW libs
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
include(cmake/install_shared_libs.cmake)
|
|
|
endif()
|
|
|
|
|
|
# Source lists
|
|
|
add_library(FAudio
|
|
|
# Public Headers
|
|
|
include/F3DAudio.h
|
|
|
include/FACT3D.h
|
|
|
include/FACT.h
|
|
|
include/FAPOBase.h
|
|
|
include/FAPOFX.h
|
|
|
include/FAPO.h
|
|
|
include/FAudioFX.h
|
|
|
include/FAudio.h
|
|
|
# Internal Headers
|
|
|
src/FACT_internal.h
|
|
|
src/FAudio_internal.h
|
|
|
src/stb.h
|
|
|
src/stb_vorbis.h
|
|
|
# Source Files
|
|
|
src/F3DAudio.c
|
|
|
src/FACT3D.c
|
|
|
src/FACT.c
|
|
|
src/FACT_internal.c
|
|
|
src/FAPOBase.c
|
|
|
src/FAPOFX.c
|
|
|
src/FAPOFX_echo.c
|
|
|
src/FAPOFX_eq.c
|
|
|
src/FAPOFX_masteringlimiter.c
|
|
|
src/FAPOFX_reverb.c
|
|
|
src/FAudio.c
|
|
|
src/FAudioFX_reverb.c
|
|
|
src/FAudioFX_volumemeter.c
|
|
|
src/FAudio_internal.c
|
|
|
src/FAudio_internal_simd.c
|
|
|
src/FAudio_operationset.c
|
|
|
src/FAudio_platform_sdl2.c
|
|
|
# Optional source files
|
|
|
src/XNA_Song.c
|
|
|
src/FAudio_ffmpeg.c
|
|
|
)
|
|
|
|
|
|
# Only disable DebugConfiguration in release builds
|
|
|
if(NOT FORCE_ENABLE_DEBUGCONFIGURATION)
|
|
|
target_compile_definitions(FAudio PRIVATE $<$<CONFIG:Release>:FAUDIO_DISABLE_DEBUGCONFIGURATION>)
|
|
|
endif()
|
|
|
|
|
|
# FAudio_assert Customization
|
|
|
if(LOG_ASSERTIONS)
|
|
|
target_compile_definitions(FAudio PUBLIC FAUDIO_LOG_ASSERTIONS)
|
|
|
endif()
|
|
|
|
|
|
# FAudio folders as includes, for other targets to consume
|
|
|
target_include_directories(FAudio PUBLIC
|
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
|
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
|
)
|
|
|
|
|
|
# MinGW builds should statically link libgcc
|
|
|
if(MINGW)
|
|
|
target_link_libraries(FAudio PRIVATE -static-libgcc)
|
|
|
endif()
|
|
|
|
|
|
# Soname
|
|
|
set_target_properties(FAudio PROPERTIES OUTPUT_NAME "FAudio"
|
|
|
VERSION ${LIB_VERSION}
|
|
|
SOVERSION ${LIB_MAJOR_VERSION}
|
|
|
)
|
|
|
|
|
|
# XNA_Song Support
|
|
|
if(NOT XNASONG)
|
|
|
target_compile_definitions(FAudio PRIVATE DISABLE_XNASONG)
|
|
|
endif()
|
|
|
|
|
|
# FFmpeg Support
|
|
|
if(FFMPEG)
|
|
|
# Add the extra definition...
|
|
|
target_compile_definitions(FAudio PRIVATE HAVE_FFMPEG=1)
|
|
|
|
|
|
# Find FFmpeg...
|
|
|
find_package(FFmpeg COMPONENTS
|
|
|
avcodec
|
|
|
avutil # dep of avcodec
|
|
|
swresample # dep of avcodec
|
|
|
REQUIRED
|
|
|
)
|
|
|
|
|
|
# Include/Link FFmpeg...
|
|
|
target_include_directories(FAudio PRIVATE ${FFmpeg_INCLUDE_DIRS})
|
|
|
target_link_libraries(FAudio PRIVATE ${FFmpeg_LIBRARIES})
|
|
|
|
|
|
# Install FFmpeg for MinGW target
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(FILES ${FFmpeg_LIBRARIES} DESTINATION bin NO_INSTALL_SYMLINKS REQUIRED)
|
|
|
endif()
|
|
|
endif(FFMPEG)
|
|
|
|
|
|
# Dump source voices to RIFF WAVE files
|
|
|
if(DUMP_VOICES)
|
|
|
target_compile_definitions(FAudio PRIVATE FAUDIO_DUMP_VOICES)
|
|
|
endif()
|
|
|
|
|
|
# SDL2 Dependency
|
|
|
if (DEFINED SDL2_INCLUDE_DIRS AND DEFINED SDL2_LIBRARIES)
|
|
|
message(STATUS "using pre-defined SDL2 variables SDL2_INCLUDE_DIRS and SDL2_LIBRARIES")
|
|
|
target_include_directories(FAudio PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
|
|
|
target_link_libraries(FAudio PUBLIC ${SDL2_LIBRARIES})
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(${SDL2_LIBRARIES} DESTINATION bin NO_INSTALL_SYMLINKS)
|
|
|
endif()
|
|
|
else()
|
|
|
# Only try to autodetect if both SDL2 variables aren't explicitly set
|
|
|
find_package(SDL2 CONFIG)
|
|
|
if (TARGET SDL2::SDL2)
|
|
|
message(STATUS "using TARGET SDL2::SDL2")
|
|
|
target_link_libraries(FAudio PUBLIC SDL2::SDL2)
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(TARGETS SDL2::SDL2 DESTINATION bin NO_INSTALL_SYMLINKS REQUIRED)
|
|
|
endif()
|
|
|
elseif (TARGET SDL2)
|
|
|
message(STATUS "using TARGET SDL2")
|
|
|
target_link_libraries(FAudio PUBLIC SDL2)
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(TARGETS SDL2 DESTINATION bin NO_INSTALL_SYMLINKS REQUIRED)
|
|
|
endif()
|
|
|
else()
|
|
|
message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables")
|
|
|
target_include_directories(FAudio PUBLIC "$<BUILD_INTERFACE:${SDL2_INCLUDE_DIRS}>")
|
|
|
target_link_libraries(FAudio PUBLIC ${SDL2_LIBRARIES})
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(${SDL2_LIBRARIES} DESTINATION bin NO_INSTALL_SYMLINKS)
|
|
|
endif()
|
|
|
endif()
|
|
|
endif()
|
|
|
|
|
|
# utils/ Folder
|
|
|
if(BUILD_UTILS)
|
|
|
# Shared ImGui Framework
|
|
|
add_library(uicommon STATIC
|
|
|
utils/uicommon/FAudioUI_main.cpp
|
|
|
utils/uicommon/FAudioUI_ui.cpp
|
|
|
utils/uicommon/glfuncs.h
|
|
|
utils/uicommon/glmacros.h
|
|
|
utils/uicommon/imconfig.h
|
|
|
utils/uicommon/imgui.cpp
|
|
|
utils/uicommon/imgui_demo.cpp
|
|
|
utils/uicommon/imgui_draw.cpp
|
|
|
utils/uicommon/imgui_widgets.cpp
|
|
|
utils/uicommon/imgui.h
|
|
|
utils/uicommon/imgui_internal.h
|
|
|
utils/uicommon/imstb_rectpack.h
|
|
|
utils/uicommon/imstb_textedit.h
|
|
|
utils/uicommon/imstb_truetype.h
|
|
|
)
|
|
|
target_link_libraries(uicommon PUBLIC FAudio)
|
|
|
|
|
|
# Shared WAV Resources
|
|
|
add_library(wavs STATIC utils/wavcommon/wavs.cpp)
|
|
|
target_compile_definitions(wavs PUBLIC
|
|
|
RESOURCE_PATH="${CMAKE_SOURCE_DIR}/utils/wavcommon/resources"
|
|
|
)
|
|
|
|
|
|
# These tools do NOT use uicommon
|
|
|
add_executable(testparse utils/testparse/testparse.c)
|
|
|
target_link_libraries(testparse PRIVATE FAudio)
|
|
|
add_executable(testxwma utils/testxwma/testxwma.cpp)
|
|
|
target_link_libraries(testxwma PRIVATE FAudio)
|
|
|
add_executable(showriffheader utils/showriffheader/showriffheader.cpp)
|
|
|
target_link_libraries(showriffheader PRIVATE FAudio)
|
|
|
|
|
|
# These tools use uicommon, but NOT wavs
|
|
|
add_executable(facttool utils/facttool/facttool.cpp)
|
|
|
target_link_libraries(facttool PRIVATE uicommon)
|
|
|
add_executable(testfilter
|
|
|
utils/testfilter/audio.cpp
|
|
|
utils/testfilter/audio_faudio.cpp
|
|
|
utils/testfilter/audio.h
|
|
|
utils/testfilter/audio_player.h
|
|
|
utils/testfilter/audio_xaudio.cpp
|
|
|
utils/testfilter/oscillator.cpp
|
|
|
utils/testfilter/oscillator.h
|
|
|
utils/testfilter/testfilter.cpp
|
|
|
)
|
|
|
target_link_libraries(testfilter PRIVATE uicommon)
|
|
|
|
|
|
# These tools use both uicommon and wavs
|
|
|
add_executable(testreverb
|
|
|
utils/testreverb/audio.cpp
|
|
|
utils/testreverb/audio_faudio.cpp
|
|
|
utils/testreverb/audio.h
|
|
|
utils/testreverb/audio_xaudio.cpp
|
|
|
utils/testreverb/testreverb.cpp
|
|
|
)
|
|
|
target_link_libraries(testreverb PRIVATE uicommon wavs)
|
|
|
add_executable(testvolumemeter
|
|
|
utils/testvolumemeter/audio.cpp
|
|
|
utils/testvolumemeter/audio_faudio.cpp
|
|
|
utils/testvolumemeter/audio.h
|
|
|
utils/testvolumemeter/testvolumemeter.cpp
|
|
|
)
|
|
|
target_link_libraries(testvolumemeter PRIVATE uicommon wavs)
|
|
|
endif()
|
|
|
|
|
|
# define install directories
|
|
|
# on mingw-w64 cross compilation $CMAKE_INSTALL_LIBDIR is set to an absolute
|
|
|
# path. Work around that by hard coding the directories on windows
|
|
|
if(WIN32)
|
|
|
set(FAudio_INSTALL_INCLUDEDIR include)
|
|
|
set(FAudio_INSTALL_BINDIR bin)
|
|
|
set(FAudio_INSTALL_LIBDIR lib)
|
|
|
else()
|
|
|
include(GNUInstallDirs)
|
|
|
set(FAudio_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
set(FAudio_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
|
|
|
set(FAudio_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
|
|
endif()
|
|
|
|
|
|
# cpp/ Folder
|
|
|
if(BUILD_CPP)
|
|
|
# XAPOBase, used by XAudio2 and XAPOFX
|
|
|
add_library(XAPOBase STATIC
|
|
|
cpp/XAPOBase.cpp
|
|
|
)
|
|
|
target_compile_definitions(XAPOBase PRIVATE
|
|
|
FAUDIOCPP_EXPORTS
|
|
|
_WIN32_WINNT=0x0600
|
|
|
)
|
|
|
target_link_libraries(XAPOBase PRIVATE FAudio)
|
|
|
if(MINGW)
|
|
|
target_link_libraries(XAPOBase PRIVATE
|
|
|
"-Wl,--enable-stdcall-fixup"
|
|
|
)
|
|
|
# Enable various compiler warnings
|
|
|
target_link_libraries(XAPOBase PRIVATE
|
|
|
-Wall -pedantic
|
|
|
-Wsign-compare
|
|
|
-Wshadow
|
|
|
)
|
|
|
endif()
|
|
|
|
|
|
# We're about to make a whole bunch of DLLs...
|
|
|
set(FAudio_CPP_libs "")
|
|
|
|
|
|
# XAudio2 2.0-2.7
|
|
|
foreach(lib_version RANGE 0 7)
|
|
|
set(faudio_cpp_target "xaudio2_${lib_version}")
|
|
|
add_library(${faudio_cpp_target} SHARED
|
|
|
cpp/com_utils.cpp
|
|
|
cpp/xaudio2.cpp
|
|
|
cpp/XAudio2fx.cpp
|
|
|
cpp/win_registry.cpp
|
|
|
)
|
|
|
target_compile_definitions(${faudio_cpp_target} PRIVATE
|
|
|
"XAUDIO2_VERSION=${lib_version}"
|
|
|
)
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE XAPOBase)
|
|
|
list(APPEND FAudio_CPP_libs ${faudio_cpp_target})
|
|
|
endforeach()
|
|
|
|
|
|
# XAudio2 2.8-2.9
|
|
|
foreach(lib_version RANGE 8 9)
|
|
|
set(faudio_cpp_target "xaudio2_${lib_version}")
|
|
|
add_library(${faudio_cpp_target} SHARED
|
|
|
cpp/com_utils.cpp
|
|
|
cpp/xaudio2.cpp
|
|
|
cpp/XAudio2fx.cpp
|
|
|
cpp/win_device.cpp
|
|
|
cpp/X3DAudio.cpp
|
|
|
cpp/XAPOFX.cpp
|
|
|
)
|
|
|
target_compile_definitions(${faudio_cpp_target} PRIVATE
|
|
|
"XAUDIO2_VERSION=${lib_version}"
|
|
|
UNICODE
|
|
|
)
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE XAPOBase setupapi)
|
|
|
list(APPEND FAudio_CPP_libs ${faudio_cpp_target})
|
|
|
endforeach()
|
|
|
|
|
|
# X3DAudio 1.3-1.7
|
|
|
foreach(lib_version RANGE 3 7)
|
|
|
set(faudio_cpp_target "x3daudio1_${lib_version}")
|
|
|
add_library(${faudio_cpp_target} SHARED cpp/X3DAudio.cpp)
|
|
|
list(APPEND FAudio_CPP_libs ${faudio_cpp_target})
|
|
|
endforeach()
|
|
|
|
|
|
# XAPOFX 1.1-1.5
|
|
|
foreach(lib_version RANGE 1 5)
|
|
|
set(faudio_cpp_target "xapofx1_${lib_version}")
|
|
|
add_library(${faudio_cpp_target} SHARED
|
|
|
cpp/com_utils_xapofx.cpp
|
|
|
cpp/XAPOFX.cpp
|
|
|
)
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE XAPOBase)
|
|
|
list(APPEND FAudio_CPP_libs ${faudio_cpp_target})
|
|
|
endforeach()
|
|
|
|
|
|
# XACTEngine3 3.0-3.7
|
|
|
foreach(lib_version RANGE 0 7)
|
|
|
set(faudio_cpp_target "xactengine3_${lib_version}")
|
|
|
add_library(${faudio_cpp_target} SHARED
|
|
|
cpp/com_utils_xact.cpp
|
|
|
cpp/xact3.cpp
|
|
|
cpp/win_registry.cpp
|
|
|
)
|
|
|
target_compile_definitions(${faudio_cpp_target} PRIVATE
|
|
|
"XACT3_VERSION=${lib_version}"
|
|
|
)
|
|
|
list(APPEND FAudio_CPP_libs ${faudio_cpp_target})
|
|
|
endforeach()
|
|
|
|
|
|
# Common Libraries/Definitions
|
|
|
foreach(faudio_cpp_target ${FAudio_CPP_libs})
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE
|
|
|
ole32
|
|
|
FAudio
|
|
|
)
|
|
|
target_compile_definitions(${faudio_cpp_target} PRIVATE
|
|
|
FAUDIOCPP_EXPORTS
|
|
|
_WIN32_WINNT=0x0600
|
|
|
)
|
|
|
|
|
|
# MinGW builds should statically link libgcc/libstdc++
|
|
|
if(MINGW)
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE
|
|
|
"-Wl,--enable-stdcall-fixup"
|
|
|
"-static-libgcc -static-libstdc++"
|
|
|
)
|
|
|
# Enable various compiler warnings
|
|
|
target_link_libraries(${faudio_cpp_target} PRIVATE
|
|
|
-Wall -pedantic
|
|
|
-Wsign-compare
|
|
|
-Wshadow
|
|
|
)
|
|
|
endif()
|
|
|
endforeach()
|
|
|
|
|
|
# Add libraries to install target
|
|
|
install(TARGETS ${FAudio_CPP_libs}
|
|
|
RUNTIME DESTINATION ${FAudio_INSTALL_BINDIR}
|
|
|
LIBRARY DESTINATION ${FAudio_INSTALL_LIBDIR}
|
|
|
ARCHIVE DESTINATION ${FAudio_INSTALL_LIBDIR}
|
|
|
)
|
|
|
# Add Wine install script to install target
|
|
|
install(PROGRAMS cpp/scripts/wine_setup_native
|
|
|
DESTINATION ${FAudio_INSTALL_BINDIR}
|
|
|
)
|
|
|
# Install runtime dependencies
|
|
|
if(INSTALL_MINGW_DEPENDENCIES)
|
|
|
install_shared_libs(-lwinpthread-1 -lwinpthread -liconv DESTINATION bin NO_INSTALL_SYMLINKS)
|
|
|
endif()
|
|
|
endif()
|
|
|
|
|
|
# tests/ Folder
|
|
|
if(BUILD_TESTS)
|
|
|
add_executable(faudio_tests tests/xaudio2.c)
|
|
|
target_link_libraries(faudio_tests PRIVATE FAudio)
|
|
|
endif()
|
|
|
|
|
|
# Installation
|
|
|
|
|
|
# Public Headers...
|
|
|
install(
|
|
|
DIRECTORY include/
|
|
|
DESTINATION ${FAudio_INSTALL_INCLUDEDIR}
|
|
|
)
|
|
|
# Libraries...
|
|
|
install(
|
|
|
TARGETS ${PROJECT_NAME}
|
|
|
EXPORT ${PROJECT_NAME}-targets
|
|
|
INCLUDES DESTINATION ${FAudio_INSTALL_INCLUDEDIR}
|
|
|
RUNTIME DESTINATION ${FAudio_INSTALL_BINDIR}
|
|
|
LIBRARY DESTINATION ${FAudio_INSTALL_LIBDIR}
|
|
|
ARCHIVE DESTINATION ${FAudio_INSTALL_LIBDIR}
|
|
|
)
|
|
|
|
|
|
# Generate cmake-config file, install CMake files
|
|
|
include(CMakePackageConfigHelpers)
|
|
|
configure_package_config_file(
|
|
|
cmake/config.cmake.in
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config.cmake
|
|
|
INSTALL_DESTINATION ${FAudio_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
|
|
|
)
|
|
|
install(
|
|
|
FILES ${CMAKE_CURRENT_BINARY_DIR}/generated/${PROJECT_NAME}-config.cmake
|
|
|
DESTINATION ${FAudio_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
|
|
|
)
|
|
|
install(
|
|
|
EXPORT ${PROJECT_NAME}-targets
|
|
|
NAMESPACE ${PROJECT_NAME}::
|
|
|
DESTINATION ${FAudio_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
|
|
|
)
|
|
|
|