################################################################################ # Copyright 2009-2016 Jörg Müller # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ################################################################################ cmake_minimum_required(VERSION 3.0) include(CMakeDependentOption) if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) endif() project(audaspace) set(AUDASPACE_VERSION 1.3) set(AUDASPACE_LONG_VERSION ${AUDASPACE_VERSION}.0) if(DEFINED AUDASPACE_CMAKE_CFG) include(${AUDASPACE_CMAKE_CFG}) endif() if(NOT DEFINED AUDASPACE_STANDALONE) set(AUDASPACE_STANDALONE TRUE) endif() # sources set(SRC src/devices/DefaultSynchronizer.cpp src/devices/DeviceManager.cpp src/devices/NULLDevice.cpp src/devices/ReadDevice.cpp src/devices/SoftwareDevice.cpp src/devices/ThreadedDevice.cpp src/Exception.cpp src/file/File.cpp src/file/FileManager.cpp src/file/FileWriter.cpp src/fx/Accumulator.cpp src/fx/ADSR.cpp src/fx/ADSRReader.cpp src/fx/BaseIIRFilterReader.cpp src/fx/ButterworthCalculator.cpp src/fx/Butterworth.cpp src/fx/CallbackIIRFilterReader.cpp src/fx/Delay.cpp src/fx/DelayReader.cpp src/fx/DynamicIIRFilter.cpp src/fx/DynamicIIRFilterReader.cpp src/fx/DynamicMusic.cpp src/fx/Effect.cpp src/fx/EffectReader.cpp src/fx/Envelope.cpp src/fx/Fader.cpp src/fx/FaderReader.cpp src/fx/HighpassCalculator.cpp src/fx/Highpass.cpp src/fx/IIRFilter.cpp src/fx/IIRFilterReader.cpp src/fx/Limiter.cpp src/fx/LimiterReader.cpp src/fx/Loop.cpp src/fx/LoopReader.cpp src/fx/LowpassCalculator.cpp src/fx/Lowpass.cpp src/fx/Modulator.cpp src/fx/ModulatorReader.cpp src/fx/MutableReader.cpp src/fx/MutableSound.cpp src/fx/Pitch.cpp src/fx/PitchReader.cpp src/fx/PlaybackManager.cpp src/fx/PlaybackCategory.cpp src/fx/Reverse.cpp src/fx/ReverseReader.cpp src/fx/SoundList.cpp src/fx/Source.cpp src/fx/Sum.cpp src/fx/Threshold.cpp src/fx/Volume.cpp src/fx/VolumeReader.cpp src/fx/VolumeSound.cpp src/fx/VolumeStorage.cpp src/generator/Sawtooth.cpp src/generator/SawtoothReader.cpp src/generator/Silence.cpp src/generator/SilenceReader.cpp src/generator/Sine.cpp src/generator/SineReader.cpp src/generator/Square.cpp src/generator/SquareReader.cpp src/generator/Triangle.cpp src/generator/TriangleReader.cpp src/respec/ChannelMapper.cpp src/respec/ChannelMapperReader.cpp src/respec/Converter.cpp src/respec/ConverterFunctions.cpp src/respec/ConverterReader.cpp src/respec/JOSResample.cpp src/respec/JOSResampleReaderCoeff.cpp src/respec/JOSResampleReader.cpp src/respec/LinearResample.cpp src/respec/LinearResampleReader.cpp src/respec/Mixer.cpp src/respec/ResampleReader.cpp src/respec/SpecsChanger.cpp src/sequence/AnimateableProperty.cpp src/sequence/Double.cpp src/sequence/DoubleReader.cpp src/sequence/PingPong.cpp src/sequence/Sequence.cpp src/sequence/SequenceData.cpp src/sequence/SequenceEntry.cpp src/sequence/SequenceHandle.cpp src/sequence/SequenceReader.cpp src/sequence/Superpose.cpp src/sequence/SuperposeReader.cpp src/util/Barrier.cpp src/util/Buffer.cpp src/util/BufferReader.cpp src/util/RingBuffer.cpp src/util/StreamBuffer.cpp src/util/ThreadPool.cpp ) set(PRIVATE_HDR src/sequence/SequenceHandle.h ) set(PUBLIC_HDR include/devices/DefaultSynchronizer.h include/devices/DeviceManager.h include/devices/I3DDevice.h include/devices/I3DHandle.h include/devices/IDeviceFactory.h include/devices/IDevice.h include/devices/IHandle.h include/devices/ISynchronizer.h include/devices/NULLDevice.h include/devices/ReadDevice.h include/devices/SoftwareDevice.h include/devices/ThreadedDevice.h include/Exception.h include/file/File.h include/file/FileInfo.h include/file/FileManager.h include/file/FileWriter.h include/file/IFileInput.h include/file/IFileOutput.h include/file/IWriter.h include/fx/Accumulator.h include/fx/ADSR.h include/fx/ADSRReader.h include/fx/BaseIIRFilterReader.h include/fx/ButterworthCalculator.h include/fx/Butterworth.h include/fx/CallbackIIRFilterReader.h include/fx/Delay.h include/fx/DelayReader.h include/fx/DynamicIIRFilter.h include/fx/DynamicIIRFilterReader.h include/fx/DynamicMusic.h include/fx/Effect.h include/fx/EffectReader.h include/fx/Envelope.h include/fx/Fader.h include/fx/FaderReader.h include/fx/HighpassCalculator.h include/fx/Highpass.h include/fx/IDynamicIIRFilterCalculator.h include/fx/IIRFilter.h include/fx/IIRFilterReader.h include/fx/Limiter.h include/fx/LimiterReader.h include/fx/Loop.h include/fx/LoopReader.h include/fx/LowpassCalculator.h include/fx/Lowpass.h include/fx/Modulator.h include/fx/ModulatorReader.h include/fx/MutableReader.h include/fx/MutableSound.h include/fx/Pitch.h include/fx/PitchReader.h include/fx/PlaybackManager.h include/fx/PlaybackCategory.h include/fx/Reverse.h include/fx/ReverseReader.h include/fx/SoundList.h include/fx/Source.h include/fx/Sum.h include/fx/Threshold.h include/fx/Volume.h include/fx/VolumeReader.h include/fx/VolumeSound.h include/fx/VolumeStorage.h include/generator/Sawtooth.h include/generator/SawtoothReader.h include/generator/Silence.h include/generator/SilenceReader.h include/generator/Sine.h include/generator/SineReader.h include/generator/Square.h include/generator/SquareReader.h include/generator/Triangle.h include/generator/TriangleReader.h include/IReader.h include/ISound.h include/plugin/PluginManager.h include/respec/ChannelMapper.h include/respec/ChannelMapperReader.h include/respec/ConverterFunctions.h include/respec/Converter.h include/respec/ConverterReader.h include/respec/JOSResample.h include/respec/JOSResampleReader.h include/respec/LinearResample.h include/respec/LinearResampleReader.h include/respec/Mixer.h include/respec/ResampleReader.h include/respec/Specification.h include/respec/SpecsChanger.h include/sequence/AnimateableProperty.h include/sequence/Double.h include/sequence/DoubleReader.h include/sequence/PingPong.h include/sequence/SequenceData.h include/sequence/SequenceEntry.h include/sequence/Sequence.h include/sequence/SequenceReader.h include/sequence/Superpose.h include/sequence/SuperposeReader.h include/util/Barrier.h include/util/Buffer.h include/util/BufferReader.h include/util/ILockable.h include/util/Math3D.h include/util/RingBuffer.h include/util/StreamBuffer.h include/util/ThreadPool.h ) set(HDR ${PRIVATE_HDR} ${PUBLIC_HDR}) set(INCLUDE ${CMAKE_CURRENT_BINARY_DIR} include) if(WIN32) set(LIBRARIES) if(AUDASPACE_STANDALONE) set(DLLS) set(LIBRARY_PATH "../lib" CACHE PATH "Path which contains the libraries.") file(GLOB LIBRARY_DIRS ${LIBRARY_PATH}/*) list(APPEND CMAKE_PREFIX_PATH ${LIBRARY_DIRS}) endif() else() set(LIBRARIES ${CMAKE_DL_LIBS} -lpthread) endif() set(STATIC_PLUGINS "") # dependencies if(AUDASPACE_STANDALONE) set(PACKAGE_OPTION QUIET) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") option(BUILD_DEMOS "Build and install demos" TRUE) option(SHARED_LIBRARY "Build Shared Library" TRUE) option(WITH_C "Build C Module" TRUE) option(WITH_DOCS "Build C++ HTML Documentation with Doxygen" TRUE) option(WITH_FFMPEG "Build With FFMPEG" TRUE) option(WITH_FFTW "Build With FFTW" TRUE) option(WITH_JACK "Build With Plugin" TRUE) option(WITH_LIBSNDFILE "Build With LibSndFile" TRUE) option(WITH_OPENAL "Build With OpenAL" TRUE) option(WITH_PYTHON "Build With Python Library" TRUE) option(WITH_SDL "Build With SDL" TRUE) option(WITH_STRICT_DEPENDENCIES "Error and abort instead of warning if a library is not found." FALSE) if(APPLE) option(WITH_COREAUDIO "Build With CoreAudio" TRUE) endif() if(NOT WIN32 AND NOT APPLE) option(WITH_PULSEAUDIO "Build With PulseAudio" TRUE) endif() if(WIN32) option(WITH_WASAPI "Build With WASAPI" TRUE) endif() if(WITH_STRICT_DEPENDENCIES) set(PACKAGE_OPTION REQUIRED) endif() endif() if(AUDASPACE_STANDALONE) if(WIN32 OR APPLE) set(DEFAULT_PLUGIN_PATH "." CACHE STRING "Default plugin installation and loading path.") set(DOCUMENTATION_INSTALL_PATH "doc" CACHE PATH "Path where the documentation is installed.") else() set(DEFAULT_PLUGIN_PATH "${CMAKE_INSTALL_PREFIX}/share/audaspace/plugins" CACHE STRING "Default plugin installation and loading path.") set(DOCUMENTATION_INSTALL_PATH "share/doc/audaspace" CACHE PATH "Path where the documentation is installed.") endif() endif() if(AUDASPACE_STANDALONE) cmake_dependent_option(SEPARATE_C "Build C Binding as separate library" TRUE "WITH_C" FALSE) cmake_dependent_option(PLUGIN_COREAUDIO "Build CoreAudio Plugin" TRUE "WITH_COREAUDIO;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_FFMPEG "Build FFMPEG Plugin" TRUE "WITH_FFMPEG;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_JACK "Build JACK Plugin" TRUE "WITH_JACK;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_LIBSNDFILE "Build LibSndFile Plugin" TRUE "WITH_LIBSNDFILE;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_OPENAL "Build OpenAL Plugin" TRUE "WITH_OPENAL;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_PULSEAUDIO "Build PulseAudio Plugin" TRUE "WITH_PULSEAUDIO;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_SDL "Build SDL Plugin" TRUE "WITH_SDL;SHARED_LIBRARY" FALSE) cmake_dependent_option(PLUGIN_WASAPI "Build WASAPI Plugin" TRUE "WITH_WASAPI;SHARED_LIBRARY" FALSE) cmake_dependent_option(WITH_PYTHON_MODULE "Build Python Module" TRUE "WITH_PYTHON" FALSE) cmake_dependent_option(USE_SDL2 "Use SDL2 instead of 1 if available" TRUE "WITH_SDL" FALSE) cmake_dependent_option(DYNLOAD_JACK "Dynamically load JACK" FALSE "WITH_JACK" FALSE) cmake_dependent_option(DYNLOAD_PULSEAUDIO "Dynamically load PulseAudio" FALSE "WITH_PULSEAUDIO" FALSE) cmake_dependent_option(WITH_BINDING_DOCS "Build C/Python HTML Documentation with Sphinx" TRUE "WITH_PYTHON_MODULE" FALSE) endif() # compiler options if(AUDASPACE_STANDALONE) if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") add_definitions(-std=c++11) list(APPEND CMAKE_C_COMPILER_FLAGS "-fvisibility=hidden") list(APPEND CMAKE_CXX_COMPILER_FLAGS "-fvisibility=hidden") endif() if(MSVC) list(APPEND CMAKE_C_FLAGS_DEBUG "/Zi /Od") list(APPEND CMAKE_CXX_FLAGS_DEBUG "/Zi /Od") list(APPEND CMAKE_SHARED_LINKER_FLAGS_DEBUG "/DEBUG") list(APPEND CMAKE_STATIC_LINKER_FLAGS_DEBUG "/DEBUG") list(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG") if(SHARED_LIBRARY) include(GenerateExportHeader) endif() endif() if(APPLE AND NOT CMAKE_OSX_DEPLOYMENT_TARGET) set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "" FORCE) endif() endif() if(MSVC) add_definitions( /D_USE_MATH_DEFINES /EHsc /DNOMINMAX /D_STDINT_H ) endif() # platform specific options if(MSYS OR MINGW) add_definitions(-D_USE_MATH_DEFINES) endif() # C if(WITH_C) set(C_SRC bindings/C/AUD_ThreadPool.cpp bindings/C/AUD_Source.cpp bindings/C/AUD_Device.cpp bindings/C/AUD_DynamicMusic.cpp bindings/C/AUD_Handle.cpp bindings/C/AUD_PlaybackManager.cpp bindings/C/AUD_Sequence.cpp bindings/C/AUD_Sound.cpp bindings/C/AUD_Special.cpp ) set(C_HDR bindings/C/AUD_ThreadPool.h bindings/C/AUD_Source.h bindings/C/AUD_Device.h bindings/C/AUD_DynamicMusic.h bindings/C/AUD_Handle.h bindings/C/AUD_PlaybackManager.h bindings/C/AUD_Sequence.h bindings/C/AUD_Sound.h bindings/C/AUD_Special.h bindings/C/AUD_Types.h ) if(WITH_FFTW) list(APPEND C_SRC bindings/C/AUD_HRTF.cpp bindings/C/AUD_ImpulseResponse.cpp ) list(APPEND C_HDR bindings/C/AUD_HRTF.h bindings/C/AUD_ImpulseResponse.h ) endif() if(NOT SEPARATE_C) list(APPEND SRC ${C_SRC}) list(APPEND HDR ${C_HDR}) else() set(AUDASPACE_C_LIBRARY -laudaspace-c) endif() endif() # CoreAudio if(WITH_COREAUDIO) find_library(COREAUDIO_LIBRARY CoreAudio) find_library(AUDIOUNIT_LIBRARY AudioUnit) find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox) find_path(AUDIOUNIT_INCLUDE_DIR AudioUnit/AudioUnit.h) find_path(AUDIOTOOLBOX_INCLUDE_DIR AudioToolbox/CoreAudioClock.h) if(COREAUDIO_LIBRARY AND AUDIOUNIT_LIBRARY AND AUDIOUNIT_INCLUDE_DIR) set(COREAUDIO_LIBRARIES ${COREAUDIO_LIBRARY} ${AUDIOUNIT_LIBRARY} ${AUDIOTOOLBOX_LIBRARY}) set(COREAUDIO_INCLUDE_DIRS ${AUDIOUNIT_INCLUDE_DIR} ${AUDIOTOOLBOX_INCLUDE_DIR}) set(COREAUDIO_SRC plugins/coreaudio/CoreAudioDevice.cpp plugins/coreaudio/CoreAudioSynchronizer.cpp ) set(COREAUDIO_HDR plugins/coreaudio/CoreAudioDevice.h plugins/coreaudio/CoreAudioSynchronizer.h ) if(NOT PLUGIN_COREAUDIO) list(APPEND INCLUDE ${COREAUDIO_INCLUDE_DIRS}) list(APPEND LIBRARIES ${COREAUDIO_LIBRARIES}) list(APPEND SRC ${COREAUDIO_SRC}) list(APPEND HDR ${COREAUDIO_HDR}) list(APPEND STATIC_PLUGINS CoreAudioDevice) endif() else() if(WITH_STRICT_DEPENDENCIES) message(FATAL_ERROR "CoreAudio not found!") else() if(AUDASPACE_STANDALONE) set(WITH_COREAUDIO FALSE CACHE BOOL "Build With CoreAudio" FORCE) else() set(WITH_COREAUDIO FALSE) endif() message(WARNING "CoreAudio not found, plugin will not be built.") endif() endif() endif() # FFMPEG if(WITH_FFMPEG) if(AUDASPACE_STANDALONE) find_package(FFMPEG ${PACKAGE_OPTION}) endif() if(FFMPEG_FOUND) set(FFMPEG_SRC plugins/ffmpeg/FFMPEG.cpp plugins/ffmpeg/FFMPEGReader.cpp plugins/ffmpeg/FFMPEGWriter.cpp ) set(FFMPEG_HDR plugins/ffmpeg/FFMPEG.h plugins/ffmpeg/FFMPEGReader.h plugins/ffmpeg/FFMPEGWriter.h ) if(NOT PLUGIN_FFMPEG) list(APPEND INCLUDE ${FFMPEG_INCLUDE_DIRS}) list(APPEND LIBRARIES ${FFMPEG_LIBRARIES}) list(APPEND SRC ${FFMPEG_SRC}) list(APPEND HDR ${FFMPEG_HDR}) list(APPEND STATIC_PLUGINS FFMPEG) endif() if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB FFMPEG_DLLS ${LIBRARY_PATH}/ffmpeg/bin/*.dll) list(APPEND DLLS ${FFMPEG_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_FFMPEG FALSE CACHE BOOL "Build With FFMPEG" FORCE) else() set(WITH_FFMPEG FALSE) endif() message(WARNING "FFMPEG not found, plugin will not be built.") endif() endif() # FFTW if(WITH_FFTW) if(AUDASPACE_STANDALONE) find_package(FFTW ${PACKAGE_OPTION}) endif() if(FFTW_FOUND) set(FFTW_SRC src/fx/BinauralSound.cpp src/fx/BinauralReader.cpp src/fx/Convolver.cpp src/fx/ConvolverReader.cpp src/fx/ConvolverSound.cpp src/fx/FFTConvolver.cpp src/fx/HRTF.cpp src/fx/ImpulseResponse.cpp src/util/FFTPlan.cpp ) set(FFTW_HDR include/fx/BinauralSound.h include/fx/BinauralReader.h include/fx/Convolver.h include/fx/ConvolverReader.h include/fx/ConvolverSound.h include/fx/FFTConvolver.h include/fx/HRTF.h include/fx/HRTFLoader.h include/fx/ImpulseResponse.h include/util/FFTPlan.h ) add_definitions(-DWITH_CONVOLUTION) list(APPEND INCLUDE ${FFTW_INCLUDE_DIR}) list(APPEND LIBRARIES ${FFTW_LIBRARY}) list(APPEND SRC ${FFTW_SRC}) list(APPEND HDR ${FFTW_HDR}) if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB FFTW_DLLS ${LIBRARY_PATH}/fftw/bin/*.dll) list(APPEND DLLS ${FFTW_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_FFTW FALSE CACHE BOOL "Build With FFTW" FORCE) else() set(WITH_FFTW FALSE) endif() message(WARNING "FFTW not found, convolution functionality will not be built.") endif() endif() # JACK if(WITH_JACK) if(AUDASPACE_STANDALONE) find_package(Jack ${PACKAGE_OPTION}) endif() if(JACK_FOUND) set(JACK_SRC plugins/jack/JackDevice.cpp plugins/jack/JackSynchronizer.cpp plugins/jack/JackLibrary.cpp ) set(JACK_HDR plugins/jack/JackDevice.h plugins/jack/JackSynchronizer.h plugins/jack/JackLibrary.h plugins/jack/JackSymbols.h ) if(DYNLOAD_JACK) add_definitions(-DDYNLOAD_JACK) endif() if(NOT PLUGIN_JACK) list(APPEND INCLUDE ${JACK_INCLUDE_DIRS}) if(NOT DYNLOAD_JACK) list(APPEND LIBRARIES ${JACK_LIBRARIES}) endif() list(APPEND SRC ${JACK_SRC}) list(APPEND HDR ${JACK_HDR}) list(APPEND STATIC_PLUGINS JackDevice) endif() if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB JACK_DLLS ${LIBRARY_PATH}/jack/bin/*.dll) list(APPEND DLLS ${JACK_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_JACK FALSE CACHE BOOL "Build With JACK" FORCE) else() set(WITH_JACK FALSE) endif() message(WARNING "JACK not found, plugin will not be built.") endif() endif() # LibSndFile if(WITH_LIBSNDFILE) if(AUDASPACE_STANDALONE) find_package(LibSndFile ${PACKAGE_OPTION}) endif() if(LIBSNDFILE_FOUND) set(LIBSNDFILE_SRC plugins/libsndfile/SndFile.cpp plugins/libsndfile/SndFileReader.cpp plugins/libsndfile/SndFileWriter.cpp ) set(LIBSNDFILE_HDR plugins/libsndfile/SndFile.h plugins/libsndfile/SndFileReader.h plugins/libsndfile/SndFileWriter.h ) if(NOT PLUGIN_LIBSNDFILE) list(APPEND INCLUDE ${LIBSNDFILE_INCLUDE_DIRS}) list(APPEND LIBRARIES ${LIBSNDFILE_LIBRARIES}) list(APPEND SRC ${LIBSNDFILE_SRC}) list(APPEND HDR ${LIBSNDFILE_HDR}) list(APPEND STATIC_PLUGINS SndFile) endif() if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB LIBSNDFILE_DLLS ${LIBRARY_PATH}/libsndfile/bin/*.dll) list(APPEND DLLS ${LIBSNDFILE_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_LIBSNDFILE FALSE CACHE BOOL "Build With LibSndFile" FORCE) else() set(WITH_LIBSNDFILE FALSE) endif() message(WARNING "LibSndFile not found, plugin will not be built.") endif() endif() # OpenAL if(WITH_OPENAL) if(AUDASPACE_STANDALONE) find_package(OpenAL ${PACKAGE_OPTION}) endif() if(OPENAL_FOUND) set(OPENAL_SRC plugins/openal/OpenALDevice.cpp plugins/openal/OpenALReader.cpp ) set(OPENAL_HDR plugins/openal/OpenALDevice.h plugins/openal/OpenALReader.h ) if(NOT PLUGIN_OPENAL) list(APPEND INCLUDE ${OPENAL_INCLUDE_DIR}) list(APPEND LIBRARIES ${OPENAL_LIBRARY}) list(APPEND SRC ${OPENAL_SRC}) list(APPEND HDR ${OPENAL_HDR}) list(APPEND STATIC_PLUGINS OpenALDevice) endif() if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB OPENAL_DLLS ${LIBRARY_PATH}/OpenAL/bin/*.dll) list(APPEND DLLS ${OPENAL_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_OPENAL FALSE CACHE BOOL "Build With OpenAL" FORCE) else() set(WITH_OPENAL FALSE) endif() message(WARNING "OpenAL not found, plugin will not be built.") endif() endif() # PulseAudio if(WITH_PULSEAUDIO) if(AUDASPACE_STANDALONE) find_package(LibPulse ${PACKAGE_OPTION}) endif() if(LIBPULSE_FOUND) set(PULSEAUDIO_SRC plugins/pulseaudio/PulseAudioDevice.cpp plugins/pulseaudio/PulseAudioLibrary.cpp ) set(PULSEAUDIO_HDR plugins/pulseaudio/PulseAudioDevice.h plugins/pulseaudio/PulseAudioLibrary.h plugins/pulseaudio/PulseAudioSymbols.h ) if(DYNLOAD_PULSEAUDIO) add_definitions(-DDYNLOAD_PULSEAUDIO) endif() if(NOT PLUGIN_PULSEAUDIO) list(APPEND INCLUDE ${LIBPULSE_INCLUDE_DIR}) if(NOT DYNLOAD_PULSEAUDIO) list(APPEND LIBRARIES ${LIBPULSE_LIBRARY}) endif() list(APPEND SRC ${PULSEAUDIO_SRC}) list(APPEND HDR ${PULSEAUDIO_HDR}) list(APPEND STATIC_PLUGINS PulseAudioDevice) endif() else() if(AUDASPACE_STANDALONE) set(WITH_PULSEAUDIO FALSE CACHE BOOL "Build With PulseAudio" FORCE) else() set(WITH_PULSEAUDIO FALSE) endif() message(WARNING "PulseAudio not found, plugin will not be built.") endif() endif() # Python if(WITH_PYTHON) if(AUDASPACE_STANDALONE) find_package(PythonLibs 3.2 ${PACKAGE_OPTION}) find_package(NumPy ${PACKAGE_OPTION}) endif() if(PYTHONLIBS_FOUND AND NUMPY_FOUND) list(APPEND INCLUDE ${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIRS}) if(WITH_PYTHON_MODULE) find_package(PythonInterp 3.2 ${PACKAGE_OPTION}) if(NOT PYTHONINTERP_FOUND) set(WITH_PYTHON_MODULE FALSE) message(WARNING "Python interpreter not found, module will not be built.") endif() endif() set(AUDASPACE_PY_LIBRARY -laudaspace-py) if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB PYTHON_DLLS ${LIBRARY_PATH}/Python/bin/*.dll) list(APPEND DLLS ${PYTHON_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_PYTHON FALSE CACHE BOOL "Build With Python Library" FORCE) else() set(WITH_PYTHON FALSE) endif() message(WARNING "Python & NumPy libraries not found, language binding will not be built.") endif() endif() # SDL if(WITH_SDL) if(AUDASPACE_STANDALONE) if(USE_SDL2) find_package(SDL2) if(SDL2_FOUND) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIR}) set(SDL_LIBRARY ${SDL2_LIBRARY}) set(SDL_FOUND TRUE) else() find_package(SDL ${PACKAGE_OPTION}) endif() else() find_package(SDL ${PACKAGE_OPTION}) endif() endif() if(SDL_FOUND) set(SDL_SRC plugins/sdl/SDLDevice.cpp ) set(SDL_HDR plugins/sdl/SDLDevice.h ) if(NOT PLUGIN_SDL) list(APPEND INCLUDE ${SDL_INCLUDE_DIR}) list(APPEND LIBRARIES ${SDL_LIBRARY}) list(APPEND SRC ${SDL_SRC}) list(APPEND HDR ${SDL_HDR}) list(APPEND STATIC_PLUGINS SDLDevice) endif() if(WIN32 AND AUDASPACE_STANDALONE) file(GLOB SDL_DLLS ${LIBRARY_PATH}/sdl/bin/*.dll) list(APPEND DLLS ${SDL_DLLS}) endif() else() if(AUDASPACE_STANDALONE) set(WITH_SDL FALSE CACHE BOOL "Build With SDL" FORCE) else() set(WITH_SDL FALSE) endif() message(WARNING "SDL not found, plugin will not be built.") endif() endif() # WASAPI if(WITH_WASAPI) set(WASAPI_SRC plugins/wasapi/WASAPIDevice.cpp ) set(WASAPI_HDR plugins/wasapi/WASAPIDevice.h ) if(NOT PLUGIN_WASAPI) list(APPEND LIBRARIES ksuser) list(APPEND SRC ${WASAPI_SRC}) list(APPEND HDR ${WASAPI_HDR}) list(APPEND STATIC_PLUGINS WASAPIDevice) endif() endif() # library configuration if(SHARED_LIBRARY) set(AUD_LIBRARY_TYPE AUD_SHARED_LIBRARY) set(LIBRARY_TYPE SHARED) add_definitions(-DAUD_BUILD_SHARED_LIBRARY) else() set(AUD_LIBRARY_TYPE AUD_STATIC_LIBRARY) set(LIBRARY_TYPE STATIC) endif() # file configuration configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config/Audaspace.h.in ${CMAKE_CURRENT_BINARY_DIR}/Audaspace.h ESCAPE_QUOTES @ONLY) list(APPEND HDR ${CMAKE_CURRENT_BINARY_DIR}/Audaspace.h) set(STATIC_PLUGIN_CLASSES "") set(STATIC_PLUGIN_REGISTERS "") foreach(PLUGIN ${STATIC_PLUGINS}) list(APPEND STATIC_PLUGIN_CLASSES "STATIC_PLUGIN_CLASS(" ${PLUGIN} ")\n") list(APPEND STATIC_PLUGIN_REGISTERS "\tSTATIC_PLUGIN_REGISTER(" ${PLUGIN} ")\n") endforeach() string(CONCAT STATIC_PLUGIN_CLASSES ${STATIC_PLUGIN_CLASSES}) string(CONCAT STATIC_PLUGIN_REGISTERS ${STATIC_PLUGIN_REGISTERS}) if(WIN32) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/plugin/PluginManagerWindows.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/PluginManager.cpp ESCAPE_QUOTES @ONLY) if(WITH_FFTW) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/fx/HRTFLoaderWindows.cpp ${CMAKE_CURRENT_BINARY_DIR}/HRTFLoader.cpp COPYONLY) endif() else() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/plugin/PluginManagerUnix.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/PluginManager.cpp ESCAPE_QUOTES @ONLY) if(WITH_FFTW) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/fx/HRTFLoaderUnix.cpp ${CMAKE_CURRENT_BINARY_DIR}/HRTFLoader.cpp COPYONLY) endif() endif() list(APPEND SRC ${CMAKE_CURRENT_BINARY_DIR}/PluginManager.cpp) if(WITH_FFTW) list(APPEND SRC ${CMAKE_CURRENT_BINARY_DIR}/HRTFLoader.cpp) endif() # directories include_directories(${INCLUDE}) link_directories() # install configuration if(WIN32) set(BIN_DESTINATION ".") else() set(BIN_DESTINATION "bin") endif() set(LIB_DESTINATION "lib${LIB_SUFFIX}") # library add_library(audaspace ${LIBRARY_TYPE} ${SRC} ${HDR}) target_link_libraries(audaspace ${LIBRARIES}) set_target_properties(audaspace PROPERTIES SOVERSION ${AUDASPACE_VERSION}) if(AUDASPACE_STANDALONE) install(TARGETS audaspace RUNTIME DESTINATION ${BIN_DESTINATION} LIBRARY DESTINATION ${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} ) install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION include/audaspace) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Audaspace.h DESTINATION include/audaspace) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/packages/pkgconfig/audaspace.pc.in ${CMAKE_CURRENT_BINARY_DIR}/audaspace.pc @ONLY) if(NOT WIN32 AND NOT APPLE) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/audaspace.pc DESTINATION "lib${LIB_SUFFIX}/pkgconfig") endif() endif() # plugins if(WITH_COREAUDIO AND PLUGIN_COREAUDIO) add_definitions(-DCOREAUDIO_PLUGIN) include_directories(${INCLUDE} ${COREAUDIO_INCLUDE_DIRS}) add_library(audcoreaudio SHARED ${COREAUDIO_SRC} ${COREAUDIO_HDR} ${HDR}) if(WITH_VERSIONED_PLUGINS) set_target_properties(audcoreaudio PROPERTIES SOVERSION ${AUDASPACE_VERSION}) endif() target_link_libraries(audcoreaudio audaspace ${COREAUDIO_LIBRARIES}) install(TARGETS audcoreaudio DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_FFMPEG AND PLUGIN_FFMPEG) add_definitions(-DFFMPEG_PLUGIN) include_directories(${INCLUDE} ${FFMPEG_INCLUDE_DIRS}) add_library(audffmpeg SHARED ${FFMPEG_SRC} ${FFMPEG_HDR} ${HDR}) target_link_libraries(audffmpeg audaspace ${FFMPEG_LIBRARIES}) set_target_properties(audffmpeg PROPERTIES SOVERSION ${AUDASPACE_VERSION}) install(TARGETS audffmpeg DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_JACK AND PLUGIN_JACK) add_definitions(-DJACK_PLUGIN) include_directories(${INCLUDE} ${JACK_INCLUDE_DIRS}) add_library(audjack SHARED ${JACK_SRC} ${JACK_HDR} ${HDR}) if(DYNLOAD_JACK) target_link_libraries(audjack audaspace) else() target_link_libraries(audjack audaspace ${JACK_LIBRARIES}) endif() set_target_properties(audjack PROPERTIES SOVERSION ${AUDASPACE_VERSION}) install(TARGETS audjack DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_LIBSNDFILE AND PLUGIN_LIBSNDFILE) add_definitions(-DLIBSNDFILE_PLUGIN) include_directories(${INCLUDE} ${LIBSNDFILE_INCLUDE_DIRS}) add_library(audlibsndfile SHARED ${LIBSNDFILE_SRC} ${LIBSNDFILE_HDR} ${HDR}) set_target_properties(audlibsndfile PROPERTIES SOVERSION ${AUDASPACE_VERSION}) target_link_libraries(audlibsndfile audaspace ${LIBSNDFILE_LIBRARIES}) install(TARGETS audlibsndfile DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_OPENAL AND PLUGIN_OPENAL) add_definitions(-DOPENAL_PLUGIN) include_directories(${INCLUDE} ${OPENAL_INCLUDE_DIR}) add_library(audopenal SHARED ${OPENAL_SRC} ${OPENAL_HDR} ${HDR}) set_target_properties(audopenal PROPERTIES SOVERSION ${AUDASPACE_VERSION}) target_link_libraries(audopenal audaspace ${OPENAL_LIBRARY}) install(TARGETS audopenal DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_PULSEAUDIO AND PLUGIN_PULSEAUDIO) add_definitions(-DPULSEAUDIO_PLUGIN) include_directories(${INCLUDE} ${LIBPULSE_INCLUDE_DIR}) add_library(audpulseaudio SHARED ${PULSEAUDIO_SRC} ${PULSEAUDIO_HDR} ${HDR}) set_target_properties(audpulseaudio PROPERTIES SOVERSION ${AUDASPACE_VERSION}) if(DYNLOAD_PULSEAUDIO) target_link_libraries(audpulseaudio audaspace) else() target_link_libraries(audpulseaudio audaspace ${LIBPULSE_LIBRARY}) endif() install(TARGETS audpulseaudio DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_SDL AND PLUGIN_SDL) add_definitions(-DSDL_PLUGIN) include_directories(${INCLUDE} ${SDL_INCLUDE_DIR}) add_library(audsdl SHARED ${SDL_SRC} ${SDL_HDR} ${HDR}) set_target_properties(audsdl PROPERTIES SOVERSION ${AUDASPACE_VERSION}) target_link_libraries(audsdl audaspace ${SDL_LIBRARY}) install(TARGETS audsdl DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() if(WITH_WASAPI AND PLUGIN_WASAPI) add_definitions(-DWASAPI_PLUGIN) include_directories(${INCLUDE}) add_library(audwasapi SHARED ${WASAPI_SRC} ${WASAPI_HDR} ${HDR}) if(WITH_VERSIONED_PLUGINS) set_target_properties(audwasapi PROPERTIES SOVERSION ${AUDASPACE_VERSION}) endif() target_link_libraries(audwasapi audaspace ksuser) install(TARGETS audwasapi DESTINATION ${DEFAULT_PLUGIN_PATH}) endif() # dlls if(WIN32) if(DLLS) install(FILES ${DLLS} DESTINATION ${BIN_DESTINATION}) endif() endif() # demos if(BUILD_DEMOS) include_directories(${INCLUDE}) set(DEMOS audainfo audaplay audaconvert audaremap signalgen randsounds dynamicmusic playbackmanager) add_executable(audainfo demos/audainfo.cpp) target_link_libraries(audainfo audaspace) add_executable(audaplay demos/audaplay.cpp) target_link_libraries(audaplay audaspace) add_executable(audaconvert demos/audaconvert.cpp) target_link_libraries(audaconvert audaspace) add_executable(audaremap demos/audaremap.cpp) target_link_libraries(audaremap audaspace) add_executable(signalgen demos/signalgen.cpp) target_link_libraries(signalgen audaspace) add_executable(randsounds demos/randsounds.cpp) target_link_libraries(randsounds audaspace) add_executable(dynamicmusic demos/dynamicmusic.cpp) target_link_libraries(dynamicmusic audaspace) add_executable(playbackmanager demos/playbackmanager.cpp) target_link_libraries(playbackmanager audaspace) if(WITH_FFTW) list(APPEND DEMOS convolution binaural) add_executable(convolution demos/convolution.cpp) target_link_libraries(convolution audaspace) add_executable(binaural demos/binaural.cpp) target_link_libraries(binaural audaspace) endif() if(WITH_OPENAL) list(APPEND DEMOS openaldevices) add_executable(openaldevices demos/openaldevices.cpp) if(PLUGIN_OPENAL) target_link_libraries(openaldevices audaspace audopenal) else() target_link_libraries(openaldevices audaspace) endif() endif() install(TARGETS ${DEMOS} RUNTIME DESTINATION ${BIN_DESTINATION} LIBRARY DESTINATION ${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} ) endif() # bindings if(WITH_C) if(SEPARATE_C) add_library(audaspace-c ${LIBRARY_TYPE} ${C_SRC} ${C_HDR}) target_link_libraries(audaspace-c audaspace) set_target_properties(audaspace-c PROPERTIES SOVERSION ${AUDASPACE_VERSION}) install(TARGETS audaspace-c RUNTIME DESTINATION ${BIN_DESTINATION} LIBRARY DESTINATION ${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} ) endif() if(AUDASPACE_STANDALONE) install(FILES ${C_HDR} DESTINATION include/audaspace) endif() endif() if(WITH_PYTHON) set(PYTHON_SRC bindings/python/PyAPI.cpp bindings/python/PyDevice.cpp bindings/python/PyDynamicMusic.cpp bindings/python/PyHandle.cpp bindings/python/PyPlaybackManager.cpp bindings/python/PySequence.cpp bindings/python/PySequenceEntry.cpp bindings/python/PySound.cpp bindings/python/PySource.cpp bindings/python/PyThreadPool.cpp ) set(PYTHON_HDR bindings/python/PyAPI.h bindings/python/PyDevice.h bindings/python/PyDynamicMusic.h bindings/python/PyHandle.h bindings/python/PyPlaybackManager.h bindings/python/PySequence.h bindings/python/PySequenceEntry.h bindings/python/PySound.h bindings/python/PySource.h bindings/python/PyThreadPool.h ) if(WITH_FFTW) list(APPEND PYTHON_SRC bindings/python/PyHRTF.cpp bindings/python/PyImpulseResponse.cpp ) list(APPEND PYTHON_HDR bindings/python/PyHRTF.h bindings/python/PyImpulseResponse.h ) endif() add_library(audaspace-py ${LIBRARY_TYPE} ${PYTHON_SRC} ${PYTHON_HDR}) target_link_libraries(audaspace-py audaspace ${PYTHON_LIBRARIES}) set_target_properties(audaspace-py PROPERTIES SOVERSION ${AUDASPACE_VERSION}) if(AUDASPACE_STANDALONE) install(TARGETS audaspace-py RUNTIME DESTINATION ${BIN_DESTINATION} LIBRARY DESTINATION ${LIB_DESTINATION} ARCHIVE DESTINATION ${LIB_DESTINATION} ) install(FILES ${PYTHON_HDR} DESTINATION include/audaspace/python) endif() if(WITH_PYTHON_MODULE) set(PYTHON_SOURCE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bindings/python) configure_file(${PYTHON_SOURCE_DIRECTORY}/setup.py.in ${CMAKE_CURRENT_BINARY_DIR}/setup.py ESCAPE_QUOTES @ONLY) if(APPLE) add_custom_command(OUTPUT build COMMAND MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} ${PYTHON_EXECUTABLE} setup.py build DEPENDS ${PYTHON_SRC} ${PYTHON_HDR} setup.py) elseif(WIN32) set(ENV{VS100COMNTOOLS} $ENV{VS120COMNTOOLS}) add_custom_command(OUTPUT build COMMAND ${PYTHON_EXECUTABLE} setup.py build DEPENDS ${PYTHON_SRC} ${PYTHON_HDR} setup.py) else() add_custom_command(OUTPUT build COMMAND ${PYTHON_EXECUTABLE} setup.py build DEPENDS ${PYTHON_SRC} ${PYTHON_HDR} setup.py) endif() add_custom_target(pythonmodule ALL DEPENDS build SOURCES ${PYTHON_SOURCE_DIRECTORY}/setup.py.in ${PYTHON_SRC} ${PYTHON_HDR}) add_dependencies(pythonmodule audaspace) install(CODE "EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} setup.py install --root=\$ENV{DESTDIR} --prefix=${CMAKE_INSTALL_PREFIX})") endif() endif() # docs if(WITH_DOCS) find_package(Doxygen ${PACKAGE_OPTION}) if(DOXYGEN_FOUND AND DOXYGEN_DOT_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) add_custom_target(audaspace_doc ALL ${DOXYGEN_EXECUTABLE} Doxyfile COMMENT "Building C++ HTML documentation with Doxygen.") else() if(AUDASPACE_STANDALONE) set(WITH_DOCS FALSE CACHE BOOL "Build C++ HTML Documentation with Doxygen" FORCE) else() set(WITH_DOCS FALSE) endif() message(WARNING "Doxygen (and/or dot) not found, documentation will not be built.") endif() endif() if(WITH_BINDING_DOCS) find_package(Sphinx ${PACKAGE_OPTION}) if(SPHINX_FOUND) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/bindings/doc/conf.py.in ${CMAKE_CURRENT_BINARY_DIR}/conf.py @ONLY) add_custom_target(bindings_doc ALL COMMAND ${PYTHON_EXECUTABLE} setup.py --build-docs ${SPHINX_EXECUTABLE} -q -b html -c "${CMAKE_CURRENT_BINARY_DIR}" -d "${CMAKE_CURRENT_BINARY_DIR}/_doctrees" "${CMAKE_CURRENT_SOURCE_DIR}/bindings/doc" "${CMAKE_CURRENT_BINARY_DIR}/doc/bindings" DEPENDS pythonmodule COMMENT "Building C/Python HTML documentation with Sphinx.") else() if(AUDASPACE_STANDALONE) set(WITH_BINDING_DOCS FALSE CACHE BOOL "Build C/Python HTML Documentation with Sphinx" FORCE) else() set(WITH_BINDING_DOCS FALSE) endif() message(WARNING "Sphinx not found, binding documentation will not be built.") endif() endif() if(WITH_DOCS OR WITH_BINDING_DOCS) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc/ DESTINATION ${DOCUMENTATION_INSTALL_PATH}) endif()