From 59bb1ca949fcf276211ee05ed01c8a4dba272122 Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 11:49:36 +0200 Subject: [PATCH 01/21] Skeleton for playrec compilation with cmake --- CMakeLists.txt | 38 ++++++++++++++ README.md | 36 ++++++++++++- cmake/FindMatlab.cmake | 92 ++++++++++++++++++++++++++++++++ cmake/FindPortaudio.cmake | 107 ++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 20 +++++++ 5 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 cmake/FindMatlab.cmake create mode 100644 cmake/FindPortaudio.cmake create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a62aaee --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,38 @@ +cmake_minimum_required(VERSION 2.8) +set(CMAKE_C_COMPILER gcc) +set(CMAKE_CXX_COMPILER g++) + +project(PLAYREC) + +set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +add_definitions(/DMATLAB_MEX_FILE) #define matlab macros + +#CMake 'debug' build does an optimized build? +#TODO: Q&D now -check for compiler, and move to a separate file +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 -g") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g") + +IF(CMAKE_BUILD_TYPE MATCHES Debug) + message(STATUS "configuring DEBUG build...") + SET(CMAKE_BUILD_TYPE DEBUG) +ELSE(CMAKE_BUILD_TYPE MATCHES Debug) + message(STATUS "configuring RELEASE build...") + SET(CMAKE_BUILD_TYPE RELEASE) +ENDIF(CMAKE_BUILD_TYPE MATCHES Debug) + +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") + +find_package(Matlab REQUIRED) +find_package(Portaudio REQUIRED) + +IF(MATLAB_FOUND AND PORTAUDIO_FOUND) + set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}) + message(STATUS "All found, Playrec will be compiled.") + #FILE(GLOB matlab_stuff "*.m") + #INSTALL(FILES ${matlab_stuff} DESTINATION .) + add_subdirectory(src) + ELSE(MATLAB_FOUND AND PORTAUDIO_FOUND) + MESSAGE("Nothing will be built.") +ENDIF(MATLAB_FOUND AND PORTAUDIO_FOUND) + diff --git a/README.md b/README.md index 498b35e..19b5c13 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,38 @@ the need for reconfiguration. By using PortAudio to access the soundcard, Playrec should function on all platforms and with all host APIs that PortAudio supports. -To use this utility it must first be downloaded and compiled. +### Download and compilation with cmake +To use this utility it must first be downloaded and compiled. + +Clone the playrec repository from github + % git clone git@github.com:hbe72/playrec.git + +Ubuntu: + % sudo apt-get install cmake + % sudo apt-get install libportaudio-dev + +Mac: + Install homebrew install homebrew (see. brew.sh) + % brew install cmake + % brew install portaudio + +Compile: + % cd playrec + % mkdir build; cd build + % cmake .. + % make + % make install + +Windows: +To be verified. Should work. + +### Test the installation + +On Matlab command prompt at playrec directory: +>> playrec'(about') + +Clone playrec-examples from + % git clone git@github.com:PlayrecForMatlab/playrec-examples.git + +Add playrec to Matlab path and execute +>> test_playrec diff --git a/cmake/FindMatlab.cmake b/cmake/FindMatlab.cmake new file mode 100644 index 0000000..77574e7 --- /dev/null +++ b/cmake/FindMatlab.cmake @@ -0,0 +1,92 @@ +# - this module looks for Matlab +# Defines: +# MATLAB_INCLUDE_DIR: include path for mex.h +# MATLAB_LIBRARIES: required libraries: libmex, libmx +# MATLAB_MEX_LIBRARY: path to libmex + +SET(MATLAB_FOUND 0) +IF( "$ENV{MATLAB_ROOT}" STREQUAL "" ) + MESSAGE(STATUS "MATLAB_ROOT environment variable not set." ) + MESSAGE(STATUS "In Linux this can be done in your user .bashrc file by appending the corresponding line, e.g:" ) + MESSAGE(STATUS "export MATLAB_ROOT=/usr/local/MATLAB/R2012b" ) + MESSAGE(STATUS "In Windows this can be done by adding system variable, e.g:" ) + MESSAGE(STATUS "MATLAB_ROOT=D:\\Program Files\\MATLAB\\R2011a" ) +ELSE("$ENV{MATLAB_ROOT}" STREQUAL "" ) + + FIND_PATH(MATLAB_INCLUDE_DIR mex.h + $ENV{MATLAB_ROOT}/extern/include) + + INCLUDE_DIRECTORIES(${MATLAB_INCLUDE_DIR}) + + FIND_PATH( MATLAB_LINUX64_MEX_LIBRARY + NAMES libmex.so + PATHS $ENV{MATLAB_ROOT}/bin/glnxa64 + NO_DEFAULT_PATH) + + FIND_PATH( MATLAB_LINUX32_MEX_LIBRARY + NAMES libmex.so + PATHS $ENV{MATLAB_ROOT}/bin/glnx86 + NO_DEFAULT_PATH) + + FIND_PATH( MATLAB_MAC_MEX_LIBRARY + NAMES libmex.dylib + PATHS $ENV{MATLAB_ROOT}/bin/maci64 + NO_DEFAULT_PATH) + + FIND_PATH( MATLAB_WIN64_MEX_LIBRARY + NAMES libmex.dll mex.dll + PATHS $ENV{MATLAB_ROOT}/bin/win64 + NO_DEFAULT_PATH) + + FIND_PATH( MATLAB_WIN32_MEX_LIBRARY + NAMES libmex.dll mex.dll + PATHS $ENV{MATLAB_ROOT}/bin/win32 + NO_DEFAULT_PATH) + +ENDIF("$ENV{MATLAB_ROOT}" STREQUAL "" ) + +IF (MATLAB_LINUX64_MEX_LIBRARY) + SET (MATLAB_MEX_LIBRARY ${MATLAB_LINUX64_MEX_LIBRARY}) + SET (MATLAB_MEX_SUFFIX ".mexa64") +ENDIF (MATLAB_LINUX64_MEX_LIBRARY) + +IF (MATLAB_LINUX32_MEX_LIBRARY) + SET (MATLAB_MEX_LIBRARY ${MATLAB_LINUX32_MEX_LIBRARY}) + SET (MATLAB_MEX_SUFFIX ".mexglx") +ENDIF (MATLAB_LINUX32_MEX_LIBRARY) + +IF (MATLAB_MAC_MEX_LIBRARY) + SET (MATLAB_MEX_LIBRARY ${MATLAB_MAC_MEX_LIBRARY}) + SET (MATLAB_MEX_SUFFIX ".mexmaci64") +ENDIF (MATLAB_MAC_MEX_LIBRARY) + +IF (MATLAB_WIN64_MEX_LIBRARY) + SET (MATLAB_MEX_LIBRARY ${MATLAB_WIN64_MEX_LIBRARY}) + SET (MATLAB_MEX_SUFFIX ".mexw64") +ENDIF (MATLAB_WIN64_MEX_LIBRARY) + +IF (MATLAB_WIN32_MEX_LIBRARY) + SET (MATLAB_MEX_LIBRARY ${MATLAB_WIN32_MEX_LIBRARY}) + SET (MATLAB_MEX_SUFFIX ".mexw32") +ENDIF (MATLAB_WIN32_MEX_LIBRARY) + + +SET(MATLAB_MEX_LINK_FLAGS -L${MATLAB_MEX_LIBRARY} "-lmx -lmex -lmat -lmwservices -lut") + +IF(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) + SET(MATLAB_FOUND 1) + MESSAGE(STATUS "Matlab found:") + MESSAGE (STATUS " MATLAB_ROOT: $ENV{MATLAB_ROOT}") + MESSAGE (STATUS " MATLAB_MEX_LIBRARY: ${MATLAB_MEX_LIBRARY}") + MESSAGE (STATUS " MATLAB_MEX_SUFFIX: ${MATLAB_MEX_SUFFIX}") +ELSE(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) + MESSAGE(STATUS "Matlab not found") +ENDIF(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) + +MARK_AS_ADVANCED( + MATLAB_MEX_LINK_FLAGS + MATLAB_MEX_SUFFIX + MATLAB_INCLUDE_DIR + MATLAB_FOUND + MATLAB_ROOT +) diff --git a/cmake/FindPortaudio.cmake b/cmake/FindPortaudio.cmake new file mode 100644 index 0000000..158e20e --- /dev/null +++ b/cmake/FindPortaudio.cmake @@ -0,0 +1,107 @@ +# - Try to find Portaudio +# Once done this will define +# +# PORTAUDIO_FOUND - system has Portaudio +# PORTAUDIO_INCLUDE_DIRS - the Portaudio include directory +# PORTAUDIO_LIBRARIES - Link these to use Portaudio +# PORTAUDIO_DEFINITIONS - Compiler switches required for using Portaudio +# PORTAUDIO_VERSION - Portaudio version +# +# Copyright (c) 2006 Andreas Schneider +# +# Redistribution and use is allowed according to the terms of the New BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + + +if (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) + # in cache already + set(PORTAUDIO_FOUND TRUE) +else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) + if (NOT WIN32) + include(FindPkgConfig) + pkg_check_modules(PORTAUDIO2 portaudio-2.0) + endif (NOT WIN32) + + if (PORTAUDIO2_FOUND) + set(PORTAUDIO_INCLUDE_DIRS + ${PORTAUDIO2_INCLUDE_DIRS} + ) + if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(PORTAUDIO_LIBRARIES "${PORTAUDIO2_LIBRARY_DIRS}/lib${PORTAUDIO2_LIBRARIES}.dylib") + else (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(PORTAUDIO_LIBRARIES + ${PORTAUDIO2_LIBRARIES} + ) + endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(PORTAUDIO_VERSION + 19 + ) + set(PORTAUDIO_FOUND TRUE) + else (PORTAUDIO2_FOUND) + find_path(PORTAUDIO_INCLUDE_DIR + NAMES + portaudio.h + PATHS + /usr/include + /usr/local/include + /opt/local/include + /sw/include + ) + + find_library(PORTAUDIO_LIBRARY + NAMES + portaudio + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + find_path(PORTAUDIO_LIBRARY_DIR + NAMES + portaudio + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + set(PORTAUDIO_INCLUDE_DIRS + ${PORTAUDIO_INCLUDE_DIR} + ) + set(PORTAUDIO_LIBRARIES + ${PORTAUDIO_LIBRARY} + ) + + set(PORTAUDIO_LIBRARY_DIRS + ${PORTAUDIO_LIBRARY_DIR} + ) + + set(PORTAUDIO_VERSION + 18 + ) + + if (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) + set(PORTAUDIO_FOUND TRUE) + endif (PORTAUDIO_INCLUDE_DIRS AND PORTAUDIO_LIBRARIES) + + if (PORTAUDIO_FOUND) + if (NOT Portaudio_FIND_QUIETLY) + message(STATUS "Found Portaudio: ${PORTAUDIO_LIBRARIES}") + endif (NOT Portaudio_FIND_QUIETLY) + else (PORTAUDIO_FOUND) + if (Portaudio_FIND_REQUIRED) + message(FATAL_ERROR "Could not find Portaudio") + endif (Portaudio_FIND_REQUIRED) + endif (PORTAUDIO_FOUND) + endif (PORTAUDIO2_FOUND) + + + # show the PORTAUDIO_INCLUDE_DIRS and PORTAUDIO_LIBRARIES variables only in the advanced view + mark_as_advanced(PORTAUDIO_INCLUDE_DIRS PORTAUDIO_LIBRARIES) + +endif (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..b462f0b --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,20 @@ +# compile mex +cmake_minimum_required(VERSION 2.8) + +set(PLAYREC_SOURCE_FILES + pa_dll_playrec.c + mex_dll_core.c + ) +set(PLAYREC_HEADER_FILES + pa_dll_playrec.h + mex_dll_core.h + ) + +include_directories(${MATLAB_INCLUDE_DIR} ${PORTAUDIO_INCLUDE_DIRS}) + +add_library(playrec SHARED ${PLAYREC_SOURCE_FILES}) +target_link_libraries(playrec ${MATLAB_MEX_LINK_FLAGS} ${PORTAUDIO_LIBRARIES}) +SET_TARGET_PROPERTIES(playrec PROPERTIES SUFFIX ${MATLAB_MEX_SUFFIX} PREFIX "") + +install(TARGETS playrec DESTINATION .) +#INSTALL(FILES playrec.m DESTINATION .) From 8054ce1c9773be5250413b23d48a5f845d0d4db0 Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 11:55:55 +0200 Subject: [PATCH 02/21] README Formatting corrections --- README.md | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 19b5c13..552e3f3 100644 --- a/README.md +++ b/README.md @@ -51,34 +51,46 @@ platforms and with all host APIs that PortAudio supports. To use this utility it must first be downloaded and compiled. Clone the playrec repository from github +``` % git clone git@github.com:hbe72/playrec.git - -Ubuntu: +``` +####Ubuntu: +``` % sudo apt-get install cmake % sudo apt-get install libportaudio-dev +``` -Mac: +####Mac: Install homebrew install homebrew (see. brew.sh) +``` % brew install cmake % brew install portaudio +``` -Compile: +####Compile: +``` % cd playrec % mkdir build; cd build % cmake .. % make % make install +``` -Windows: -To be verified. Should work. +Windows: To be verified. Should work. ### Test the installation On Matlab command prompt at playrec directory: ->> playrec'(about') +``` + >> playrec'(about') +``` Clone playrec-examples from - % git clone git@github.com:PlayrecForMatlab/playrec-examples.git +``` + % git clone git@github.com:PlayrecForMatlab/playrec-examples.git +``` Add playrec to Matlab path and execute +``` >> test_playrec +``` From a0aaff48b0ec86f3be0cfb42ecfd39942f008c09 Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 11:57:07 +0200 Subject: [PATCH 03/21] Still README.md Formatting corrections --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 552e3f3..3db0b86 100644 --- a/README.md +++ b/README.md @@ -52,28 +52,28 @@ To use this utility it must first be downloaded and compiled. Clone the playrec repository from github ``` - % git clone git@github.com:hbe72/playrec.git +% git clone git@github.com:hbe72/playrec.git ``` ####Ubuntu: ``` - % sudo apt-get install cmake - % sudo apt-get install libportaudio-dev +% sudo apt-get install cmake +% sudo apt-get install libportaudio-dev ``` ####Mac: Install homebrew install homebrew (see. brew.sh) ``` - % brew install cmake - % brew install portaudio +% brew install cmake +% brew install portaudio ``` ####Compile: ``` - % cd playrec - % mkdir build; cd build - % cmake .. - % make - % make install +% cd playrec +% mkdir build; cd build +% cmake .. +% make +% make install ``` Windows: To be verified. Should work. @@ -82,12 +82,12 @@ Windows: To be verified. Should work. On Matlab command prompt at playrec directory: ``` - >> playrec'(about') +>> playrec'(about') ``` Clone playrec-examples from ``` - % git clone git@github.com:PlayrecForMatlab/playrec-examples.git +% git clone git@github.com:PlayrecForMatlab/playrec-examples.git ``` Add playrec to Matlab path and execute From b935cd12b16f582d3fd8acca1433b3bf2b87c2a7 Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 11:58:13 +0200 Subject: [PATCH 04/21] Minor correction to README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3db0b86..b78f9b9 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,8 @@ Clone playrec-examples from % git clone git@github.com:PlayrecForMatlab/playrec-examples.git ``` -Add playrec to Matlab path and execute +Add playrec to Matlab path and execute test_playrec.m from +playrec-examples directory ``` >> test_playrec ``` From e6ddafa64bc411058c0b92b911adf2ce3a980c0e Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 12:08:44 +0200 Subject: [PATCH 05/21] Improved FindMatlab.cmake error messages --- cmake/FindMatlab.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/FindMatlab.cmake b/cmake/FindMatlab.cmake index 77574e7..c3a0158 100644 --- a/cmake/FindMatlab.cmake +++ b/cmake/FindMatlab.cmake @@ -7,10 +7,10 @@ SET(MATLAB_FOUND 0) IF( "$ENV{MATLAB_ROOT}" STREQUAL "" ) MESSAGE(STATUS "MATLAB_ROOT environment variable not set." ) - MESSAGE(STATUS "In Linux this can be done in your user .bashrc file by appending the corresponding line, e.g:" ) - MESSAGE(STATUS "export MATLAB_ROOT=/usr/local/MATLAB/R2012b" ) - MESSAGE(STATUS "In Windows this can be done by adding system variable, e.g:" ) - MESSAGE(STATUS "MATLAB_ROOT=D:\\Program Files\\MATLAB\\R2011a" ) + MESSAGE(STATUS "In Linux: export MATLAB_ROOT=/usr/local/MATLAB/R2014b" ) + MESSAGE(STATUS "In Mac OS X: export MATLAB_ROOT=/Applications/MATLAB_R2014b.app" ) + MESSAGE(STATUS "Windows: add system variable, e.g:" ) + MESSAGE(STATUS "MATLAB_ROOT=C:\\Program Files\\MATLAB\\R2014b" ) ELSE("$ENV{MATLAB_ROOT}" STREQUAL "" ) FIND_PATH(MATLAB_INCLUDE_DIR mex.h From 6cf8ca49f36a76f531a2a869fb242afe3752811e Mon Sep 17 00:00:00 2001 From: Heikki Berg Date: Tue, 5 Jan 2016 13:26:54 +0200 Subject: [PATCH 06/21] Correct version of portaudio for Ubuntu 14.04 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b78f9b9..b06acf9 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Clone the playrec repository from github ####Ubuntu: ``` % sudo apt-get install cmake -% sudo apt-get install libportaudio-dev +% sudo apt-get install portaudio19-dev ``` ####Mac: @@ -82,7 +82,7 @@ Windows: To be verified. Should work. On Matlab command prompt at playrec directory: ``` ->> playrec'(about') +>> playrec('about') ``` Clone playrec-examples from From 81abb3ba7da57c5dc4e60d636b293aa41838b839 Mon Sep 17 00:00:00 2001 From: Heikki Date: Tue, 5 Jan 2016 13:42:50 +0200 Subject: [PATCH 07/21] Added MATLAB_ROOT instruction --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b06acf9..a7c0b54 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Clone the playrec repository from github ``` % sudo apt-get install cmake % sudo apt-get install portaudio19-dev +% export MATLAB_ROOT=/opt/MATLAB/R2015b ``` ####Mac: @@ -65,10 +66,12 @@ Clone the playrec repository from github ``` % brew install cmake % brew install portaudio +% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app ``` ####Compile: ``` + % cd playrec % mkdir build; cd build % cmake .. From e419d4a4f5b70177747e5855f285b21978002d17 Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:01:17 +0200 Subject: [PATCH 08/21] Added bash script template for compiling on Mac, Linux and MinGW-MSYS --- compile_portaudio.sh | 79 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 compile_portaudio.sh diff --git a/compile_portaudio.sh b/compile_portaudio.sh new file mode 100755 index 0000000..b3286b4 --- /dev/null +++ b/compile_portaudio.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +TARGET_DIR=$1 + +if test "x$2" == "x--debug-build"; +then +export CFLAGS=-O0 +export CPPFLAGS=-O0 +export CXXFLAGS=-O0 +else +export CFLAGS=-O3 +export CPPFLAGS=-O3 +export CXXFLAGS=-O3 +fi + +portaudio_release_url=http://www.portaudio.com/archives +#portaudio_tgz=pa_stable_v19_20140130.tgz #Latest stable +portaudio_tgz=pa_snapshot.tgz #Latest snapshot +steinberg_asio_url=http://www.steinberg.net/sdk_downloads +steinberg_asio_zip=asiosdk2.3.zip + +build_dir=build + +function eexit { + echo $1 + exit 1 +} + +# Fetch portaudio release. +if ! test -f $portaudio_tgz; +then + wget $portaudio_release_url/$portaudio_tgz \ + || eexit "wget of portaudio failed" +fi + +if test -d portaudio; +then + rm -rf portaudio +fi +tar -xzf $portaudio_tgz \ +|| eexit "portaudio tar.gz extraction failed" + + +if ! test -f $steinberg_asio_zip; +then + wget $steinberg_asio_url/$steinberg_asio_zip \ + || eexit "wget of Steinberg ASIO SDK failed" +fi + +if test -d ASIOSDK2.3; +then + rm -rf ASIOSDK2.3 +fi +unzip $steinberg_asio_zip \ +|| eexit "Steinberg ASIO SDK extraction failed" + +if test "x$1" == "x" +then + install_prefix=$PWD +else + install_prefix=$1 +fi + +mkdir -p $build_dir +cd $build_dir + +../portaudio/configure --enable-static --prefix=$install_prefix +make -j8 || eexit "Building portaudio failed" +#make install || eexit "Install of portaudio failed" + +# For compiling playrec in all platforms (Mac OS X, Linux, MinGW-MSYS) +# export PKG_CONFIG_PATH=$install_prefix/lib/pkgconfig:$PKG_CONFIG_PATH + +# You may need to set +# export LD_LIBRARY_PATH=$install_prefix/lib:$LD_LIBRARY_PATH in Linux +# export DYLD_LIBRARY_PATH=$install_prefix/lib:$DYLD_LIBRARY_PATH in Mac + +# And in Windows add $install_prefix/bin to the "PATH" Environment Variable + From b2b4ac4fd4c89f184c9122156a91f2a1214c1512 Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:05:58 +0200 Subject: [PATCH 09/21] FindPortaudio updated for MinGW --- cmake/FindPortaudio.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/FindPortaudio.cmake b/cmake/FindPortaudio.cmake index 158e20e..42d177f 100644 --- a/cmake/FindPortaudio.cmake +++ b/cmake/FindPortaudio.cmake @@ -18,10 +18,10 @@ if (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) # in cache already set(PORTAUDIO_FOUND TRUE) else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) - if (NOT WIN32) + if ((NOT WIN32) OR MINGW) include(FindPkgConfig) pkg_check_modules(PORTAUDIO2 portaudio-2.0) - endif (NOT WIN32) + endif ((NOT WIN32) OR MINGW) if (PORTAUDIO2_FOUND) set(PORTAUDIO_INCLUDE_DIRS From 759a8d3aa0304ae7799e31bd2deee29e8f093d71 Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:25:37 +0200 Subject: [PATCH 10/21] Completed for Mac, Ubuntu & MinGW --- README.md | 40 +++++++++++++++++++++++++++------------- compile_portaudio.sh | 9 ++++++++- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index a7c0b54..1351629 100644 --- a/README.md +++ b/README.md @@ -54,34 +54,48 @@ Clone the playrec repository from github ``` % git clone git@github.com:hbe72/playrec.git ``` -####Ubuntu: +####Compilation with system's installation of portaudio + +#####Ubuntu: ``` % sudo apt-get install cmake % sudo apt-get install portaudio19-dev % export MATLAB_ROOT=/opt/MATLAB/R2015b ``` -####Mac: +#####Mac: Install homebrew install homebrew (see. brew.sh) ``` % brew install cmake % brew install portaudio -% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app +% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app ``` -####Compile: +#####Compile: ``` -% cd playrec -% mkdir build; cd build -% cmake .. -% make -% make install +% cd playrec +% mkdir build; cd build +% cmake .. +% make +% make install ``` - -Windows: To be verified. Should work. - -### Test the installation +#### Compilation from scratch from portaudio sources: +##### Ubuntu, Mac & MinGW +% mkdir portaudio; cd portaudio +% ../playrec/compile_portaudio.sh [installation directory] + +See further instructions from the end of compile_portaudio.sh for setting the +environment variables +% export PKG_CONFIG_PATH=/lib/pkgconfig:$PKG_CONFIG_PATH +% export MATLAB_ROOT=/Applications/MATLAB_R2015b.app +% cd ../playrec +% mkdir build; cd build +% cmake .. +% make +% make install + +#### Test the installation On Matlab command prompt at playrec directory: ``` diff --git a/compile_portaudio.sh b/compile_portaudio.sh index b3286b4..443d0de 100755 --- a/compile_portaudio.sh +++ b/compile_portaudio.sh @@ -1,5 +1,12 @@ #!/bin/bash +# Without any command line parameters, this should be executed +# in the directory you want to install portaudio. +# Usage: ./compile_portaudio.sh [installation directory] [--debug-build] +# +# If Matlab installation is 64-bit, please use 64-bit installation of +# MinGW tools such as TDM-GCC for compiling portaudio for playrec + TARGET_DIR=$1 if test "x$2" == "x--debug-build"; @@ -66,7 +73,7 @@ cd $build_dir ../portaudio/configure --enable-static --prefix=$install_prefix make -j8 || eexit "Building portaudio failed" -#make install || eexit "Install of portaudio failed" +make install || eexit "Install of portaudio failed" # For compiling playrec in all platforms (Mac OS X, Linux, MinGW-MSYS) # export PKG_CONFIG_PATH=$install_prefix/lib/pkgconfig:$PKG_CONFIG_PATH From 7de66095d5a8144207a111dd9e3427043b5ab4f3 Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:29:05 +0200 Subject: [PATCH 11/21] Fixed formatting --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1351629..0da4cad 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ By using PortAudio to access the soundcard, Playrec should function on all platforms and with all host APIs that PortAudio supports. ### Download and compilation with cmake -To use this utility it must first be downloaded and compiled. +cmake based build will install playrec.mex to the top level of +playrec source directory. It can be moved from there to desired location. Clone the playrec repository from github ``` @@ -82,18 +83,22 @@ Clone the playrec repository from github ``` #### Compilation from scratch from portaudio sources: ##### Ubuntu, Mac & MinGW -% mkdir portaudio; cd portaudio +``` + % mkdir portaudio; cd portaudio % ../playrec/compile_portaudio.sh [installation directory] +``` See further instructions from the end of compile_portaudio.sh for setting the environment variables -% export PKG_CONFIG_PATH=/lib/pkgconfig:$PKG_CONFIG_PATH +``` + % export PKG_CONFIG_PATH=/lib/pkgconfig:$PKG_CONFIG_PATH % export MATLAB_ROOT=/Applications/MATLAB_R2015b.app % cd ../playrec % mkdir build; cd build % cmake .. % make % make install +``` #### Test the installation From ca1a251e89b10c91011d7ff871498d7e537544db Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:29:43 +0200 Subject: [PATCH 12/21] Fixed formatting, minor --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0da4cad..f8a5d7e 100644 --- a/README.md +++ b/README.md @@ -84,14 +84,14 @@ Clone the playrec repository from github #### Compilation from scratch from portaudio sources: ##### Ubuntu, Mac & MinGW ``` - % mkdir portaudio; cd portaudio +% mkdir portaudio; cd portaudio % ../playrec/compile_portaudio.sh [installation directory] ``` See further instructions from the end of compile_portaudio.sh for setting the environment variables ``` - % export PKG_CONFIG_PATH=/lib/pkgconfig:$PKG_CONFIG_PATH +% export PKG_CONFIG_PATH=/lib/pkgconfig:$PKG_CONFIG_PATH % export MATLAB_ROOT=/Applications/MATLAB_R2015b.app % cd ../playrec % mkdir build; cd build From 6aef4e86443c5da1d9d1b626f089cd2e7d7d8293 Mon Sep 17 00:00:00 2001 From: Heikki Date: Fri, 8 Jan 2016 10:31:38 +0200 Subject: [PATCH 13/21] Fixed formatting, minor --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8a5d7e..44c88ba 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ By using PortAudio to access the soundcard, Playrec should function on all platforms and with all host APIs that PortAudio supports. ### Download and compilation with cmake -cmake based build will install playrec.mex to the top level of +cmake based build will install playrec.mex to the top level of playrec source directory. It can be moved from there to desired location. Clone the playrec repository from github From 8a7fae77f7ed78720bcd728336ea652aab73642e Mon Sep 17 00:00:00 2001 From: Heikki Berg Date: Sun, 10 Jan 2016 16:14:27 +0200 Subject: [PATCH 14/21] Tested also on VS2013 with nmake --- CMakeLists.txt | 4 - cmake/FindMatlab.cmake | 216 ++++++++++++++++++++++---------------- cmake/FindPortaudio.cmake | 7 ++ src/CMakeLists.txt | 14 ++- 4 files changed, 143 insertions(+), 98 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a62aaee..e87bbed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,7 @@ cmake_minimum_required(VERSION 2.8) -set(CMAKE_C_COMPILER gcc) -set(CMAKE_CXX_COMPILER g++) - project(PLAYREC) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -add_definitions(/DMATLAB_MEX_FILE) #define matlab macros #CMake 'debug' build does an optimized build? #TODO: Q&D now -check for compiler, and move to a separate file diff --git a/cmake/FindMatlab.cmake b/cmake/FindMatlab.cmake index c3a0158..119a9d4 100644 --- a/cmake/FindMatlab.cmake +++ b/cmake/FindMatlab.cmake @@ -1,92 +1,126 @@ -# - this module looks for Matlab -# Defines: -# MATLAB_INCLUDE_DIR: include path for mex.h +# Try to find Matlab +# This will define +# +# MATLAB_INCLUDE_DIRS: include path for mex.h +# MATLAB_LIBRARY_DIRS: include path for mex.h # MATLAB_LIBRARIES: required libraries: libmex, libmx -# MATLAB_MEX_LIBRARY: path to libmex - -SET(MATLAB_FOUND 0) -IF( "$ENV{MATLAB_ROOT}" STREQUAL "" ) - MESSAGE(STATUS "MATLAB_ROOT environment variable not set." ) - MESSAGE(STATUS "In Linux: export MATLAB_ROOT=/usr/local/MATLAB/R2014b" ) - MESSAGE(STATUS "In Mac OS X: export MATLAB_ROOT=/Applications/MATLAB_R2014b.app" ) - MESSAGE(STATUS "Windows: add system variable, e.g:" ) - MESSAGE(STATUS "MATLAB_ROOT=C:\\Program Files\\MATLAB\\R2014b" ) -ELSE("$ENV{MATLAB_ROOT}" STREQUAL "" ) - - FIND_PATH(MATLAB_INCLUDE_DIR mex.h - $ENV{MATLAB_ROOT}/extern/include) - - INCLUDE_DIRECTORIES(${MATLAB_INCLUDE_DIR}) - - FIND_PATH( MATLAB_LINUX64_MEX_LIBRARY - NAMES libmex.so - PATHS $ENV{MATLAB_ROOT}/bin/glnxa64 - NO_DEFAULT_PATH) - - FIND_PATH( MATLAB_LINUX32_MEX_LIBRARY - NAMES libmex.so - PATHS $ENV{MATLAB_ROOT}/bin/glnx86 - NO_DEFAULT_PATH) - - FIND_PATH( MATLAB_MAC_MEX_LIBRARY - NAMES libmex.dylib - PATHS $ENV{MATLAB_ROOT}/bin/maci64 - NO_DEFAULT_PATH) - - FIND_PATH( MATLAB_WIN64_MEX_LIBRARY - NAMES libmex.dll mex.dll - PATHS $ENV{MATLAB_ROOT}/bin/win64 - NO_DEFAULT_PATH) - - FIND_PATH( MATLAB_WIN32_MEX_LIBRARY - NAMES libmex.dll mex.dll - PATHS $ENV{MATLAB_ROOT}/bin/win32 - NO_DEFAULT_PATH) - -ENDIF("$ENV{MATLAB_ROOT}" STREQUAL "" ) - -IF (MATLAB_LINUX64_MEX_LIBRARY) - SET (MATLAB_MEX_LIBRARY ${MATLAB_LINUX64_MEX_LIBRARY}) - SET (MATLAB_MEX_SUFFIX ".mexa64") -ENDIF (MATLAB_LINUX64_MEX_LIBRARY) - -IF (MATLAB_LINUX32_MEX_LIBRARY) - SET (MATLAB_MEX_LIBRARY ${MATLAB_LINUX32_MEX_LIBRARY}) - SET (MATLAB_MEX_SUFFIX ".mexglx") -ENDIF (MATLAB_LINUX32_MEX_LIBRARY) - -IF (MATLAB_MAC_MEX_LIBRARY) - SET (MATLAB_MEX_LIBRARY ${MATLAB_MAC_MEX_LIBRARY}) - SET (MATLAB_MEX_SUFFIX ".mexmaci64") -ENDIF (MATLAB_MAC_MEX_LIBRARY) - -IF (MATLAB_WIN64_MEX_LIBRARY) - SET (MATLAB_MEX_LIBRARY ${MATLAB_WIN64_MEX_LIBRARY}) - SET (MATLAB_MEX_SUFFIX ".mexw64") -ENDIF (MATLAB_WIN64_MEX_LIBRARY) - -IF (MATLAB_WIN32_MEX_LIBRARY) - SET (MATLAB_MEX_LIBRARY ${MATLAB_WIN32_MEX_LIBRARY}) - SET (MATLAB_MEX_SUFFIX ".mexw32") -ENDIF (MATLAB_WIN32_MEX_LIBRARY) - - -SET(MATLAB_MEX_LINK_FLAGS -L${MATLAB_MEX_LIBRARY} "-lmx -lmex -lmat -lmwservices -lut") - -IF(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) - SET(MATLAB_FOUND 1) - MESSAGE(STATUS "Matlab found:") - MESSAGE (STATUS " MATLAB_ROOT: $ENV{MATLAB_ROOT}") - MESSAGE (STATUS " MATLAB_MEX_LIBRARY: ${MATLAB_MEX_LIBRARY}") - MESSAGE (STATUS " MATLAB_MEX_SUFFIX: ${MATLAB_MEX_SUFFIX}") -ELSE(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) - MESSAGE(STATUS "Matlab not found") -ENDIF(MATLAB_INCLUDE_DIR AND MATLAB_MEX_LINK_FLAGS) - -MARK_AS_ADVANCED( - MATLAB_MEX_LINK_FLAGS - MATLAB_MEX_SUFFIX - MATLAB_INCLUDE_DIR - MATLAB_FOUND - MATLAB_ROOT -) +# MATLAB_MEX_SUFFIX: mexw32, mexw64, mexmaci64, mexglx or mexa64 +if (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX) + # in cache already + set(MATLAB_FOUND TRUE) +else (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX) + if( "$ENV{MATLAB_ROOT}" STREQUAL "" ) + MESSAGE(STATUS "MATLAB_ROOT environment variable not set." ) + MESSAGE(STATUS "In Linux: export MATLAB_ROOT=/usr/local/MATLAB/R2014b" ) + MESSAGE(STATUS "In Mac OS X: export MATLAB_ROOT=/Applications/MATLAB_R2014b.app" ) + MESSAGE(STATUS "Windows: add system variable, e.g:" ) + MESSAGE(STATUS "MATLAB_ROOT=C:\\Program Files\\MATLAB\\R2014b" ) + else("$ENV{MATLAB_ROOT}" STREQUAL "" ) + message(STATUS "You say that matlab is in: $ENV{MATLAB_ROOT} ... let's see") + + find_path(MATLAB_INCLUDE_DIR + NAMES mex.h + PATHS + $ENV{MATLAB_ROOT}/extern/include + NO_DEFAULT_PATH) + set(MATLAB_INCLUDE_DIRS ${MATLAB_INCLUDE_DIR}) + + + if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library + find_path(MATLAB_LIBRARY_DIR + NAMES + libmex.lib + PATHS + $ENV{MATLAB_ROOT}/extern/lib/win64/microsoft + $ENV{MATLAB_ROOT}/extern/lib/win32/microsoft) + + set(MATLAB_LIBRARIES + libmx + libmex + libmat) + set(MATLAB_COMP_FLAGS_RELEASE "/O2 /Oy- /DNDEBUG /MD /DMX_COMPAT_32 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE") + set(MATLAB_COMP_FLAGS_DEBUG "/Z7 /MD /DMX_COMPAT_32 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE") + set(MATLAB_LINK_FLAGS_RELEASE "/nologo /manifest /EXPORT:mexFunction") + set(MATLAB_LINK_FLAGS_DEBUG "/debug /nologo /manifest /EXPORT:mexFunction") + else (WIN32 AND (NOT MINGW)) + find_path(MATLAB_LIBRARY_DIR + NAMES + libmex.lib libmex.dylib libmex.so libmex.dll + PATHS + $ENV{MATLAB_ROOT}/bin/glnxa64 + $ENV{MATLAB_ROOT}/bin/glnx86 + $ENV{MATLAB_ROOT}/bin/maci64 + $ENV{MATLAB_ROOT}/bin/win64 + $ENV{MATLAB_ROOT}/bin/win32) + set(MATLAB_LIBRARIES + mx + mex + mat) + set(MATLAB_COMP_FLAGS_RELEASE "-O3 -DMATLAB_MEX_FILE") + set(MATLAB_COMP_FLAGS_DEBUG "-O0 -g -DMATLAB_MEX_FILE") + set(MATLAB_LINK_FLAGS_DEBUG "-g") + endif (WIN32 AND (NOT MINGW)) + set(MATLAB_LIBRARY_DIRS ${MATLAB_LIBRARY_DIR}) + + if (CMAKE_BUILD_TYPE MATCHES RELEASE) + set(MATLAB_COMP_FLAGS ${MATLAB_COMP_FLAGS_RELEASE}) + set(MATLAB_LINK_FLAGS ${MATLAB_LINK_FLAGS_RELEASE}) + else (CMAKE_BUILD_TYPE MATCHES RELEASE) + set(MATLAB_COMP_FLAGS ${MATLAB_COMP_FLAGS_DEBUG}) + set(MATLAB_LINK_FLAGS ${MATLAB_LINK_FLAGS_DEBUG}) + endif (CMAKE_BUILD_TYPE MATCHES RELEASE) + + STRING(REGEX MATCH glnxa64 + MATLAB_ARCH_GLNXA64 ${MATLAB_LIBRARY_DIR}) + STRING(REGEX MATCH glnx86 + MATLAB_ARCH_GLNX86 ${MATLAB_LIBRARY_DIR}) + STRING(REGEX MATCH maci64 + MATLAB_ARCH_MACI64 ${MATLAB_LIBRARY_DIR}) + STRING(REGEX MATCH win64 + MATLAB_ARCH_WIN64 ${MATLAB_LIBRARY_DIR}) + STRING(REGEX MATCH win32 + MATLAB_ARCH_WIN32 ${MATLAB_LIBRARY_DIR}) + if (MATLAB_ARCH_GLNXA64) + set (MATLAB_MEX_SUFFIX ".mexa64") + endif (MATLAB_ARCH_GLNXA64) + if (MATLAB_ARCH_GLNX86) + set (MATLAB_MEX_SUFFIX ".mexglx") + endif (MATLAB_ARCH_GLNX86) + if (MATLAB_ARCH_MACI64) + set (MATLAB_MEX_SUFFIX ".mexmaci64") + endif (MATLAB_ARCH_MACI64) + if (MATLAB_ARCH_WIN64) + set (MATLAB_MEX_SUFFIX ".mexw64") + endif (MATLAB_ARCH_WIN64) + if (MATLAB_ARCH_WIN32) + set (MATLAB_MEX_SUFFIX ".mexw32") + endif (MATLAB_ARCH_WIN32) + + if (MATLAB_INCLUDE_DIRS AND MATLAB_LIBRARY_DIRS) + set(MATLAB_FOUND TRUE) + endif (MATLAB_INCLUDE_DIRS AND MATLAB_LIBRARY_DIRS) + + if (MATLAB_FOUND) + if (NOT Matlab_FIND_QUIETLY) + message(STATUS "Found Matlab libraries for building mex:") + message(STATUS " include dir: ${MATLAB_INCLUDE_DIRS}") + message(STATUS " library dir: ${MATLAB_LIBRARY_DIRS}") + message(STATUS " libraries: ${MATLAB_LIBRARIES}") + message(STATUS " mex suffix: ${MATLAB_MEX_SUFFIX}") + message(STATUS " comp flags: ${MATLAB_COMP_FLAGS}") + message(STATUS " link flags: ${MATLAB_LINK_FLAGS}") + endif (NOT Matlab_FIND_QUIETLY) + else (MATLAB_FOUND) + if (Matlab_FIND_REQUIRED) + message(FATAL_ERROR "Could not find Matlab, bailing out") + endif (Matlab_FIND_REQUIRED) + endif (MATLAB_FOUND) + mark_as_advanced( + MATLAB_LIBRARIES + MATLAB_MEX_SUFFIX + MATLAB_INCLUDE_DIRS + MATLAB_LIBRARY_DIRS + MATLAB_COMP_FLAGS + MATLAB_LINK_FLAGS) + endif("$ENV{MATLAB_ROOT}" STREQUAL "" ) +endif (MATLAB_LIBRARIES AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SUFFIX) diff --git a/cmake/FindPortaudio.cmake b/cmake/FindPortaudio.cmake index 42d177f..5d38389 100644 --- a/cmake/FindPortaudio.cmake +++ b/cmake/FindPortaudio.cmake @@ -43,6 +43,7 @@ else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) NAMES portaudio.h PATHS + ../portaudio/include /usr/include /usr/local/include /opt/local/include @@ -52,7 +53,10 @@ else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) find_library(PORTAUDIO_LIBRARY NAMES portaudio + portaudio_static_x64 + portaudio_static_x86 PATHS + ../portaudio/lib /usr/lib /usr/local/lib /opt/local/lib @@ -62,7 +66,10 @@ else (PORTAUDIO_LIBRARIES AND PORTAUDIO_INCLUDE_DIRS) find_path(PORTAUDIO_LIBRARY_DIR NAMES portaudio + portaudio_static_x64 + portaudio_static_x86 PATHS + ../portaudio/lib /usr/lib /usr/local/lib /opt/local/lib diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b462f0b..0d1fc26 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,11 +10,19 @@ set(PLAYREC_HEADER_FILES mex_dll_core.h ) -include_directories(${MATLAB_INCLUDE_DIR} ${PORTAUDIO_INCLUDE_DIRS}) +include_directories(${MATLAB_INCLUDE_DIRS} ${PORTAUDIO_INCLUDE_DIRS}) +link_directories(${MATLAB_LIBRARY_DIRS}) add_library(playrec SHARED ${PLAYREC_SOURCE_FILES}) -target_link_libraries(playrec ${MATLAB_MEX_LINK_FLAGS} ${PORTAUDIO_LIBRARIES}) -SET_TARGET_PROPERTIES(playrec PROPERTIES SUFFIX ${MATLAB_MEX_SUFFIX} PREFIX "") +target_link_libraries(playrec ${MATLAB_LIBRARIES} ${PORTAUDIO_LIBRARIES}) +set_target_properties(playrec PROPERTIES SUFFIX ${MATLAB_MEX_SUFFIX} + PREFIX "") +if (NOT ${MATLAB_COMP_FLAGS} MATCHES "") + set_target_properties(playrec PROPERTIES COMP_FLAGS ${MATLAB_COMP_FLAGS}) +endif (NOT ${MATLAB_COMP_FLAGS} MATCHES "") +if (MATLAB_LINK_FLAGS) + set_target_properties(playrec PROPERTIES LINK_FLAGS ${MATLAB_LINK_FLAGS}) +endif (MATLAB_LINK_FLAGS) install(TARGETS playrec DESTINATION .) #INSTALL(FILES playrec.m DESTINATION .) From 869c5b547616274cdb619236ed7357e52f3b90a5 Mon Sep 17 00:00:00 2001 From: Heikki Date: Mon, 11 Jan 2016 08:36:51 +0200 Subject: [PATCH 15/21] Instructions for Visual Studio --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ compile_portaudio.sh | 16 +++++++++++++--- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 44c88ba..f52b27a 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,44 @@ environment variables % make % make install ``` +##### Windows with Visual Studio +Suggested directory structure for FindPortaudio.cmake +``` +----- portaudio ----- portaudio + | | + | -- ASIOSDK2.3 + | | + | -- build + | -- lib + | -- bin + | -- include + -- playrec +``` +Thus download and uncompress portaudio and asiosdk accordingly from +http://www.portaudio.com/archives/pa_snapshot.tgz and http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip + +Open "VS x64 Cross Tools Command Prompt" and browse to +portaudio subdirectory +###### Build portaudio +``` +> mkdir build +> cd build +> cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release ../portaudio +> nmake /f Makefile +> nmake /f Makefile install +``` +Thus installation is done to lib, bin and include subdirectories of +portaudio_install_dir. portaudio_install_dir has to be absolute path +to the portaudio subdirectory beside playrec subdirectory for +FindPortaudio.cmake to find it. + +###### Build playrec +> cd ../../playrec +> mkdir build +> cd build +> cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .. +> nmake /f Makefile +> nmake /f Makefile install #### Test the installation diff --git a/compile_portaudio.sh b/compile_portaudio.sh index 443d0de..1a97e3a 100755 --- a/compile_portaudio.sh +++ b/compile_portaudio.sh @@ -6,6 +6,17 @@ # # If Matlab installation is 64-bit, please use 64-bit installation of # MinGW tools such as TDM-GCC for compiling portaudio for playrec +# Creates following directory structure: +# current directory ----- portaudio +# | +# -- ASIOSDK2.3 +# | +# -- build +# Executes configure and make in build subdirectory. +# +# Without any parameters, installation is done to current directory +# to subdirectories include, lib. In addition in mingw dll will be in bin +# subdirectory TARGET_DIR=$1 @@ -26,8 +37,6 @@ portaudio_tgz=pa_snapshot.tgz #Latest snapshot steinberg_asio_url=http://www.steinberg.net/sdk_downloads steinberg_asio_zip=asiosdk2.3.zip -build_dir=build - function eexit { echo $1 exit 1 @@ -68,10 +77,11 @@ else install_prefix=$1 fi +build_dir=build mkdir -p $build_dir cd $build_dir -../portaudio/configure --enable-static --prefix=$install_prefix +../portaudio/configure --prefix=$install_prefix make -j8 || eexit "Building portaudio failed" make install || eexit "Install of portaudio failed" From 9a36b3e536ac09e99543ff7e7024b25bb5eca89d Mon Sep 17 00:00:00 2001 From: Heikki Date: Mon, 11 Jan 2016 08:37:42 +0200 Subject: [PATCH 16/21] Formatting --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f52b27a..7646b78 100644 --- a/README.md +++ b/README.md @@ -131,12 +131,14 @@ to the portaudio subdirectory beside playrec subdirectory for FindPortaudio.cmake to find it. ###### Build playrec +``` > cd ../../playrec > mkdir build > cd build > cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .. > nmake /f Makefile > nmake /f Makefile install +``` #### Test the installation From 31ea2467a614e7f30620d2f17376534fb4cd2410 Mon Sep 17 00:00:00 2001 From: Heikki Date: Mon, 11 Jan 2016 08:41:55 +0200 Subject: [PATCH 17/21] Formatting --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7646b78..cdd5eb7 100644 --- a/README.md +++ b/README.md @@ -102,15 +102,15 @@ environment variables ##### Windows with Visual Studio Suggested directory structure for FindPortaudio.cmake ``` ------ portaudio ----- portaudio - | | - | -- ASIOSDK2.3 - | | - | -- build - | -- lib - | -- bin - | -- include - -- playrec +--- portaudio --- portaudio + | | + | -- ASIOSDK2.3 + | | + | -- build + | -- lib + | -- bin + | -- include + -- playrec ``` Thus download and uncompress portaudio and asiosdk accordingly from http://www.portaudio.com/archives/pa_snapshot.tgz and http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip From 648b653bd153a3f737008d3ce25222c8da9b16b2 Mon Sep 17 00:00:00 2001 From: Heikki Date: Mon, 11 Jan 2016 08:47:52 +0200 Subject: [PATCH 18/21] Minor --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cdd5eb7..02e5156 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ to the portaudio subdirectory beside playrec subdirectory for FindPortaudio.cmake to find it. ###### Build playrec +Have MATLAB_ROOT environment variable point to Matlab installation directory ``` > cd ../../playrec > mkdir build From 43c5bd0a80029b24670383513d26bd45a25ec465 Mon Sep 17 00:00:00 2001 From: Heikki Date: Thu, 14 Jan 2016 07:52:31 +0200 Subject: [PATCH 19/21] Skeleton for Octave build. Tested on Mac OS X 10.10 --- CMakeLists.txt | 14 ++++--- cmake/FindOctave.cmake | 91 ++++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 41 +++++++++++++------ 3 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 cmake/FindOctave.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e87bbed..40ddc46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,16 +19,20 @@ ENDIF(CMAKE_BUILD_TYPE MATCHES Debug) #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") -find_package(Matlab REQUIRED) +if(PLAYREC_TARGET MATCHES Octave) + find_package(Octave REQUIRED) +else(PLAYREC_TARGET MATCHES Octave) + find_package(Matlab REQUIRED) +endif(PLAYREC_TARGET MATCHES Octave) find_package(Portaudio REQUIRED) - -IF(MATLAB_FOUND AND PORTAUDIO_FOUND) + +IF((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND)) set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}) message(STATUS "All found, Playrec will be compiled.") #FILE(GLOB matlab_stuff "*.m") #INSTALL(FILES ${matlab_stuff} DESTINATION .) add_subdirectory(src) - ELSE(MATLAB_FOUND AND PORTAUDIO_FOUND) + ELSE((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND)) MESSAGE("Nothing will be built.") -ENDIF(MATLAB_FOUND AND PORTAUDIO_FOUND) +ENDIF((MATLAB_FOUND AND PORTAUDIO_FOUND) OR (OCTAVE_FOUND AND PORTAUDIO_FOUND)) diff --git a/cmake/FindOctave.cmake b/cmake/FindOctave.cmake new file mode 100644 index 0000000..be1e4e8 --- /dev/null +++ b/cmake/FindOctave.cmake @@ -0,0 +1,91 @@ +# Try to find Octave +# This will define +# +# OCTAVE_INCLUDE_DIRS: include path for mex.h +# OCTAVE_LIBRARY_DIRS: include path for mex.h +# OCTAVE_LIBRARIES: required libraries: libmex, libmx +# OCTAVE_MEX_SUFFIX: mexw32, mexw64, mexmaci64, mexglx or mexa64 +if (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) + # in cache already + set(OCTAVE_FOUND TRUE) +else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) + if( "$ENV{OCTAVE_ROOT}" STREQUAL "" ) + MESSAGE(STATUS "OCTAVE_ROOT environment variable not set" ) + MESSAGE(STATUS "...Trying the usual paths" ) + endif("$ENV{OCTAVE_ROOT}" STREQUAL "" ) + + find_path(OCTAVE_INCLUDE_DIR + NAMES mex.h + PATHS + $ENV{OCTAVE_ROOT}/include/octave-4.0.0/octave + /usr/local/include/octave-4.0.0/octave + NO_DEFAULT_PATH) + set(OCTAVE_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIR}) + + if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library + find_path(OCTAVE_LIBRARY_DIR + NAMES + liboctave.lib + PATHS + $ENV{OCTAVE_ROOT}/lib/octave/4.0.0) + + set(OCTAVE_LIBRARIES + liboctave + liboctinterp) + #set(OCTAVE_COMP_FLAGS_RELEASE "") + #set(OCTAVE_COMP_FLAGS_DEBUG "") + #set(OCTAVE_LINK_FLAGS_RELEASE "/EXPORT:mexFunction") + #set(OCTAVE_LINK_FLAGS_DEBUG "/debug /nologo /manifest /EXPORT:mexFunction") + else (WIN32 AND (NOT MINGW)) + find_path(OCTAVE_LIBRARY_DIR + NAMES + liboctave.lib liboctave.dylib liboctave.so liboctave.dll + PATHS + $ENV{OCTAVE_ROOT}/lib/octave/4.0.0 + /usr/local/lib/octave/4.0.0) + set(OCTAVE_LIBRARIES + octave + octinterp) + set(OCTAVE_COMP_FLAGS_RELEASE "-O3 -D_THREAD_SAFE -pthread -D_REENTRANT -I.") + set(OCTAVE_COMP_FLAGS_DEBUG "-O0 -D_THREAD_SAFE -pthread -D_REENTRANT -I.") + set(OCTAVE_LINK_FLAGS_DEBUG "-g") + endif (WIN32 AND (NOT MINGW)) + set(OCTAVE_LIBRARY_DIRS ${OCTAVE_LIBRARY_DIR}) + + if (CMAKE_BUILD_TYPE MATCHES RELEASE) + set(OCTAVE_COMP_FLAGS ${OCTAVE_COMP_FLAGS_RELEASE}) + set(OCTAVE_LINK_FLAGS ${OCTAVE_LINK_FLAGS_RELEASE}) + else (CMAKE_BUILD_TYPE MATCHES RELEASE) + set(OCTAVE_COMP_FLAGS ${OCTAVE_COMP_FLAGS_DEBUG}) + set(OCTAVE_LINK_FLAGS ${OCTAVE_LINK_FLAGS_DEBUG}) + endif (CMAKE_BUILD_TYPE MATCHES RELEASE) + + set (OCTAVE_MEX_SUFFIX ".mex") + + if (OCTAVE_INCLUDE_DIRS AND OCTAVE_LIBRARY_DIRS) + set(OCTAVE_FOUND TRUE) + endif (OCTAVE_INCLUDE_DIRS AND OCTAVE_LIBRARY_DIRS) + + if (OCTAVE_FOUND) + if (NOT Octave_FIND_QUIETLY) + message(STATUS "Found Octave libraries for building mex:") + message(STATUS " include dir: ${OCTAVE_INCLUDE_DIRS}") + message(STATUS " library dir: ${OCTAVE_LIBRARY_DIRS}") + message(STATUS " libraries: ${OCTAVE_LIBRARIES}") + message(STATUS " mex suffix: ${OCTAVE_MEX_SUFFIX}") + message(STATUS " comp flags: ${OCTAVE_COMP_FLAGS}") + message(STATUS " link flags: ${OCTAVE_LINK_FLAGS}") + endif (NOT Octave_FIND_QUIETLY) + else (OCTAVE_FOUND) + if (Matlab_FIND_REQUIRED) + message(FATAL_ERROR "Could not find Octave, bailing out") + endif (Matlab_FIND_REQUIRED) + endif (OCTAVE_FOUND) + mark_as_advanced( + OCTAVE_LIBRARIES + OCTAVE_MEX_SUFFIX + OCTAVE_INCLUDE_DIRS + OCTAVE_LIBRARY_DIRS + OCTAVE_COMP_FLAGS + OCTAVE_LINK_FLAGS) +endif (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0d1fc26..6f3cb59 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,24 +5,41 @@ set(PLAYREC_SOURCE_FILES pa_dll_playrec.c mex_dll_core.c ) -set(PLAYREC_HEADER_FILES +set(PLAYREC_HEADER_FILES pa_dll_playrec.h mex_dll_core.h - ) + ) + +if (PLAYREC_TARGET MATCHES Octave) + set(PLAYREC_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIRS}) + set(PLAYREC_LIBRARY_DIRS ${OCTAVE_LIBRARY_DIRS}) + set(PLAYREC_LIBRARIES ${OCTAVE_LIBRARIES}) + set(PLAYREC_MEX_SUFFIX ${OCTAVE_MEX_SUFFIX}) + set(PLAYREC_COMP_FLAGS ${OCTAVE_COMP_FLAGS}) + set(PLAYREC_LINK_FLAGS ${OCTAVE_LINK_FLAGS}) +else (PLAYREC_TARGET MATCHES Octave) + set(PLAYREC_INCLUDE_DIRS ${MATLAB_INCLUDE_DIRS}) + set(PLAYREC_LIBRARY_DIRS ${MATLAB_LIBRARY_DIRS}) + set(PLAYREC_LIBRARIES ${MATLAB_LIBRARIES}) + set(PLAYREC_MEX_SUFFIX ${MATLAB_MEX_SUFFIX}) + set(PLAYREC_COMP_FLAGS ${MATLAB_COMP_FLAGS}) + set(PLAYREC_LINK_FLAGS ${MATLAB_LINK_FLAGS}) +endif (PLAYREC_TARGET MATCHES Octave) -include_directories(${MATLAB_INCLUDE_DIRS} ${PORTAUDIO_INCLUDE_DIRS}) -link_directories(${MATLAB_LIBRARY_DIRS}) +include_directories(${PLAYREC_INCLUDE_DIRS} ${PORTAUDIO_INCLUDE_DIRS}) +link_directories(${PLAYREC_LIBRARY_DIRS}) add_library(playrec SHARED ${PLAYREC_SOURCE_FILES}) -target_link_libraries(playrec ${MATLAB_LIBRARIES} ${PORTAUDIO_LIBRARIES}) -set_target_properties(playrec PROPERTIES SUFFIX ${MATLAB_MEX_SUFFIX} +target_link_libraries(playrec ${PLAYREC_LIBRARIES} ${PORTAUDIO_LIBRARIES}) +set_target_properties(playrec PROPERTIES SUFFIX ${PLAYREC_MEX_SUFFIX} PREFIX "") -if (NOT ${MATLAB_COMP_FLAGS} MATCHES "") - set_target_properties(playrec PROPERTIES COMP_FLAGS ${MATLAB_COMP_FLAGS}) -endif (NOT ${MATLAB_COMP_FLAGS} MATCHES "") -if (MATLAB_LINK_FLAGS) - set_target_properties(playrec PROPERTIES LINK_FLAGS ${MATLAB_LINK_FLAGS}) -endif (MATLAB_LINK_FLAGS) + +if (NOT ${PLAYREC_COMP_FLAGS} MATCHES "") + set_target_properties(playrec PROPERTIES COMP_FLAGS ${PLAYREC_COMP_FLAGS}) +endif (NOT ${PLAYREC_COMP_FLAGS} MATCHES "") +if (PLAYREC_LINK_FLAGS) + set_target_properties(playrec PROPERTIES LINK_FLAGS ${PLAYREC_LINK_FLAGS}) +endif (PLAYREC_LINK_FLAGS) install(TARGETS playrec DESTINATION .) #INSTALL(FILES playrec.m DESTINATION .) From 4483537f3e8d8092f264010bd58aa7c9ebf558f5 Mon Sep 17 00:00:00 2001 From: Heikki Berg Date: Thu, 14 Jan 2016 09:43:26 +0200 Subject: [PATCH 20/21] Linux octave build --- cmake/FindOctave.cmake | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/FindOctave.cmake b/cmake/FindOctave.cmake index be1e4e8..a62ed79 100644 --- a/cmake/FindOctave.cmake +++ b/cmake/FindOctave.cmake @@ -17,9 +17,12 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) find_path(OCTAVE_INCLUDE_DIR NAMES mex.h PATHS + $ENV{OCTAVE_ROOT}/include/octave-3.8.1/octave $ENV{OCTAVE_ROOT}/include/octave-4.0.0/octave + /usr/local/include/octave-3.8.1/octave /usr/local/include/octave-4.0.0/octave - NO_DEFAULT_PATH) + /usr/include/octave-3.8.1/octave + /usr/include/octave-4.0.0/octave) set(OCTAVE_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIR}) if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library @@ -27,7 +30,8 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) NAMES liboctave.lib PATHS - $ENV{OCTAVE_ROOT}/lib/octave/4.0.0) + $ENV{OCTAVE_ROOT}/lib/octave/3.8.1 + $ENV{OCTAVE_ROOT}/lib/octave/4.0.0) set(OCTAVE_LIBRARIES liboctave @@ -42,8 +46,10 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) liboctave.lib liboctave.dylib liboctave.so liboctave.dll PATHS $ENV{OCTAVE_ROOT}/lib/octave/4.0.0 - /usr/local/lib/octave/4.0.0) - set(OCTAVE_LIBRARIES + /usr/local/lib/octave/3.8.1 + /usr/local/lib/octave/4.0.0 + /usr/lib/x86_64-linux-gnu) + set(OCTAVE_LIBRARIES octave octinterp) set(OCTAVE_COMP_FLAGS_RELEASE "-O3 -D_THREAD_SAFE -pthread -D_REENTRANT -I.") From 9a34bfbd3cda8687476792caf8a119a141c8cc2f Mon Sep 17 00:00:00 2001 From: Heikki Berg Date: Thu, 14 Jan 2016 10:16:20 +0200 Subject: [PATCH 21/21] More generic search for octave --- cmake/FindOctave.cmake | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/cmake/FindOctave.cmake b/cmake/FindOctave.cmake index a62ed79..07dfe33 100644 --- a/cmake/FindOctave.cmake +++ b/cmake/FindOctave.cmake @@ -13,16 +13,19 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) MESSAGE(STATUS "OCTAVE_ROOT environment variable not set" ) MESSAGE(STATUS "...Trying the usual paths" ) endif("$ENV{OCTAVE_ROOT}" STREQUAL "" ) - + + FILE(GLOB system-oct1 "/usr/local/include/octave-*") + FILE(GLOB system-oct2 "/usr/include/octave-*") + FILE(GLOB system-oct3 "$ENV{OCTAVE_ROOT}/include/octave-*") + FILE(GLOB system-oct1-lib "/usr/local/lib/octave/*") + FILE(GLOB system-oct2-lib "$ENV{OCTAVE_ROOT}/lib/octave/*") + find_path(OCTAVE_INCLUDE_DIR NAMES mex.h PATHS - $ENV{OCTAVE_ROOT}/include/octave-3.8.1/octave - $ENV{OCTAVE_ROOT}/include/octave-4.0.0/octave - /usr/local/include/octave-3.8.1/octave - /usr/local/include/octave-4.0.0/octave - /usr/include/octave-3.8.1/octave - /usr/include/octave-4.0.0/octave) + ${system-oct1}/octave + ${system-oct2}/octave + ${system-oct3}/octave) set(OCTAVE_INCLUDE_DIRS ${OCTAVE_INCLUDE_DIR}) if (WIN32 AND (NOT MINGW)) #Windows seems to have problems with find_library @@ -30,8 +33,8 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) NAMES liboctave.lib PATHS - $ENV{OCTAVE_ROOT}/lib/octave/3.8.1 - $ENV{OCTAVE_ROOT}/lib/octave/4.0.0) + ${system-oct1-lib} + ${system-oct2-lib}) set(OCTAVE_LIBRARIES liboctave @@ -45,10 +48,10 @@ else (OCTAVE_LIBRARIES AND OCTAVE_INCLUDE_DIRS AND OCTAVE_MEX_SUFFIX) NAMES liboctave.lib liboctave.dylib liboctave.so liboctave.dll PATHS - $ENV{OCTAVE_ROOT}/lib/octave/4.0.0 - /usr/local/lib/octave/3.8.1 - /usr/local/lib/octave/4.0.0 + ${system-oct1-lib} + ${system-oct2-lib} /usr/lib/x86_64-linux-gnu) + set(OCTAVE_LIBRARIES octave octinterp)