From 701367af094bbb8293df5e3521753224c03ecaa3 Mon Sep 17 00:00:00 2001 From: tresf Date: Wed, 1 Nov 2017 17:27:33 -0400 Subject: [PATCH] Coerce XML files to C --- .travis/linux..install.sh | 5 +- .travis/linux.win32.install.sh | 5 +- plugins/LadspaEffect/swh/CMakeLists.txt | 117 ++++++++++++++++++++++++ plugins/LadspaEffect/swh/blo.c.patch | 74 +++++++++++++++ plugins/LadspaEffect/swh/swh | 2 +- 5 files changed, 200 insertions(+), 3 deletions(-) create mode 100644 plugins/LadspaEffect/swh/CMakeLists.txt create mode 100644 plugins/LadspaEffect/swh/blo.c.patch diff --git a/.travis/linux..install.sh b/.travis/linux..install.sh index a5fc3e4d540..f49f9e2859a 100755 --- a/.travis/linux..install.sh +++ b/.travis/linux..install.sh @@ -7,8 +7,11 @@ PACKAGES="cmake libsndfile-dev fftw3-dev libvorbis-dev libogg-dev libmp3lame-dev libfluidsynth-dev portaudio19-dev wine-dev g++-multilib libfltk1.3-dev libgig-dev libsoundio-dev" +# swh build dependencies +SWH_PACKAGES="perl libxml2-utils libxml-perl liblist-moreutils-perl" + # Help with unmet dependencies -PACKAGES="$PACKAGES libjack0" +PACKAGES="$PACKAGES $SWH_PACKAGES libjack0" if [ "$QT5" ]; then PACKAGES="$PACKAGES qt58base qt58translations qt58tools" diff --git a/.travis/linux.win32.install.sh b/.travis/linux.win32.install.sh index 4c35555e3c2..3dbf5fea141 100755 --- a/.travis/linux.win32.install.sh +++ b/.travis/linux.win32.install.sh @@ -14,11 +14,14 @@ MINGW_PACKAGES="mingw32-x-sdl mingw32-x-libvorbis mingw32-x-fluidsynth mingw32-x mingw32-x-pkgconfig mingw32-x-binutils mingw32-x-gcc mingw32-x-runtime mingw32-x-libgig mingw32-x-libsoundio mingw32-x-lame $MINGW_PACKAGES" +# swh build dependencies +SWH_PACKAGES="perl libxml2-utils libxml-perl liblist-moreutils-perl" + export MINGW_PACKAGES "$TRAVIS_BUILD_DIR/.travis/linux.win.download.sh" win32 -PACKAGES="nsis cloog-isl libmpc3 qt4-linguist-tools mingw32 $MINGW_PACKAGES" +PACKAGES="nsis cloog-isl libmpc3 qt4-linguist-tools mingw32 $MINGW_PACKAGES $SWH_PACKAGES" # shellcheck disable=SC2086 sudo apt-get install -y $PACKAGES diff --git a/plugins/LadspaEffect/swh/CMakeLists.txt b/plugins/LadspaEffect/swh/CMakeLists.txt new file mode 100644 index 00000000000..52c286289a1 --- /dev/null +++ b/plugins/LadspaEffect/swh/CMakeLists.txt @@ -0,0 +1,117 @@ +# Patch swh to compile with various enviroments +# FIXME: Fixes should be moved upstream to github.com/swh/ladspa +MESSAGE("* Patching source") +EXECUTE_PROCESS( + COMMAND patch -N util/blo.c ../blo.c.patch + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/swh + ERROR_VARIABLE PATCH_ERROR +) +FILE(REMOVE swh/*.orig swh/*.rej) + +IF(NOT "${PATCH_ERROR}" STREQUAL "") + MESSAGE(FATAL_ERROR "SWH could not be patched\n${PATCH_ERROR}") +ENDIF() + +# Create blank config.h +FILE(WRITE swh/config.h "") + +# Precompiler PIC Macro +IF(LMMS_BUILD_WIN32) + SET(PIC_FLAGS "") +ELSE() + SET(PIC_FLAGS "-fPIC -DPIC") +ENDIF() + +# Additional link flags +IF(LMMS_BUILD_WIN32 AND MINGW_PREFIX) + SET(LINK_FLAGS "${LINK_FLAGS} -shared -Wl,-no-undefined -Wl,-Bsymbolic -lm") +ELSEIF(LMMS_BUILD_APPLE) + SET(LINK_FLAGS "${LINK_FLAGS} -Bsymbolic -lm") +ENDIF() + +# Additional compile flags +SET(COMPILE_FLAGS "${COMPILE_FLAGS} -O3 -Wall") +SET(COMPILE_FLAGS "${COMPILE_FLAGS} -fomit-frame-pointer -fstrength-reduce -funroll-loops -ffast-math -c -fno-strict-aliasing") +SET(COMPILE_FLAGS "${COMPILE_FLAGS} ${PIC_FLAGS}") + +# Loop over every XML file +FILE(GLOB XML_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/swh/*.xml") +LIST(SORT XML_SOURCES) +FOREACH(_item ${XML_SOURCES}) + # Get library name and (soon to be) C file + GET_FILENAME_COMPONENT(_plugin "${_item}" NAME_WE) + SET(_out_file "${CMAKE_CURRENT_SOURCE_DIR}/swh/${_plugin}.c") + + # Coerce XML source file to C + ADD_CUSTOM_COMMAND( + OUTPUT "${_out_file}" + COMMAND ./makestub.pl "${_item}" > "${_out_file}" + DEPENDS "${_item}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/swh" + VERBATIM + ) + + # Add a library target for this C file, which depends on success of makestup.pl + ADD_LIBRARY("${_plugin}" MODULE "${_out_file}") + + # Vocoder does not use fftw + IF(NOT ("${_plugin}" STREQUAL "vocoder_1337")) + TARGET_LINK_LIBRARIES("${_plugin}" -lfftw3f) + ENDIF() + + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES PREFIX "") + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS}") + SET_TARGET_PROPERTIES("${_plugin}" PROPERTIES LINK_FLAGS "${LINK_FLAGS}") + INSTALL(TARGETS "${_plugin}" LIBRARY DESTINATION "${PLUGIN_DIR}/ladspa") +ENDFOREACH() + +ADD_DEFINITIONS(-DFFTW3) +INCLUDE_DIRECTORIES( + "${CMAKE_SOURCE_DIR}/include" + "${CMAKE_CURRENT_SOURCE_DIR}/swh" + ${FFTW3F_INCLUDE_DIRS} + "${CMAKE_BINARY_DIR}" +) +LINK_DIRECTORIES(${FFTW3F_LIBRARY_DIRS}) + +ADD_LIBRARY(iir STATIC swh/util/iir.c) +SET_TARGET_PROPERTIES(iir PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(bandpass_a_iir_1893 iir) +TARGET_LINK_LIBRARIES(bandpass_iir_1892 iir) +TARGET_LINK_LIBRARIES(butterworth_1902 iir) +TARGET_LINK_LIBRARIES(highpass_iir_1890 iir) +TARGET_LINK_LIBRARIES(lowpass_iir_1891 iir) +TARGET_LINK_LIBRARIES(notch_iir_1894 iir) + +FILE(GLOB GSM_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/swh/gsm/*.c") +LIST(SORT GSM_SOURCES) +ADD_LIBRARY(gsm STATIC ${GSM_SOURCES}) +SET_TARGET_PROPERTIES(gsm PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(gsm_1215 gsm) + +ADD_LIBRARY(gverb STATIC swh/gverb/gverb.c swh/gverb/gverbdsp.c) +SET_TARGET_PROPERTIES(gverb PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(gverb_1216 gverb) + +ADD_LIBRARY(blo STATIC swh/util/blo.c) +SET_TARGET_PROPERTIES(blo PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(analogue_osc_1416 blo) +TARGET_LINK_LIBRARIES(fm_osc_1415 blo) +TARGET_LINK_LIBRARIES(hermes_filter_1200 blo) + +ADD_LIBRARY(rms STATIC swh/util/rms.c) +ADD_LIBRARY(db STATIC swh/util/db.c) +SET_TARGET_PROPERTIES(rms PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +SET_TARGET_PROPERTIES(db PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(sc1_1425 rms db) +TARGET_LINK_LIBRARIES(sc2_1426 rms db) +TARGET_LINK_LIBRARIES(sc3_1427 rms db) +TARGET_LINK_LIBRARIES(sc4_1882 rms db) +TARGET_LINK_LIBRARIES(sc4m_1916 rms db) +TARGET_LINK_LIBRARIES(se4_1883 rms db) + +ADD_LIBRARY(pitchscale STATIC swh/util/pitchscale.c) +SET_TARGET_PROPERTIES(pitchscale PROPERTIES COMPILE_FLAGS "${PIC_FLAGS}") +TARGET_LINK_LIBRARIES(pitchscale -lfftw3f) +TARGET_LINK_LIBRARIES(pitch_scale_1193 pitchscale) +TARGET_LINK_LIBRARIES(pitch_scale_1194 pitchscale) diff --git a/plugins/LadspaEffect/swh/blo.c.patch b/plugins/LadspaEffect/swh/blo.c.patch new file mode 100644 index 00000000000..c8681e03a20 --- /dev/null +++ b/plugins/LadspaEffect/swh/blo.c.patch @@ -0,0 +1,74 @@ +--- a/plugins/LadspaEffect/swh/swh/util/blo.c ++++ b/plugins/LadspaEffect/swh/swh/util/blo.c +@@ -20,7 +20,9 @@ + #include + #include + #include ++#ifndef _WIN32 + #include ++#endif + + #include "blo.h" + +@@ -42,10 +44,13 @@ blo_h_tables *blo_h_tables_new(int table_size) + float table_size_f = table_size; + float max; + unsigned int table_count = 0; +- unsigned int i, h; ++ int i; ++ unsigned int h; + size_t all_tables_size = sizeof(float) * (table_size + BLO_TABLE_WR) + * (BLO_N_HARMONICS - 1) * 2; ++#ifndef _WIN32 + int shm_fd; ++#endif + char shm_path[128]; + + this = malloc(sizeof(blo_h_tables)); +@@ -56,6 +61,7 @@ blo_h_tables *blo_h_tables_new(int table_size) + + snprintf(shm_path, 128, "/blo-1-%dx%dx%d.tbl", BLO_N_WAVES, + BLO_N_HARMONICS, table_size + BLO_TABLE_WR); ++#ifndef _WIN32 + if ((shm_fd = shm_open(shm_path, O_RDONLY, 0)) > 0) { + /* There is an existing SHM segment that matches what we want */ + +@@ -119,12 +125,15 @@ blo_h_tables *blo_h_tables_new(int table_size) + return this; + } else if ((shm_fd = shm_open(shm_path, O_CREAT | O_RDWR, 0644)) > 0) { + /* There is no existing SHM segment, but we can make one */ +- ftruncate(shm_fd, all_tables_size); ++ int err = ftruncate(shm_fd, all_tables_size); + +- all_tables = mmap(0, all_tables_size, PROT_READ | PROT_WRITE, +- MAP_SHARED, shm_fd, 0); ++ if (!err) { ++ all_tables = mmap(0, all_tables_size, PROT_READ | PROT_WRITE, ++ MAP_SHARED, shm_fd, 0); ++ } + close(shm_fd); + } ++#endif + + /* Fallback case, can't map a SHM segment, just malloc it and suffer */ + if (!all_tables) { +@@ -224,7 +233,9 @@ blo_h_tables *blo_h_tables_new(int table_size) + } + } + ++#ifndef _WIN32 + msync(all_tables, all_tables_size, MS_ASYNC); ++#endif + + return this; + } +@@ -232,7 +243,9 @@ blo_h_tables *blo_h_tables_new(int table_size) + void blo_h_tables_free(blo_h_tables *tables) + { + if (tables->store_type == BLO_MMAP) { ++#ifndef _WIN32 + munmap(tables->alloc_space, tables->alloc_size); ++#endif + } else { + free(tables->alloc_space); + } diff --git a/plugins/LadspaEffect/swh/swh b/plugins/LadspaEffect/swh/swh index 485075eaf43..5edf95cade7 160000 --- a/plugins/LadspaEffect/swh/swh +++ b/plugins/LadspaEffect/swh/swh @@ -1 +1 @@ -Subproject commit 485075eaf43141376180590b74b5a95ee5b46ba9 +Subproject commit 5edf95cade738380d2895fc2ca42acfd3e153860